按 bash 中的插入映射排序

Ali*_*aka 3 bash array shell-script associative-array

bash 中是否有有序(通过插入)映射?

我知道bash 中有一个关联数组数据结构,但是在对其进行迭代时,元素的顺序不是插入顺序。下面举例。

我想按插入顺序排列地图。

关联数组不保留插入顺序:

declare -A REPLACE_MAP
REPLACE_MAP['b']='2'
REPLACE_MAP['a']='1'
for key in "${!REPLACE_MAP[@]}"; do
    echo "$key - ${REPLACE_MAP["$key"]}"
    value=${REPLACE_MAP["$key"]}
done
Run Code Online (Sandbox Code Playgroud)

结果:

a - 1
b - 2
Run Code Online (Sandbox Code Playgroud)

我想要一个将产生以下结果的数据结构:

b - 2
a - 1
Run Code Online (Sandbox Code Playgroud)

Jef*_*ler 6

正如Michael Vehrs所说,bash 的关联数组不保留插入顺序。这通常是关联数组的“特征” 。bash 中的“魔法”发生在hashlib.c 中

Bash 确实有索引数组,您可以将其用作插入顺序的指示符:

declare -A REPLACE_MAP
declare -a REPLACE_MAP_INDEX
REPLACE_MAP['b']='2'
REPLACE_MAP_INDEX+=('b')
REPLACE_MAP['a']='1'
REPLACE_MAP_INDEX+=('a')
for key in "${REPLACE_MAP_INDEX[@]}"; do
    printf "%s - %s\n" "$key" "${REPLACE_MAP["$key"]}"
    value=${REPLACE_MAP["$key"]}
done
Run Code Online (Sandbox Code Playgroud)

根据您的数据,另一种选择是单个索引数组,其值是以某种方式组合的原始键和值(此处使用空格):

unset arr
declare -a arr
arr+=("b 2")
arr+=("a 1")
for ckey in "${arr[@]}"; do
  key=${ckey% *}
  value=${ckey#* }
  printf "%s - %s\n" "$key" "$value"
done
Run Code Online (Sandbox Code Playgroud)

...但如果空格是键或值的有效部分,则选择其他未使用的内容,例如管道符号:

unset arr
declare -a arr
arr+=("b|2")
arr+=("a|1")
for ckey in "${arr[@]}"; do
  key=${ckey%|*}
  value=${ckey#*|}
  printf "%s - %s\n" "$key" "$value"
done
Run Code Online (Sandbox Code Playgroud)