Comment itérer sur les tableaux associatifs dans Bash
-
29-09-2019 - |
Question
Sur la base d'un tableau associatif dans un script Bash, je dois 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.
La solution
Les touches sont accessibles à l'aide d'un point d'exclamation: ${!array[@]}
, valeurs sont accessibles à l'aide ${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 l'instruction de for
(plus l'utilisation de @
au lieu de *
). Cela est nécessaire dans le cas des clés comprennent des espaces.
La confusion dans l'autre réponse vient du fait que votre question comprend « foo » et « bar » pour les deux touches et les valeurs.
Autres conseils
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
Cette fonction d'ordre supérieur pour empêcher la pyramide de malheur
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
~