我有一个数组,当我的脚本运行时,它会填充不同的错误消息。
我需要一种方法来检查脚本末尾是否为空,如果是则采取特定的操作。
我已经尝试将其视为普通 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。(元素数组n
有n-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=()
-它仍然只是一个空字符串。