web-dev-qa-db-ja.com

bashで2つの配列を同時に繰り返す

2つの配列があります。

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

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

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

これどうやってするの?

67
user2354862

アニシュセインの答えとその中のコメントから、私たちはあなたが望むものを知っています。 forループを使用したbashierスタイルでも同じことが言えます。リファレンスマニュアルの Looping Constructsセクション を参照してください。 printfの代わりに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

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

#!/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番目の方法ではフィールドの表示順序を簡単に制御できないことに注意してください(まあ、これは連想配列なので、驚くことではありません)。

83
gniourf_gniourf

すべての配列が正しく順序付けられている場合、インデックスを渡すだけです。

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

配列と配列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

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

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

特に質問(3項目の配列)の場合:

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

0
runlevel0

次のように、2つの変数が複数の行を持つ2つの文字列の場合:

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

次に、この場合の解決策は次のとおりです。

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