我编写一个bash脚本,它设置了-u,我有一个空数组扩展的问题:bash出现在扩展期间将一个空数组作为未设置的变量:
$ set -u $ arr=() $ echo "foo: '${arr[@]}'" bash: arr[@]: unbound variable
(declare -a arr也没有帮助。)
一个常见的解决方案是改用$ {arr [@] – },从而替换空字符串而不是(“undefined”)空数组。然而这不是一个好的解决方案,因为现在你不能辨别一个数组与其中的一个空字符串和一个空数组。 (@ -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
首先,它不是一个错误。
An array variable is considered set if a subscript has been assigned a value. The null string is a valid value.
没有为下标分配值,因此未设置数组。
有一个条件,你可以使用inline来实现你想要的:使用$ {arr [@]“$ {arr [@]}”},而不是“$ {arr [@]}”。
$ function args { perl -E'say 0+@ARGV; say "$_: $ARGV[$_]" for 0..$#ARGV' -- "$@" ; } $ set -u $ arr=() $ args "${arr[@]}" -bash: arr[@]: unbound variable $ args ${arr[@]+"${arr[@]}"} 0 $ arr=("") $ args ${arr[@]+"${arr[@]}"} 1 0: $ arr=(a b c) $ args ${arr[@]+"${arr[@]}"} 3 0: a 1: b 2: c
用bash 4.2.25和4.3.11测试