102

私は2つの配列を持っています。

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

これら 2 つの配列を同時にループしたい、つまり、2 つの配列の最初の要素でコマンドを呼び出し、次に 2 番目の要素で同じコマンドを呼び出す、というようにします。擬似コード:

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

これどうやってするの?

4

5 に答える 5

131

anishsane の回答とその中のコメントから、あなたが何を望んでいるかがわかります。for ループを使用して、同じことをbashierスタイルで示します。リファレンス マニュアルの「ループ コンストラクト」セクションを参照してください。printfの代わりにも使用していechoます。

#!/bin/bash

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

for i in "${!array[@]}"; do
    printf "%s is in %s\n" "${array[i]}" "${array2[i]}"
done

別の可能性は、連想配列を使用することです。

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

やりたいことによっては、この 2 番目の可能性を検討することもできます。ただし、2 番目の可能性ではフィールドが表示される順序を簡単に制御できないことに注意してください (これは連想配列であるため、それほど驚くことではありません)。

于 2013-07-01T17:10:44.360 に答える
23

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

編集:tr以下のベースの実装は使用しないでください。スペースを含む配列要素では機能しません。コメントの関連性を保つために削除しないでください。以下の回答ではなく、グレン・ジャックマンのコメントを参照してください。

/編集

または、このオプションを使用できます (ループなし):

paste <(tr ' ' '\n' <<< ${array[*]}) <(tr ' ' '\n' <<< ${array2[*]}) | sed 's/\t/ is in /'
于 2013-07-01T11:39:23.880 に答える