首页 > 解决方案 > 为什么 `nounset` shell 选项不会在未设置的数组上引发错误?

问题描述

为什么设置时没有引发错误unset,并且引用了未定义的数组?

我错过了什么,例如这是由另一个选项控制的吗?

例子:

set -o nounset

echo "${foo[*]}" # no error
echo "${foo[@]}" # no error

echo "$foo" # error

我检查了 manpage,但我很困惑,因为它提到了$@and $*,但没有提到数组:

将未设置的变量和特殊参数“@”或“*”以外的参数视为错误

我使用的 Bash 版本是 5.0。

标签: arrayslinuxbashshell

解决方案


我相信这只是文档的一个缺点;它应该提到数组参数索引@*以及。

目的是让它看起来像一个可以“设置”为空值的数组。然而,

foo=()

实际上并没有为 name 分配一个空数组值foo它只是在name 上设置数组属性foo,并清除任何可能已经存在的值。$foo${foo[0]}是等价的,两者都将被视为未设置的参数。就所涉及的而言,每个${foo[@]}${foo[@]}都是特殊的“设置”,但“空” -u

但请注意,实际上并不需要为@/*索引设置数组属性来覆盖-u

$ unset bar
$ set -o nounset
$ echo ${bar[@]}

$

推荐阅读