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

问题描述 投票:2回答:2

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

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
2个回答
3
投票

您可以使用在内循环内递增的简单计数器来执行此操作:

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

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


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


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

© www.soinside.com 2019 - 2024. All rights reserved.