2010-06-24 8 views
224

Basé sur un tableau associatif dans un script Bash, j'ai besoin de parcourir pour obtenir la clé et la valeur. Je ne comprends pas vraiment comment obtenir la clé lors de l'utilisation d'une boucle de préinclusion.Comment faire une itération sur des tableaux associatifs dans Bash

+6

$ déclarer tableau -A = ([foo] = bar [bar] = toto) # Initialiser tout à – anisbet

+2

Pour une petite liste de valeurs clés, vous pouvez considérer ceci: 'pour i dans a, b c_s, d; faites KEY = $ {i%, *}; VAL = $ {i # *,}; echo $ KEY "XX" $ VAL; done' – math

Répondre

400

Les touches sont accessibles à l'aide d'un point d'exclamation: ${!array[@]}, la Les valeurs sont accessibles à l'aide de ${array[@]}.

Vous pouvez parcourir les paires clé/valeur comme celle-ci:

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

Notez l'utilisation des guillemets autour de la variable dans l'instruction for (plus l'utilisation de @ au lieu de *). Ceci est nécessaire dans le cas où les clés comprennent des espaces.

La confusion dans l'autre réponse provient du fait que votre question comprend "foo" et "bar" pour les deux clés et les valeurs.

+2

Ceci est maintenant si assigner toutes les clés à un tableau: 'array = ($ {! hash [@]})' –

+7

@ Michael-O: Vous avez besoin pour citer l'expansion des paramètres pour protéger les clés qui peuvent avoir des espaces: 'array = (" $ {! hash [@]} ")' –

+0

@DennisWilliamson, merci beaucoup. Je n'avais pas ça en tête. –

35

Vous pouvez accéder aux clés avec ${!array[@]}:

bash-4.0$ echo "${!array[@]}" 
foo bar 

Ensuite, itérer sur les clés/paires de valeurs est facile:

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

parfait - merci! – pex

+1

J'ai eu le "!" - n'a même pas remarqué, il n'y en avait pas, désolé .. :) – pex

4

Utilisez cette fonction d'ordre supérieur pour empêcher la pyramid of doom

foreach(){ 
    arr="$(declare -p $1)" ; eval "declare -A f="${arr#*=}; 
    for i in ${!f[@]}; do $2 "$i" "${f[$i]}"; done 
} 

exemple:

$ bar(){ echo "$1 -> $2"; } 
$ declare -A foo["flap"]="three four" foo["flop"]="one two" 
$ foreach foo bar 
flap -> three four 
flop -> one two 
+1

Je ne suis pas sûr de savoir comment cela est applicable? La pyramide du malheur n'est-elle pas une question purement esthétique et n'est-elle réellement applicable que dans les langages orientés objet? –

+1

pourriez-vous l'expliquer? La fonction foreach est un peu difficile. Je ne comprends pas. –

Questions connexes