apakah ada cara untuk mendaftar semua 'indeks ID' (kunci) pada variabel array asosiatif bash?

26

Saya punya array ini:

declare -A astr

Saya menambahkan elemen ke dalamnya:

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

Tapi nanti saya perlu tahu apa ID indeks (elemA dan elemB) dan daftar mereka.

echo "${astr[@]}" #this only get me the values...
Aquarius Power
sumber

Jawaban:

35

Anda bisa mendapatkan daftar "kunci" untuk array asosiatif seperti:

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

Anda dapat beralih di atas "kunci" seperti:

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

Contoh

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

Referensi

slm
sumber
1
Saya baru saja menemukannya juga berfungsi untuk array yang diindeks secara numerik juga: astr2=(a b c d e);echo ${!astr2[@]};unset astr2[2];echo ${!astr2[@]}thx!
Aquarius Power
@AquariusPower - Ya jika Anda memutar kembali suntingan pada jawaban saya, Anda akan melihat bahwa saya awalnya menyertakan indeks numerik juga, tetapi kemudian membuangnya karena Anda ingin memberi nama hash.
slm
Catatan yang ${!var[index]}tidak berfungsi, hanya ${!var[@]}atau ${!var[*]}lakukan :(
i336_
@ i336_ - !keluarkan jadi ${var[index]}. tldp.org/LDP/abs/html/arrays.html
slm
Maaf, klarifikasi: Saya mencoba menentukan kunci asosiatif untuk indeks numerik n . Saya menyadari bahwa saya dapat dengan mudah melakukannya keys=(${!var[@]})dan kemudian ${keys[n]}memberi saya indeks, tetapi pada saat yang sama saya juga menyadari bahwa saya perlu memikirkan kembali pendekatan saya.
i336_