複数の変数を持つ「for i in」ループ

複数の変数を持つ「for i in」ループ

2つの変数があります

VAR1="1 2 3"
VAR2="Bob Tom Kate"

次の内容をエコーし​​たいのですが、ループ内で複数の変数を使用する方法がわかりません。

1 for Bob
2 for Tom
3 for Kate

私ができることは:

(
for i in $VAR1; do 
echo "$i"
done
)

ベストアンサー1

zshから:

var1=(1 2 3)
var2=(Bob Tom Kate)
for i j in ${var1:^var2}; do
  printf '%q, %q\n' $i $j
done

これらの変数にnull値を含めることができる場合:

var1=('' 2 3)
var2=('Bob XIV' Tom '')
for i j in "${(@)var1:^var2}"; do
  printf '%q, %q\n' "$i" "$j"
done

(または参照に空の要素が含まれているように、要素が個別にそのまま渡されるBourneシェルまたはKornシェルのパラメータ拡張と同様の動作を"${var1[@]:^var2}"得ることが重要です)"$@""${array[@]}"

${a:^b}圧縮された配列パラメータ拡張演算子${a:^^b}配列に同じ数の要素がない場合、より短い配列の要素を再利用するバリアントもあります。

zshでは、可能であればインデックスで配列要素を逆参照しないことをお勧めします。これは現在のバージョンでは非常に非効率的であり、特に大規模配列の場合、主にzshが配列のサイズを記録しないため、アクセスが発生してもN最初の要素はC配列のインデックスなので、即時でなければならず、zshはまだ確認する必要があります。N配列の終わりを超えておらず、古いn - 1つの要素を確認し続ける必要があります。

3つ以上の配列を繰り返すには、次の手順を実行する必要があります。

n=$#var1
for (( i = 1; i <= n; i++ ))
  printf '%q, %q, %q\n' "$var1[i]" "$var2[i]" "$var3[i]"

これはksh93またはbashの対応するコードよりはるかに遅いです。

n=${#var1[@]}
for (( i = 0; i < n; i++ )) {
  printf '%q, %q, %q\n' "${var1[i]}" "${var2[i]}" "${var3[i]}"
}

おすすめ記事