加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 16:20:58 所属栏目:安全 来源:网络整理
导读:我编写一个bash脚本,它设置了-u,我有一个空数组扩展的问题:bash出现在扩展期间将一个空数组作为未设置的变量: $ set -u$ arr=()$ echo "foo: '${arr[@]}'"bash: arr[@]: unbound variable (declare -a arr也没有帮助。) 一个常见的解决方案是改用$ {arr
我编写一个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测试

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读