我试图用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维空间,并且迭代不一定是解决方案的一部分。
答案 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