Existe-t-il un moyen de répertorier tous les «ID d'index» (clés) sur une variable de tableau associatif bash?

26

J'ai ce tableau:

declare -A astr

J'y ajoute des éléments:

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

Mais plus tard, j'ai besoin de savoir quels sont les ID des index (elemA et elemB) et de les énumérer.

echo "${astr[@]}" #this only get me the values...
Puissance du Verseau
la source

Réponses:

35

Vous pouvez obtenir la liste des "clés" pour le tableau associatif comme ceci:

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

Vous pouvez parcourir les "clés" comme ceci:

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

Exemple

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

Les références

slm
la source
1
Je viens de découvrir que cela fonctionne également pour les tableaux indexés numériquement: astr2=(a b c d e);echo ${!astr2[@]};unset astr2[2];echo ${!astr2[@]}thx!
Aquarius Power
@AquariusPower - Oui, si vous annulez les modifications sur ma réponse, vous verrez que j'avais également inclus l'index numérique à l'origine, mais que vous l'avez ensuite supprimé car vous vouliez des hachages nommés.
slm
Notez que ${!var[index]}cela ne fonctionne pas, seulement ${!var[@]}ou fonctionne ${!var[*]}:(
i336_
@ i336_ - enlevez-le !donc ${var[index]}. tldp.org/LDP/abs/html/arrays.html
slm
Désolé, clarification: j'essayais de déterminer la clé associative pour l'index numérique n . J'ai réalisé que je pouvais facilement le faire keys=(${!var[@]})et ensuite ${keys[n]}, en me donnant l'index, mais à la même époque, j'ai également réalisé que je devais repenser mon approche.
i336_