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.

259
demandé sur codeforester 2010-06-24 22:07:29

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.

458
répondu Dennis Williamson 2010-06-24 19:31:41

, 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
39
répondu tonio 2010-06-24 19:42:38

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
6
répondu coderofsalvation 2016-02-13 23:06:43
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
~
0
répondu EJISRHA 2018-09-07 04:36:53