arrays - 为什么 `nounset` shell 选项不会在未设置的数组上引发错误?
问题描述
为什么设置时没有引发错误unset
,并且引用了未定义的数组?
我错过了什么,例如这是由另一个选项控制的吗?
例子:
set -o nounset
echo "${foo[*]}" # no error
echo "${foo[@]}" # no error
echo "$foo" # error
我检查了 manpage,但我很困惑,因为它提到了$@
and $*
,但没有提到数组:
将未设置的变量和特殊参数“@”或“*”以外的参数视为错误
我使用的 Bash 版本是 5.0。
解决方案
我相信这只是文档的一个缺点;它应该提到数组参数索引@
和*
以及。
目的是让它看起来像一个可以“设置”为空值的数组。然而,
foo=()
实际上并没有为 name 分配一个空数组值foo
。它只是在name 上设置数组属性foo
,并清除任何可能已经存在的值。$foo
和${foo[0]}
是等价的,两者都将被视为未设置的参数。就所涉及的而言,每个${foo[@]}
和${foo[@]}
都是特殊的“设置”,但“空” -u
。
但请注意,实际上并不需要为@
/*
索引设置数组属性来覆盖-u
。
$ unset bar
$ set -o nounset
$ echo ${bar[@]}
$
推荐阅读
- sql - sql查询对结果进行分组和过滤
- prisma - prisma - 运行 graphql 查询时获取环境变量未找到错误消息
- python - 部署后烧瓶/python应用程序的Heroku H13错误
- javascript - ReferenceError:未定义 url
- python - 列表中的python正则表达式组字符串
- android - Android:在 Kotlin 中使用 ExifInterface 获取图像的地址
- html - 固定位置社交链接导致文本链接变得不可点击
- python - 使用可变数量的参数评估数学表达式
- javascript - 返回特定字符数组长度的函数 (Javascript)
- javascript - 当我单击发送按钮并且检查警报删除正常字段时出现问题