在bash中执行任意数量的嵌套循环

时间:2015-11-26 20:43:47

标签: bash recursion scripting iteration nested-loops

我试图用bash中的一系列嵌套for循环遍历n维空间。

VAR1="a b c d e f g h i"
VAR2="1 2 3 4 5 6 7 8 9"
VAR3="a1 b2 b3 b4 b5 b6"

for i1 in $VAR1; do
    for i2 in $VAR2; do
        for i3 in $VAR3; do
            echo "$i1 $i2 $i3"
         done
    done
done

现在,当我获得更多维度进行迭代时,我意识到能够指定任意数量的变量进行循环会更容易/更好。

如果我使用更复杂的编程语言,我可能会使用递归将列表列表传递给函数,弹出一个列表,遍历它,每次通过循环递归调用函数,传递现在减少列表列表,并在我去的时候组装n元组。

(我试图对那些看起来很像的东西进行伪代码处理,但是这会让我的头思考虑递归和构建列表。)

function iterate_through(var list_of_lists)
    this_list=pop list_of_lists
    var new_list = []
    for i in this_list
        new_list.push(i)
        new_list.push(iterate_through(list_of_lists))
     # return stuff
     # i gave up about here, but recursion may not even be necessary

有人建议如何在bash中完成迭代任意数量的变量?请记住,目标是遍历整个n维空间,并且迭代不一定是解决方案的一部分。

2 个答案:

答案 0 :(得分:1)

如果parallel可以接受,那么可以将嵌套的for循环简化为

parallel -P1 echo {1} {2} {3} ::: $VAR1 ::: $VAR2 ::: $VAR3

在一般情况下,首先组装此命令然后执行它可能是可行的......

答案 1 :(得分:1)

您可以使用递归来计算笛卡儿积[/ p>

以下脚本将使用可变长度输入向量执行此任务:

#!/bin/bash

dim=("a b c d e f g h i" "1 2 3 4 5 6 7 8 9" "a1 b2 b3 b4 b5 b6")

function iterate {

    local index="$2"

    if [ "${index}" == "${#dim[@]}" ]; then

        for (( i=0; i<=${index}; i++ ))
        do
            echo -n "${items[$i]} "
        done
        echo ""
    else
        for element in ${dim[${index}]}; do
            items["${index}"]="${element}"
            local it=$((index+1))
            iterate items[@] "$it"
        done
    fi
}

declare -a items=("")

iterate "" 0

以下要点将把所有维度数组作为输入参数(使用空格分隔的项目):https://gist.github.com/bertrandmartel/a16f68cf508ae2c07b59