Arrays bash中的有序关联数组

Arrays bash中的有序关联数组,arrays,bash,Arrays,Bash,我可以在bash中执行以下操作: declare -A data data[A]="aaa" data[C]="ccc" data[B]="bbb" for i in "${!data[@]}" ; do printf "%-20s ---> %s\n" "$i" "${data[$i]}" done 哪些产出: A ---> aaa B ---> bbb C

我可以在
bash
中执行以下操作:

declare -A data
data[A]="aaa"
data[C]="ccc"
data[B]="bbb"

for i in "${!data[@]}" ; do
    printf "%-20s ---> %s\n" "$i" "${data[$i]}"
done
哪些产出:

A                    ---> aaa
B                    ---> bbb
C                    ---> ccc
也就是说,关联数组被重新排序(我假设对键使用字典排序,但我不确定),并丢失了创建数据的原始顺序。我想要的是:

A                    ---> aaa
C                    ---> ccc
B                    ---> bbb

python
中,我将使用
orderedict
而不是普通的
dict
。bash中是否有类似的概念?

bash中没有定义关联数组的顺序。因此,脚本输出的顺序将是不可预测的。如果您想在数组中存储更多信息,我建议创建另一个使用相同键的并行关联数组。

如前所述,关联数组没有顺序。如果您想在该数组中排序,请使用下面的解决方法

declare -A data
data_indices=()
data[A]="aaa"; data_indices+=(A)
data[C]="ccc"; data_indices+=(C)
data[B]="bbb"; data_indices+=(B)

for i in "${data_indices[@]}" ; do
    printf "%-20s ---> %s\n" "$i" "${data[$i]}"
done

谢谢。有趣的黑客。遗憾的是bash不允许更优雅的构造。为什么要遗憾呢?关联数组在任何语言中都不需要排序。担心
bash
中缺少可用的数据结构肯定表明您的程序不应该再使用
bash
编写。它是一种用于运行其他程序的粘合语言,而不是数据处理语言。@anishsane:随便你怎么称呼它,有序字典很有用。正如我刚刚了解到的,bash没有它们,这很遗憾。@chepner:我有一个非常简单的脚本:我使用关联数组将命令名映射到脚本函数。这只是一种菜单。而且效果很好。但由于缺少有序关联数组,帮助(关联数组的转储)完全是无序的,这一直让我感到困惑。我可以在python中实现这一点,但我只需要对所有命令执行
subprocess.call
,这在bash中实现起来更简单、更干净。总之,这些命令只是运行系统工具。因此,这是一个简单的有序关联数组会有所帮助的用例。