Упорядоченная по вставке карта в bash

Попробуйте это.

rsync -r --include='*.jpg' --exclude="*" /RootFolderI/Folder*/Subfolder1/Subsub1/. /RootFolderII/.
3
19.07.2016, 02:16
1 ответ

Как сказал 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

Другой вариант, в зависимости от ваших данных, - это одиночный индексированный массив, значения которого представляют собой исходные ключ и значение, объединенные каким-то образом (здесь используется пробел):

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

... но если пробел является допустимой частью ключа или значения, то выберите что-нибудь другое, неиспользуемое, например, символ трубы:

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
6
27.01.2020, 21:13

Теги

Похожие вопросы