对于使用两个或更多数组的嵌套循环,例如
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
?
答案 0 :(得分:3)
你可以用一个在内循环内递增的简单计数器来做到这一点:
i=0
for a in "${A[@]}"; do
for b in "${B[@]}"; do
((i++))
printf "Iteration: $i\n"
: your code
done
done
如果所有逻辑都在最内层循环内,并且我们将最内层循环的执行视为一次迭代,那么这是有意义的。
请注意,您需要在数组引用周围使用双引号来防止分词和通配。另外,我认为只要你想要每个元素而不是所有元素的连接版本,你需要array[@]
而不是array[*]
。
答案 1 :(得分:0)
基于给出的示例和@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
值的唯一组合,同时查找每次迭代嵌套循环中的数字。