我正在编写一个具有的bash脚本set -u
,并且我有一个空数组扩展问题:bash似乎在扩展过程中将空数组视为未设置的变量:
$ set -u
$ arr=()
$ echo "foo: '${arr[@]}'"
bash: arr[@]: unbound variable
(declare -a arr
也无济于事。)
对此的一种常见解决方案是使用${arr[@]-}
,从而用一个空字符串代替(“未定义”)空数组。但是,这不是一个好的解决方案,因为现在您无法区分其中有一个空字符串的数组和一个空数组。(@ -expansion在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
更新:bugs
由于ikegami的解释,删除了标签。
"${arr[@]}"
。我想念什么吗?据我所知,它至少在中有效5.x
。