Bash 从索引数组提取索引:保证有序?

Bash 从索引数组提取索引:保证有序?,bash,Bash,我知道对于关联数组,数组键没有固有的顺序: declare -A map=([a]=b [c]=d [e]=f) echo "${!map[@]}" # => e c a (perhaps) 但是索引数组呢 试一试: declare -a list for i in {1..1000}; do list[RANDOM]=1; done echo "${!list[@]}" 看来指数是按数字顺序排列的。但是我可以相信吗?确切的证据(如前所述)将是查阅来源(这可能仍然会因版本而异),因

我知道对于关联数组,数组键没有固有的顺序:

declare -A map=([a]=b [c]=d [e]=f)
echo "${!map[@]}"   # => e c a (perhaps)
但是索引数组呢

试一试:

declare -a list
for i in {1..1000}; do list[RANDOM]=1; done
echo "${!list[@]}"
看来指数是按数字顺序排列的。但是我可以相信吗?

确切的证据(如前所述)将是查阅来源(这可能仍然会因版本而异),因为在查看了它之后,它没有提到
${!name[@]}
/
${!name[*]}
${name[@]}
/
${name[*]}
。但是,特别是具有
name=(value1 value2…)
赋值基本算法的位,以及负索引的处理和这一事实:

$ a=(1 2); a[8]=9; a[5]=6
$ indices=("${!a[@]}"); for i in "${indices[@]}"; do neg_i="$((-1 -${indices[-1]} + i))"; echo -e "a[$i]: ${a[$i]}\t\ta[$neg_i]: ${a[$neg_i]}" ; done
a[0]: 1         a[-9]: 1
a[1]: 2         a[-8]: 2
a[5]: 6         a[-4]: 6
a[8]: 9         a[-1]: 9
显示索引数组的索引必须通过考虑其数值来使用,以便从任意方向进行索引。这仍然可以在不需要数字排序的情况下实现(更不用说显示/展开)

稳定排序也将与数组/列表(bash术语中的索引数组)排序的其他语言保持一致,而映射对象/字典(关联数组)不一定如此,因此相反的选择可能会令人惊讶并导致错误。换言之,我认为偏离这种行为不太可能是一个公正的决定


这两种方法都是间接推理,而不是确定的证据。

我花了一些时间阅读了这篇文章。索引数组实现为双链表

插入新数组元素(
ari[i]=value
)将遍历列表并插入元素,以便索引保持数字排序:

提取索引(
${!ary[@]}
)将列表从头部(具有最大索引的元素)移回尾部(最小索引),并构建索引列表:


因此,就目前实施的情况而言,我相信索引列表确实是有序的。

您能否澄清,您是否希望在特定的bash版本(即,可以通过检查bash的源代码来证明)或任意的未来版本(即,应该通过设计/可以通过文档证明)中能够依赖此功能?当您将{1..10}中的i的循环更改为
时;执行回显“${!list[@]}”;列表[随机]=1;完成
您会得出这样的结论:是的——似乎做了一些努力来对其进行数字排序。“它是否可靠…?@aaron,不管怎样,我的直觉是,对于数字索引数组,答案是肯定的,但维护人员Chet Ramey应在帮助下提供权威答案。”-bash@gnu.org.