例如,我有 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 和 array 2 对应起来
例如
./file2.sh file5.in
但我永远无法让它做到这一点,因为当然,当 j 为 i 的每个循环重置时。解决这个问题的办法是什么?
答案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}
是两个数组拉链 参数扩展运营商。当一个数组的元素少于另一个数组时,就会看到差异,在这种情况下,后者将重用较短数组中的元素来匹配较大数组。
请注意,将变量不加引号zsh
不会产生与其他类似 Bourne 的 shell 中相同的令人讨厌的副作用,但仍会删除空元素。因此,如果您的数组可能包含空元素,您需要编写它:
for i j ("${(@)a:^^b}") echo "$i" "$j"