【问题标题】:Get iteration number within a nested loop获取嵌套循环中的迭代次数
【发布时间】:2017-07-03 01:08:55
【问题描述】:

对于使用两个或多个数组的嵌套循环,例如

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,获取迭代次数的最佳方法是什么?

【问题讨论】:

    标签: arrays bash loops unix for-loop


    【解决方案1】:

    您可以使用一个在内部循环内递增的简单计数器来做到这一点:

    i=0
    for a in "${A[@]}"; do
      for b in "${B[@]}"; do
        ((i++))
        printf "Iteration: $i\n"
        : your code
      done
    done
    

    如果所有逻辑都在最内层循环内并且我们将最内层循环的执行视为一次迭代,这将是有意义的。


    请注意,您需要在数组引用周围加上双引号,以防止分词和通配。另外,我认为你需要array[@] 而不是array[*],只要你想要每个元素分开而不是所有元素的串联版本。

    【讨论】:

    • 谢谢。此方法适用于此示例。但是,如果我使用 set -e 启动脚本(出错时退出),则不会打印任何内容。虽然显然不是关键,但这是否表明此代码存在缺陷?
    • @user3743235 如果您从i=1 开始并使用((++i)),它适用于set -e。不过,为什么我不清楚。
    【解决方案2】:

    根据给出的示例和@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 值的唯一组合,同时在嵌套循环中查找每个迭代次数。

    【讨论】:

    • 虽然这可能适用于您的情况,但@codeforester 已经指出了几个问题。
    猜你喜欢
    • 2011-05-20
    • 2016-05-20
    • 1970-01-01
    • 2014-10-22
    • 2013-05-09
    • 1970-01-01
    • 2020-03-21
    • 2014-12-04
    • 1970-01-01
    相关资源
    最近更新 更多