使用`set -u’命令将空数组扩展

我编写一个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

更新:删除由于ikegami的解释的错误标记

首先,它不是一个错误

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测试

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...