【发布时间】:2011-09-28 00:22:35
【问题描述】:
我正在编写一个包含 set -u 的 bash 脚本,但我遇到了空数组扩展的问题: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
更新:由于ikegami的解释,删除了bugs标签。
【问题讨论】:
标签: bash