たとえば、ファイルを参照する2つの配列があります。
alpha=file 1
beta=file2
Charlie=file3
delta=file4
beta2=file5
beta3=file6
Charlie2=file7
charlie3=file8
delta2=file9
delta3=file10
array1=("$alpha" "$beta" "$Charlie" "$delta)
array2=("$beta2" "$beta3" "$Charlie2" "$Charlie3" "$delta1 "$delta3")
次に、これらのファイルの例を繰り返して一緒に使用するアルゴリズムがあります。
for ((i=0;2;i++))
do
for((j=0;2;j++))
do
./${array1[$i]}.sh ${array2[$j]}.in
done
done
問題は、array1とarray2が一致したいということです。
例えば
./file2.sh file5.in
しかし、私は決してそうすることができませんでした。これは、jがすべてのループに対してリセットされたときです。この問題に対する解決策は何ですか?
答え1
array1の最初の項目がarray2の最初の項目に対応するようにするには、入れ子になったループは必要ありません。同じインデックス変数を使用できます。
for i in {0..2}; do
"./${array1[i]}.sh" "${array2[i]}.in"
# ..........^.................^
done
または連想配列を使用します。
declare -A map=(
[$alpha]=$beta2
[$beta]=$beta3
[$Charlie]=$Charlie2
[$delta]=$Charlie3
)
for key in "${!map[@]}"; do
do_something_with "$key" and "${map[$key]}"
done
答え2
配列圧縮演算子が欲しいと思うので、zsh
ここよりも優れたオプションにすることができます。bash
$ a=({A..D}) b=({1..10})
$ for i j (${a:^b}) echo $i $j
A 1
B 2
C 3
D 4
$ for i j (${a:^^b}) echo $i $j
A 1
B 2
C 3
D 4
A 5
B 6
C 7
D 8
A 9
B 10
${a:^b}
${a:^^b}
2つの配列ですジッパー パラメータ拡張オペレーター。ある配列に他の配列より少ない数の要素がある場合、違いが表示されます。この場合、後者は、より大きな配列と一致するように、より短い配列の要素を再利用します。
変数を引用符で囲まないままにしておくと、zsh
他のBourneのようなシェルのように不快な副作用は発生しませんが、空の要素はまだ削除されます。したがって、配列に空の要素が含まれている場合は、次のように書く必要があります。
for i j ("${(@)a:^^b}") echo "$i" "$j"