Basé sur un tableau associatif dans un script Bash, je dois effectuer une itération 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 entrante.
L'accès aux clés s'effectue à l'aide d'un point d'exclamation: ${!array[@]}
, lesvalues sont accessibles via ${array[@]}
.
Vous pouvez parcourir les paires clé/valeur comme suit:
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 for
(plus l'utilisation de @
au lieu de *
). Ceci est nécessaire au cas où des clés incluent des espaces.
La confusion dans l'autre réponse provient du fait que votre question inclut "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, il est facile de parcourir les paires clé/valeur:
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
~