gpt4 book ai didi

bash - 设置 nullglob 时关联数组未取消设置

转载 作者:行者123 更新时间:2023-11-29 09:49:58 26 4
gpt4 key购买 nike

当我在 bash 中设置 nullglob 时:

shopt -s nullglob

然后声明一个关联数组:

declare -A arr=( [x]=y )

我无法取消设置数组中的特定键:

unset arr[x]
echo ${#arr[@]} # still 1

但是,取消设置 nullglob 会使这个操作像我预期的那样工作:

shopt -u nullglob
unset arr[x]
echo ${#arr[@]} # now it's 0; x has been removed

这是怎么回事?我看不出 shell globbing 与这种情况有何关系。我已经在 bash 4.4.19 和 5.0.0 上测试过了。

最佳答案

这可以通过引用 bash 文档(man 页面)来解释,这里解释如下:

After word splitting, unless the -f option has been set, Bash scans each word for the characters '*', '?', and '['. If one of these characters appears, then the word is regarded as a pattern, and replaced with an alphabetically sorted list of filenames matching the pattern.

If no matching filenames are found, and the shell option nullglob is disabled, the word is left unchanged. If the nullglob option is set, and no matches are found, the word is removed.

换句话说,nullglob 会影响您的 arr[x] 参数会发生什么。它要么被单独留下,要么被移除。

您可以通过使用 set -x 打开 echo-before-execute 标志来看到此效果:

pax$ declare -A arr=( [x]=y )
pax$ shopt -s nullglob
pax$ set -x
pax$ unset arr[x]
+ unset

请注意,这是“单词被删除”的情况。 “单词保持不变”的情况如下所示:

pax$ shopt -u nullglob
+ shopt -u nullglob
pax$ unset arr[x]
+ unset 'arr[x]'

如果启用了 nullglob,上面最后的回显命令还提供了有关如何删除条目的线索。只需引用参数以防止扩展:

unset 'arr[x]'

无论 nullglob 设置如何,这都会起作用,因为文档中有关引用的部分:

Enclosing characters in single quotes preserves the literal value of each character within the quotes.

关于bash - 设置 nullglob 时关联数组未取消设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54454246/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com