我正在编写一个 bash 脚本,其中包含 set -u
,并且我遇到了一个空数组展开的问题: bash 在展开过程中似乎将一个空数组作为一个未设置的变量:
$ set -u
$ arr=()
$ echo "foo: '${arr[@]}'"
bash: arr[@]: unbound variable
(declare -a arr
也没有帮助。)
一个常见的解决方案是使用 ${arr[@]-}
代替,因此用空字符串代替(“未定义”)空数组。然而,这不是一个好的解决方案,因为现在您无法区分一个包含单个空字符串的数组和一个空数组。(在 bash 中,@扩展是特殊的,它将 "${arr[@]}"
扩展为 "${arr[0]}" "${arr[1]}" …
,这使它成为构建命令行的完美工具。)
$ countArgs() { echo $#; }
$ countArgs a b c
3
$ countArgs
0
$ countArgs ""
1
$ brr=("")
$ countArgs "${brr[@]}"
1
$ countArgs "${arr[@]-}"
1
$ countArgs "${arr[@]}"
bash: arr[@]: unbound variable
$ set +u
$ countArgs "${arr[@]}"
0
那么,除了检查 if
中数组的长度(参见下面的代码示例) ,或者关闭该短片的 -u
设置之外,还有其他解决这个问题的方法吗?
if [ "${#arr[@]}" = 0 ]; then
veryLongCommandLine
else
veryLongCommandLine "${arr[@]}"
fi
更新: 由于 ikegami 的解释删除了 bugs
标签。