我在 bash 中定义一个列表,如下所示:
list="element1 element_2 my_element_3 element04"
我想要做一个循环,遍历所有可能的配对组合。在 Perl 中,我会使用 while/foreach 并在列表中进行移位,如下所示:
while (my $element1 = shift (@list)) {
foreach my $element2 (@list) {
print "$element1 - $element2\n";
}
}
我不希望对中有相同的元素,也不关心对的顺序,所以如果列表是“AB C”,则结果应该是:
A - B
A - C
B - C
我怎样才能在 bash 中做等效的事情?
答案1
最简单的方法似乎是使用位置参数。
set -- value1 value2 "value with spaces"
for a; do
shift
for b; do
printf "%s - %s\n" "$a" "$b"
done
done
答案2
思考问题的另一种方式是:如果列表中的每个项目都有(i,j)索引,那么您只会对对角线上方(或下方)的项目集感兴趣(即,i>j)。
如果您确实想要所有组合,那么您只需测试 i!=j 的位置。
我想做类似的事情:生成 4 个项目的所有可能排序。 For
嵌套深度为 4 的循环不太漂亮,也没有想到优雅的条件,但这个解决方案做到了:
$ for combo in {en,fa,sp,ru}{en,fa,sp,ru}{en,fa,sp,ru}{en,fa,sp,ru}; do echo $combo; done | egrep -v 'en.*en|fa.*fa|sp.*sp|ru.*ru'
enfaspru
enfarusp
enspfaru
ensprufa
enrufasp
enruspfa
faenspru
faenrusp
faspenru
faspruen
faruensp
faruspen
spenfaru
spenrufa
spfaenru
spfaruen
spruenfa
sprufaen
ruenfasp
ruenspfa
rufaensp
rufaspen
ruspenfa
ruspfaen
答案3
将输出转储到标准输出,通过管道进行排序 -u