检查Bash中的数组是否为空

我有一个数组,充满了不同的错误消息,因为我的脚本运行。

我需要一种方法来检查脚本是否为空,如果是,请采取特定的操作。

我已经试过把它当作正常的VAR来处理,并使用-z来检查它,但这似乎不起作用。 有没有办法来检查数组是否为空或不在Bash?

谢谢

  • 使用bash读取文件的第一行
  • 如何从包含variables的文件读取数据
  • 通过将terminal添加到PATH中,从terminal运行命令或脚本,我在做什么错误?
  • 如何用bash检查一个环境variables的有效性,如果它存在并且是真的?
  • 这个shell命令中的“ - ”(double dash)是什么意思?
  • 通过bashpipe道处理大文件,它缓冲吗?
  • 5 Solutions collect form web for “检查Bash中的数组是否为空”

    假设你的数组是$errors ,只需检查元素的数量是否为零。

     if [ ${#errors[@]} -eq 0 ]; then echo "No errors, hooray" else echo "Oops, something went wrong..." fi 

    你也可以把数组看作一个简单的variables。 就这样,只是使用

     if [ -z "$array" ]; then echo "Array empty" else echo "Array non empty" fi 

    或使用另一边

     if [ -n "$array" ]; then echo "Array non empty" else echo "Array empty" fi 

    这个解决scheme的问题是,如果一个数组是这样声明的: array=('' foo) 。 这些检查将报告数组为空,而显然不是。 (谢谢@musiphil!)

    使用[ -z "$array[@]" ]显然不是一个解决scheme。 不指定大括号试图将$array解释为一个string( [@]在这种情况下是一个简单的文字string),因此总是被报告为false:“是文字string[@]空吗? 显然不是。

    我检查了它与bash-4.4.0

     #!/usr/bin/env bash set -eu check() { if [[ ${array[@]} ]]; then echo not empty else echo empty fi } check # empty array=(abcd) check # not empty array=() check # empty 

    bash-4.1.5

     #!/usr/bin/env bash set -eu check() { if [[ ${array[@]:+${array[@]}} ]]; then echo non-empty else echo empty fi } check # empty array=(abcd) check # not empty array=() check # empty 

    在后一种情况下,您需要以下结构:

     ${array[@]:+${array[@]}} 

    因为它不会在空或未设置的arrays上失败。 那就是,如果你像我平时那样set -eu 。 这提供了更严格的错误检查。 从文档 :

    -e

    如果可能由单个简单命令(请参阅简单命令),列表(请参阅列表)或复合命令(请参阅复合命令)组成的pipe道(请参阅pipe道)返回非零状态,请立即退出。 如果失败的命令是命令列表的一部分,那么shell将不会立即退出,直到关键字,if语句中的testing的一部分,以及在&&或||中执行的任何命令的一部分。 除了最后的&&或||之后的命令,pipe道中的最后一个命令,或者命令的返回状态与! 如果复合命令以外的子shell返回非零状态,因为命令失败,而-e被忽略,shell不会退出。 如果设置了ERR,则会在shell退出之前执行陷阱。

    此选项单独应用于shell环境和每个子shell环境(请参阅命令执行环境),并且在执行子shell中的所有命令之前可能会导致子shell退出。

    如果复合命令或shell函数在忽略-e的上下文中执行,则复合命令或函数体内执行的任何命令都不会受到-e设置的影响,即使-e已设置且命令返回失败状态。 如果复合命令或shell函数在-e被忽略的上下文中执行时设置-e,那么在复合命令或包含函数调用的命令完成之前,该设置将不起作用。

    -u

    在执行参数扩展时,请将除特殊参数“@”或“*”以外的variables和参数作为error handling。 一条错误消息将被写入标准错误,一个非交互式shell将退出。

    如果你不需要,可以省略:+${array[@]}部分。

    另外请注意,使用[[ operator在这里, [你得到:

     $ cat 1.sh #!/usr/bin/env bash set -eu array=(abcd) if [ "${array[@]}" ]; then echo non-empty else echo empty fi $ ./1.sh _/1.sh: line 4: [: too many arguments empty 

    就我而言, 第二个答案是不够的,因为可能有空格。 我跟着来了

     if [ "$(echo -ne ${opts} | wc -m)" -eq 0 ]; then echo "No options" else echo "Options found" fi 

    我更喜欢使用双括号:

     if [[ !${array[@]} ]] then echo "Array is empty" else echo "Array is not empty" fi 

    双括号: https : //stackoverflow.com/questions/669452/is-preferable-over-in-bash

    服务器问题集锦,包括 Linux(Ubuntu, Centos,Debian等)和Windows Server服务器.