如何在Bash中取消设置数组?

3

在bash shell中,变量的使用方法如下:

#!/bin/bash
set -o nounset

my_var=aaa
unset var
echo "$var"

因为set命令的定义是如果变量未设置,则返回错误,所以最后一行返回错误:

第六行:var: 未设置变量

好的,这正是我想要的。

现在同样的事情发生在数组中:

#!/bin/bash
set -o nounset

my_array=(aaa bbb)
unset my_array
echo "${my_array[@]}"

但出乎意料的是,最后一行并没有返回错误。我希望bash脚本在数组未定义时能返回错误。
1个回答

2

${my_array[@]}类似于$@,后者被文档记录为被nounset忽略的内容:

-u 当执行参数扩展时,对于特殊参数"@"和"*"之外的未设置变量和参数,将其视为错误。如果尝试在未设置的变量或参数上进行扩展,则shell会打印错误消息,并且如果不是交互式的,则以非零状态退出。

但是,返回数组大小并没有被忽略。请在前面添加以下行以确保数组未设置为未设置:

: ${#my_array[@]}

这似乎与观察到的行为一致,但${my_array[@]}形式具有这种属性的文档在哪里记录? - John Bollinger
1
在Bash 4.4之前,当数组被定义为空且设置了nounset时,"${my_array[@]}"会产生错误。那是一个bug。看起来他们在修复空数组问题时过度补偿了。我认为新的行为是一个bug。这个bug并不是很严重,因为nounset检查中有几个漏洞。 - pjh
在命令之前,“冒号”代表什么意思? - folow
1
冒号是一个内置命令,它不执行任何操作,请参阅 man bash - choroba
这类似于: true ${#my_array[@]} 但是“:”是shell内置的,而“true”是单独的程序。 - folow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接