bash ilişkisel dizi değişkenindeki tüm 'indexes ID'leri (anahtarlar) listelemenin bir yolu var mı?


26

Bende bu dizi var:

declare -A astr

Ona eleman eklerim:

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

Fakat daha sonra, indeks ID'lerinin (elemA ve elemB) ne olduğunu bilmem ve onları listelemem gerekiyor.

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

Yanıtlar:


35

Bunun gibi ilişkisel dizi için "anahtarların" listesini alabilirsiniz:

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

Bunun gibi "tuşlar" üzerinde yineleme yapabilirsiniz:

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

Örnek

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

Referanslar


1
Sadece sayısal olarak dizine eklenmiş diziler için de işe yaradığını buldum: astr2=(a b c d e);echo ${!astr2[@]};unset astr2[2];echo ${!astr2[@]}thx!
Kova Gücü

@AquariusPower - Evet, cevabımdaki düzenlemeleri geri alırsanız, başlangıçta sayısal dizini de dahil ettiğimi görürsünüz, ancak daha sonra hash ismini vermek istediğinizden çıkardım.
slm

Not olduğunu ${!var[index]}etmez eser, sadece ${!var[@]}ya ${!var[*]}:( do
i336_

@ i336_ - !çıkar dışarı öyleyse ${var[index]}. tldp.org/LDP/abs/html/arrays.html
slm

Üzgünüz, açıklama: Sayısal indeks n için ilişkisel anahtarı belirlemeye çalışıyordum . Kolayca yapabileceğimi keys=(${!var[@]})ve sonra ${keys[n]}bana endeksi verdiğimi fark ettim , ancak aynı zamanda yaklaşımımı yeniden düşünmem gerektiğini de fark ettim.
i336_
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.