2013-07-01 14 views
48

Tôi có hai mảng.Lặp lại hai mảng đồng thời trong bash

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

Tôi muốn lặp trên hai mảng này Simulataneously, ví dụ gọi một lệnh trên các yếu tố đầu tiên của hai mảng, sau đó gọi các lệnh tương tự trên các yếu tố thứ hai, và vân vân. Mã giả:

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

Tôi làm như thế nào?

Trả lời

12

Bạn cần một vòng lặp qua mảng & 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 

Cách khác, bạn có thể sử dụng tùy chọn này (không vòng lặp):

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

I ** GUESS ** đây là điều bạn muốn. – anishsane

+0

THANKS !!! Làm việc hoàn hảo !!!! – user2354862

+0

@ user2354862 Nếu có, bạn nên [chấp nhận câu trả lời] (http://meta.stackexchange.com/a/5235). –

67

Từ câu trả lời anishsane và những ý kiến ​​trong đó bây giờ chúng tôi biết những gì bạn muốn. Đây là điều tương tự theo kiểu bashier, sử dụng vòng lặp for. Xem Looping Constructs section in the reference manual. Tôi cũng đang sử dụng printf thay vì 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 

Một khả năng khác là sử dụng một mảng kết hợp:

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

Tùy thuộc vào những gì bạn muốn làm, bạn cũng có thể xem xét khả năng thứ hai này. Nhưng lưu ý rằng bạn sẽ không dễ dàng kiểm soát thứ tự các trường được hiển thị trong khả năng thứ hai (tốt, đó là một mảng kết hợp, do đó, nó không thực sự là một bất ngờ).

+0

Tôi nghĩ rằng đó là' -a' không '-A' – Brian

+1

@Brian' -a' dành cho các mảng được lập chỉ mục (ví dụ, các mảng thông thường) và '-A' là dành cho mảng kết hợp (bảng băm), vì vậy trong trường hợp này '-A' là chính xác. –

+0

hmm, tự hỏi tại sao '-A' không hoạt động với tuyên bố sau đó – Brian

14

Nếu tất cả các mảng được sắp xếp chính xác, chỉ cần chuyển xung quanh chỉ mục.

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