在 Bash 中检查数组是否为空

在 Bash 中检查数组是否为空

我有一个数组,当我的脚本运行时,它会填充不同的错误消息。

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

我已经尝试将其视为普通 VAR 并使用 -z 进行检查,但似乎不起作用。有没有办法在 Bash 中检查数组是否为空?

答案1

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

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

答案2

在这种情况下,我通常使用算术扩展:

if (( ${#a[@]} )); then
    echo not empty
fi

答案3

你也可以将数组视为一个简单的变量。这样,只需使用

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

该解决方案的问题是,如果数组声明如下:array=('' foo)。这些检查将报告该数组为空,但显然不是。(感谢@musiphil!)

使用[ -z "$array[@]" ]显然也不是解决方案。不指定花括号会尝试将其解释$array为字符串([@]在这种情况下是一个简单的文字字符串),因此始终报告为 false:“文字字符串是[@]空的吗?”显然不是。

答案4

如果你想检测一个空数组元素, 喜欢arr=("" "")为空,与arr=()

您可以将所有元素粘贴在一起,并检查结果是否为零长度。(如果数组可能非常大,则构建数组内容的扁平副本对于性能来说并不理想。但希望您没有将 bash 用于这样的程序...)

"${arr[*]}"会扩展元素,元素之间以 的第一个字符分隔IFS。因此,您需要保存/恢复 IFS 并执行IFS=''此操作才能使其工作,否则请检查字符串长度 == 数组元素数 - 1。(元素数组nn-1分隔符)。要处理这种偏差,最简单的方法是用 1 填充连接

arr=("" "")

## Assuming default non-empty IFS
## TODO: also check for ${#arr[@]} -eq 0
concat="${arr[*]} "      # n-1 separators + 1 space + array elements
[[ "${#concat}" -ne "${#arr[@]}" ]]  && echo not empty array || echo empty array

测试用例set -x

### a non-empty element
$ arr=("" "x")
  + arr=("" "x")
$ concat="${arr[*]} ";  [[ "${#concat}" -ne "${#arr[@]}" ]] && echo not empty array || echo empty array
  + concat=' x '
  + [[ 3 -ne 2 ]]
  + echo not empty array
not empty array

### 2 empty elements
$ arr=("" "")
  + arr=("" "")
$ concat="${arr[*]} ";  [[ "${#concat}" -ne "${#arr[@]}" ]] && echo not empty array || echo empty array
  + concat='  '
  + [[ 2 -ne 2 ]]
  + echo empty array
empty array

不幸的是,这个方法失败了arr=()[[ 1 -ne 0 ]] 因此您需要先单独检查数组是否真的为空。


或者IFS=''. 可能您想保存/恢复 IFS,而不是使用子 shell,因为您无法轻松地从子 shell 中获取结果。

# inside a () subshell so we don't modify our own IFS
(IFS='' ; [[ -n "${arr[*]}" ]] && echo not empty array || echo empty array)

例子:

$ arr=("" "")
$ (IFS='' ; [[ -n "${arr[*]}" ]] && echo not empty array || echo empty array)
   + IFS=
   + [[ -n '' ]]
   + echo empty array
empty array

处理arr=()-它仍然只是一个空字符串。

相关内容