在嵌套循环中获取迭代编号

时间:2017-02-14 16:29:10

标签: 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 number of the iteration (i.e. 1 to length of AB)

  done
done

获取迭代次数的最佳方法是什么,如上所示使用echo

2 个答案:

答案 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[*]产生了所需的结果,在循环内单独使用每个元素以生成AB值的唯一组合,同时查找每次迭代嵌套循环中的数字。