【发布时间】:2020-06-09 07:09:38
【问题描述】:
我正在创建关联数组以在 for 循环中进行处理,但我在索引顺序上得到了一些奇怪的结果。请看一下这个示例脚本:
#!/bin/bash
declare -A test1=(
[d]=1w45
[e]=2dfg
[m]=3df
[o]=4df
)
declare -A test2=(
[d1]=1w45
[e2]=2dfg
[m3]=3df
[o4]=4df
)
declare -A test3=(
[1d]=1w45
[2e]=2dfg
[3m]=3df
[4o]=4df
)
echo ${!test1[@]}
echo ${!test2[@]}
echo ${!test3[@]}
输出将是
$ ./test
d e m o
o4 m3 e2 d1
3m 4o 1d 2e
为什么项目的顺序会改变?以及如何绕过这种行为?提前致谢!
【问题讨论】:
-
这就是关联数组的工作方式。如果您需要有序键,请将有序键存储在数组中。
-
顺序由键的哈希值决定;如果你不知道散列函数(你也没有必要知道),你就无法真正预测这个顺序是什么。
-
您使用的是哪个 bash 版本?我无法复制
3m 4o 1d 2e,我总是得到1d 3m 2e 4o。 -
这根本不是 bash 特定的。大多数散列或映射类型都以这种方式运行;例如,最近 Python 将其 dict 类型更改为具有明确的顺序,而 Go 故意将其随机化以避免利用故意低效的分桶进行拒绝服务攻击。
标签: arrays bash associative-array