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

在bash中执行任意数量的嵌套循环,bash,recursion,scripting,iteration,nested-loops,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 现在,当我得到更多的维度进

我试图在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元组

(我试着对它进行伪编码,但考虑递归和构造列表会伤到我的头脑。)


有人对如何在bash中实现对任意数量的变量的迭代有什么建议吗?请记住,目标是在整个n维空间中进行迭代,而该迭代不一定是解决方案的一部分。

如果可以接受并行
,则可以将嵌套的
for
循环简化为

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

在一般情况下,可能可以先组装此命令,然后执行它…

您可以使用递归来计算笛卡尔积

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

#!/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
#/bin/bash
尺寸=(“a b c d e f g h i”“1 2 3 4 5 6 7 8 9”“a1 b2 b3 b4 b5 b6”)
函数迭代{
本地索引=“$2”
如果[“${index}”==“${dim[@]}”];则
对于((i=0;i
#!/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