
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]}"
}
答え2
バッシュから
$ function assoc() { for i in $VAR1; do echo "$i for $1" ; shift; done ; }
$ assoc $VAR2
1 for Bob
2 for Tom
3 for Kate
答え3
変数を配列に変換して使用してください。
#!/bin/bash
VAR1="1 2 3"
VAR2="Bob Tom Kate"
# since you have spaces in the original string, then a simple paranthesis will work
arr1=($VAR1)
arr2=($VAR2)
for (( i=0; i<${#arr1[@]}; i++ ))
do
echo ${arr1[$i]} for ${arr2[$i]}
done
これは、2つの元の変数の要素数が等しいと仮定する。
変数に単語を分割する方法(コンマなど)がある場合は、別の方法を使用して文字列を配列に分割する必要があります。