Есть ли способ перечислить все «идентификаторы индексов» (ключей) в переменной bash ассоциативного массива?

26

У меня есть этот массив:

declare -A astr

Я добавляю элементы к нему:

astr[elemA]=123
astr[elemB]=199

Но позже мне нужно знать, что такое идентификаторы индексов (elemA и elemB) и перечислить их.

echo "${astr[@]}" #this only get me the values...
Водолей Сила
источник

Ответы:

35

Вы можете получить список «ключей» для ассоциативного массива следующим образом:

$ echo "${!astr[@]}"
elemB elemA

Вы можете перебирать «ключи» следующим образом:

for i in "${!astr[@]}"
do   
  echo "key  : $i"
  echo "value: ${astr[$i]}"
done

пример

$ for i in "${!astr[@]}"; do echo "key  : $i"; echo "value: ${astr[$i]}"; done
key  : elemB
value: 199
key  : elemA
value: 123

Ссылки

SLM
источник
1
Я только что обнаружил, что это также работает для числовых индексированных массивов: astr2=(a b c d e);echo ${!astr2[@]};unset astr2[2];echo ${!astr2[@]}thx!
Водолей Power
@AquariusPower - Да, если вы откатите изменения в моем ответе, вы увидите, что я тоже изначально включил числовой индекс, но затем отбросил его, поскольку вы хотели именованные хэши.
SLM
Обратите внимание, что ${!var[index]}это не работает, только ${!var[@]}или ${!var[*]}не работает :(
i336_
@ i336_ - убери это !так ${var[index]}. tldp.org/LDP/abs/html/arrays.html
ОДС
Извините, уточнение: я пытался определить ассоциативный ключ для числового индекса n . Я понял, что могу легко это сделать, keys=(${!var[@]})а затем ${keys[n]}, дав мне индекс, но примерно в то же время я также понял, что мне нужно переосмыслить свой подход.
i336_