在bash中,关联数组(也称为字典或哈希图)是无序的。对于关联数组a
,我们可以使用${!a[@]}
列出所有键(也称为索引),并使用${a[@]}
列出所有值。我知道这些结构不会按固定顺序扩展。我想知道是否至少有 some 个保证。我找不到。但是,[ "${a[*]}" = ${a[*]} ]
在任何实现中都会失败是不现实的。同样,似乎${!a[@]}
的扩展顺序与${a[@]}
相同。如果在x
的位置 n 处找到键${!a[@]}
,则将在{{1}的位置 n 处找到值${a[x]}
}。当然,我们假设${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 ...
,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"
和${!a[*]}
的扩展订单上是否有任何担保 ?或其他一些官方文件?答案 0 :(得分:1)
在bash联机帮助页中,我没有看到任何有关关联数组的键排序的信息(我使用的是4.3.48)。查看bash 5.0(hashlib.c
)的源代码还表明,bash使用最简单的基于XOR哈希的算法,没有任何随机化,因此不应该在进程或机器之间随机化顺序,这与您使用的其他一些更复杂的算法不同d找到Perl。
话虽如此,但依赖于特定的键顺序或恒定的顺序仍然是不明智的,因为Perl-land的经验告诉我们。而且,由于bash联机帮助页中没有说明订购,因此无法保证。哈希实现可以随时替换或重写。