it-swarm.com.de

Durchlaufen Sie zwei Arrays gleichzeitig in bash

Ich habe zwei Arrays.

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

Ich möchte diese beiden Arrays gleichzeitig durchlaufen, d. H. Einen Befehl für die ersten Elemente der beiden Arrays aufrufen, dann denselben Befehl für die zweiten Elemente aufrufen und so weiter. Pseudocode:

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

Wie kann ich das machen?

67
user2354862

Anhand der Antwort von anishsane und den darin enthaltenen Kommentaren wissen wir jetzt, was Sie wollen. Hier ist das Gleiche in einem bashier Stil mit einer for-Schleife. Siehe den Abschnitt Looping Constructs im Referenzhandbuch . Ich verwende auch printf anstelle von echo.

#!/bin/bash

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

for ((i=0;i<${#array[@]};++i)); do
    printf "%s is in %s\n" "${array[i]}" "${array2[i]}"
done

Eine andere Möglichkeit wäre die Verwendung eines assoziativen Arrays:

#!/bin/bash

declare -A continent

continent[Vietnam]=Asia
continent[Germany]=Europe
continent[Argentina]=America

for c in "${!continent[@]}"; do
    printf "%s is in %s\n" "$c" "${continent[$c]}"
done

Je nachdem, was Sie tun möchten, können Sie auch diese zweite Möglichkeit in Betracht ziehen. Beachten Sie jedoch, dass Sie die Reihenfolge, in der die Felder in der zweiten Möglichkeit angezeigt werden, nicht leicht steuern können (es handelt sich also um ein assoziatives Array, was nicht wirklich überraschend ist).

83
gniourf_gniourf

Wenn alle Arrays korrekt angeordnet sind, leiten Sie den Index weiter.

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
31
cthomaspdx

Sie benötigen eine Schleife über Array & Array2

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

Alternativ können Sie diese Option verwenden (ohne Schleife):

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

Speziell für die gestellte Frage (Arrays mit 3 Elementen):

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

0
runlevel0

Wenn die zwei Variablen zwei Zeichenfolgen mit mehreren Zeilen wären, wie folgt:

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

Dann lautet die Lösung für diesen Fall:

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