bash - 关联数组的键 ${!a[@]} 和值 ${a[@]} 是否以相同的顺序展开?
问题描述
在 bash 中,关联数组(也称为字典或哈希映射)是无序的。对于关联数组a
,我们可以列出所有带有 的键(也称为索引)和带有 的${!a[@]}
所有值${a[@]}
。我知道这些构造不会以固定的顺序扩展。我想知道是否至少有一些保证。我找不到任何东西。[ "${a[*]}" = ${a[*]} ]
但是,在任何实施中都会失败似乎是不现实的。同样,它似乎${!a[@]}
以与 相同的顺序展开${a[@]}
。如果我们x
在位置n找到键,${!a[@]}
那么我们也会在${a[x]}
位置n${a[@]}
找到值。当然,我们假设和a
的展开之间没有修改。${!a[@]}
${a[@]}
例子:
declare -A a=([x]=1 [y]=2 [z]=3)
printf %s\\n "${!a[*]}" "${a[*]}"
# As output I would expect one of the following blocks ...
# (corresponding keys and values are in the same column)
x y z x z y y x z y z x z x y z y x
1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1
# ... but never something like ...
# (at least one key doesn't share a column with its value)
x y z x y z y x z
1 3 2 2 3 1 2 3 1 ...
问题
- 对于任何现有的 bash 版本和关联数组
a
,是否可以以使键${!a[@]}
及其${a[@]}
对应值具有不同顺序的方式进行扩展?换句话说:
# Are there values for a and i
# such that this script could print "different order"
declare -A a=(...)
declare -i i=...
keys=("${!a[@]}")
values=("${a[@]}")
[ "${a[keys[i]]}" != "${values[i]}" ] && echo "different order"
奖金问题
- bash的手册或其他官方文档中的扩展命令和扩展命令是否有任何保证?
${!a[*]}
${a[@]}
- 我们可以从实现本身假设进一步/其他保证吗?这些保证中的一些是否会随着 bash 的不同版本而改变?在即将发布的 bash 版本中,其中一些保证是否可能会发生变化?
解决方案
我在 bash 联机帮助页中没有看到任何提及关联数组的键顺序(我使用的是 4.3.48)。hashlib.c
查看bash 5.0 的源代码(, 珀尔。
话虽如此,依赖特定的键顺序或顺序不变仍然是不明智的,正如 Perl 领域的经验告诉我们的那样。此外,由于 bash 手册页没有说明订购,因此无法保证。哈希实现可以随时替换或重写。
推荐阅读
- firebase - Firebase Firestore REST API 是否支持流式传输
- django - 如果对象包含文件和其他数据,如何使用 Django DRF 发布对象数组?
- python - 为熊猫中的单个值创建单独的列
- sql - 根据 Bigquery 计划查询中的日期动态更改 FROM 表名
- reactjs - 在 React Hooks 中输入文本时,antd Select Option 不呈现
- blazor-webassembly - Blazor WASM TargetFrameworks 网络标准 2.1 和 net5.0
- javascript - 单击按钮时切换脚本执行
- android - 无法加载 github.com 的信息
- assembly - 二叉搜索树插入程序集 x86
- css - @media 查询中的 CSS 字体大小在旋转后不会变回