Comment itérer sur des tableaux associatifs dans Bash
Basé sur un tableau associatif dans un script Bash, j'ai besoin d'itérer dessus pour obtenir la clé et la valeur.
#!/bin/bash
declare -A array
array[foo]=bar
array[bar]=foo
En fait, je ne comprends pas comment obtenir la clé en utilisant une boucle for-in.
4 réponses
Les touches sont accessibles à l'aide d'un point d'exclamation: ${!array[@]}
, l'les valeurs accessibles à l'aide de ${array[@]}
.
Vous pouvez parcourir les paires clé / valeur comme ceci:
for i in "${!array[@]}"
do
echo "key : $i"
echo "value: ${array[$i]}"
done
Notez l'utilisation de guillemets autour de la variable dans le for
déclaration (en plus de l'utilisation de @
au lieu de *
). Ceci est nécessaire dans le cas où des clés incluent des espaces.
La confusion dans l'autre réponse vient du fait que votre question comprend "foo" et "bar" pour les clés et les valeurs.
, Vous pouvez accéder aux clés avec ${!array[@]}
:
bash-4.0$ echo "${!array[@]}"
foo bar
Ensuite, itérer sur les paires clé/valeur est facile:
for i in "${!array[@]}"
do
echo "key :" $i
echo "value:" ${array[$i]}
done
Utilisez cette fonction d'ordre supérieur pour empêcher la pyramide de 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
declare -a arr
echo "-------------------------------------"
echo "Here another example with arr numeric"
echo "-------------------------------------"
arr=( 10 200 3000 40000 500000 60 700 8000 90000 100000 )
echo -e "\n Elements in arr are:\n ${arr[0]} \n ${arr[1]} \n ${arr[2]} \n ${arr[3]} \n ${arr[4]} \n ${arr[5]} \n ${arr[6]} \n ${arr[7]} \n ${arr[8]} \n ${arr[9]}"
echo -e " \n Total elements in arr are : ${arr[*]} \n"
echo -e " \n Total lenght of arr is : ${#arr[@]} \n"
for (( i=0; i<10; i++ ))
do echo "The value in position $i for arr is [ ${arr[i]} ]"
done
for (( j=0; j<10; j++ ))
do echo "The length in element $j is ${#arr[j]}"
done
for z in "${!arr[@]}"
do echo "The key ID is $z"
done
~