有没有一种方法可以在 bash 中不使用循环来生成数组的笛卡尔积?
人们可以使用大括号来做类似的事情:
echo {a,b,c}+{1,2,3}
a+1 a+2 a+3 b+1 b+2 b+3 c+1 c+2 c+3
但我需要使用数组作为输入,而大多数明显的技巧都让我失败。
答案1
您可以使用大括号扩展。但它很丑。您需要使用eval
,因为大括号扩展发生在(数组)变量扩展之前。并"${var[*]}"
用IFS=,
创建逗号。
考虑一个生成字符串的命令
echo {a,b,c}+{1,2,3}
假设数组被称为letters
and numbers
,您可以使用"${var[*]}"
符号来做到这一点,即IFS=,
在元素之间插入逗号而不是空格。
letters=(a b c)
numbers=(1 2 3)
IFS=,
echo {"${letters[*]}"}+{"${numbers[*]}"}
哪个打印
{a,b,c}+{1,2,3}
现在添加eval
,以便它作为命令运行该字符串
eval echo {"${letters[*]}"}+{"${numbers[*]}"}
你得到
a+1 a+2 a+3 b+1 b+2 b+3 c+1 c+2 c+3