134 votes

Itérer sur deux tableaux simultanément en bash

J'ai deux tableaux.

array=(
  Vietnam
  Germany
  Argentina
)
array2=(
  Asia
  Europe
  America
)

Je veux boucler sur ces deux tableaux de manière simultanée, c'est-à-dire invoquer une commande sur les premiers éléments des deux tableaux, puis invoquer la même commande sur les seconds éléments, et ainsi de suite. Pseudocode :

for c in ${array[*]}
do
  echo -e " $c is in ......"
done

Comment puis-je le faire ?

56voto

cthomaspdx Points 615

Si tous les tableaux sont ordonnés correctement, il suffit de passer l'index.

array=(
  Vietnam
  Germany
  Argentina
)
array2=(
  Asia
  Europe
  America
)

for index in ${!array[*]}; do 
  echo "${array[$index]} is in ${array2[$index]}"
done

Vietnam is in Asia
Germany is in Europe
Argentina is in America

25voto

anishsane Points 5987

Vous avez besoin d'une boucle sur le tableau et le tableau 2

i=0
while [ $i -lt ${#array[*]} ]; do
    echo ${array[$i]} is in ${array2[$i]}
    i=$(( $i + 1));
done

Vietnam is in Asia
Germany is in Europe
Argentina is in America

EDITAR: N'utilisez pas les éléments suivants tr basée sur la mise en œuvre. Elle ne fonctionnera pas pour les éléments de tableau contenant des espaces. Je ne le supprime pas pour que les commentaires restent pertinents. Voir le commentaire de Glenn Jackman au lieu de la réponse ci-dessous.

/EDIT

Alternativement, vous pouvez utiliser cette option (sans boucle) :

paste <(tr ' ' '\n' <<< ${array[*]}) <(tr ' ' '\n' <<< ${array2[*]}) | sed 's/\t/ is in /'

10voto

runlevel0 Points 68

Spécifiquement pour la question posée (tableaux de 3 items) :

for i in $(seq 0 2) ; do
  echo "${array1[$i]} is in ${array2[$i]}"
done

5voto

Fabrício Pereira Points 103

Si les deux variables étaient deux chaînes de caractères avec plusieurs lignes, comme ceci :

listA=$(echo -e "Vietnam\nGermany\nArgentina")
listB=$(echo -e "Asia\nEurope\nAmerica")

Alors, la solution pour ce cas est :

while read strA <&3 && read strB <&4; do
   echo "$strA is in $strB"
done 3<<<"$listA" 4<<<"$listB"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X