2013-07-01 9 views
48

Mam dwie tablice.Powtórz iteracje na dwóch tablicach jednocześnie w bashu

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

że chce pętli na tych dwóch tablic simulataneously, to wywołać polecenie pierwszych elementów dwóch tablic, to wywołują to samo polecenie drugich elementów i tak dalej. Pseudokod:

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

Jak mogę to zrobić?

Odpowiedz

12

Trzeba pętlę nad tablicy & tablica2

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 

Alternatywnie, można użyć tej opcji (bez pętli):

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

I ** GUESS ** to jest to, czego chcesz. – anishsane

+0

DZIĘKI !!! Działa idealnie !!!! – user2354862

+0

@ user2354862 Jeśli tak, powinieneś [zaakceptować odpowiedź] (http://meta.stackexchange.com/a/5235). –

67

Od odpowiedzi anishsane i komentarze w nim teraz wiemy, czego chcieć. Oto to samo w stylu bashier, używając pętli for. Zobacz Looping Constructs section in the reference manual. Używam też printf zamiast 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 

Inną możliwością byłoby użyć tablicę asocjacyjną:

#!/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 

W zależności od tego, co chcesz zrobić, równie dobrze można rozważyć tę drugą możliwość. Należy jednak pamiętać, że nie będzie łatwo kontrolować kolejności, w której pola są wyświetlane w drugiej możliwości (cóż, jest to tablica asocjacyjna, więc nie jest to naprawdę niespodzianka).

+0

Myślę, że to' -a' nie '-A' – Brian

+1

@Brian' -a' jest dla tablic indeksowanych (tj. regularnych), a '-A' jest dla tablice asocjacyjne (tabele mieszające), więc w tym przypadku '-A' jest poprawne. –

+0

hmm, zastanawiam się, dlaczego '-A' nie działa z deklaracją, wtedy – Brian

14

Jeśli wszystkie tablice są poprawnie uporządkowane, wystarczy je ominąć.

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 
Powiązane problemy