Unix 脚本,二维数组的问题

Unix 脚本,二维数组的问题

例如,我有 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"

相关内容