在bash中执行任意数量的嵌套循环
我试图在bash中使用一系列嵌套的for循环遍历n维空间在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 现在,当我得到更多的维度进
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