Arrays 获取嵌套循环中的迭代编号
对于使用两个或多个数组的嵌套循环,例如Arrays 获取嵌套循环中的迭代编号,arrays,bash,loops,unix,for-loop,Arrays,Bash,Loops,Unix,For Loop,对于使用两个或多个数组的嵌套循环,例如 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 numb
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
<如果所有的逻辑都在最内层循环中,如果我们认为最内层循环的执行是一次迭代,那么这将是有意义的。< /P>
请注意,在数组引用周围需要双引号,以防止分词和全局搜索。此外,我认为您需要
array[@]
而不是array[*]
,只要您希望每个元素都是单独的,而不是所有元素的串联版本。根据给出的示例和@codeforester建议的方法,这对我来说是有效的(脚本开头附近包含set-e
)
在本例中,不带双引号的
array[*]
生成了所需的结果,分别使用循环中的每个元素生成A
和B
值的唯一组合,同时在嵌套循环中查找每个迭代编号。谢谢。此方法在本例中效果良好。但是,如果我使用set-e
(出错时退出)启动脚本,则不会打印任何内容。虽然显然不重要,但这是否表明此代码存在缺陷?@user3743235如果从i=1开始并使用(++i))
,则它与set-e
一起工作。为什么我不清楚。虽然这可能适用于您的案例,但@codeforester已经指出了几个问题。
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