чи є спосіб перерахувати всі 'ідентифікаційні ідентифікатори' (ключі) на змінній асоціативної масиви bash?


26

У мене є цей масив:

declare -A astr

Я додаю до нього елементи:

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

Але згодом мені потрібно знати, що таке індекси ID (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

Список літератури


1
Щойно я виявив, що він також працює для числових індексованих масивів: astr2=(a b c d e);echo ${!astr2[@]};unset astr2[2];echo ${!astr2[@]}thx!
Сила Водолія

@AquariusPower - Так, якщо ти повернеш правки до моєї відповіді, ти побачиш, що я спочатку також включив числовий індекс, але потім відмінив його, оскільки ти хотів назвати хеші.
slm

Зауважте, що ${!var[index]}це не працює, лише ${!var[@]}або ${!var[*]}виконайте :(
i336_

@ i336_ - вийміть !, щоб це було ${var[index]}. tldp.org/LDP/abs/html/arrays.html
slm

Вибачте, уточнення: я намагався визначити асоціативний ключ для числового індексу n . Я зрозумів, що легко можу, keys=(${!var[@]})і тоді ${keys[n]}, давши мені індекс, але приблизно в той же час я також зрозумів, що мені потрібно переосмислити свій підхід.
i336_
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.