bash 中的数组笛卡尔积

bash 中的数组笛卡尔积

有没有一种方法可以在 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}

假设数组被称为lettersand 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

相关内容