对于使用两个或更多数组的嵌套循环,例如
A=(0.1 0.2)
B=(2 4 6)
AB=$((${#A[@]}*${#B[@]})) # total number of iterations (length of A * length of B)
for a in ${A[*]}; do
for b in ${B[*]}; do
$(($a+$b)) # task using each combination of A and B
echo ? # show number of the iteration (i.e. 1 to length of AB)
done
done
获取迭代次数的最佳方法是什么,如上所示使用echo
?
您可以使用在内循环内递增的简单计数器来执行此操作:
i=0
for a in "${A[@]}"; do
for b in "${B[@]}"; do
((i++))
printf "Iteration: $i\n"
: your code
done
done
如果所有逻辑都在最内层循环内,并且如果我们将最内层循环的执行视为一次迭代,那么这将是有意义的。
请注意,您需要在数组引用周围使用双引号以防止单词拆分和通配。另外,我认为你需要array[@]
而不是array[*]
,只要你想要每个元素分开而不是所有元素的连接版本。
基于给出的示例和@codeforester建议的方法,这对我有用(在脚本开头附近包含set -e
)。
i=1
for a in ${A[*]}; do
for b in ${B[*]}; do
I=$((i++))
echo "Iteration: $I"
echo "Combination: $a $b" # show combination of A and B elements
# task code
done
done
在此示例中,没有双引号的array[*]
产生了所需的结果,在循环内分别使用每个元素生成A
和B
值的唯一组合,同时在嵌套循环中查找每个迭代次数。