bash 中的数组笛卡尔积

xl0*_*xl0 8 linux shell bash shell-script

有没有办法在 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
Run Code Online (Sandbox Code Playgroud)

但我需要使用数组作为输入,而且大多数明显的技巧都让我失望。

Mik*_*kel 8

您可以使用大括号扩展。但它很丑。您需要使用eval, 因为大括号扩展发生在(数组)变量扩展之前。并"${var[*]}"IFS=,创建逗号。

考虑一个生成字符串的命令

echo {a,b,c}+{1,2,3}
Run Code Online (Sandbox Code Playgroud)

假设数组被称为lettersand numbers,您可以使用"${var[*]}"符号来做到这一点, withIFS=,在元素之间插入逗号而不是空格。

letters=(a b c)
numbers=(1 2 3)
IFS=,
echo {"${letters[*]}"}+{"${numbers[*]}"}
Run Code Online (Sandbox Code Playgroud)

哪个打印

{a,b,c}+{1,2,3}
Run Code Online (Sandbox Code Playgroud)

现在添加eval,因此它将该字符串作为命令运行

eval echo {"${letters[*]}"}+{"${numbers[*]}"}
Run Code Online (Sandbox Code Playgroud)

你得到

a+1 a+2 a+3 b+1 b+2 b+3 c+1 c+2 c+3
Run Code Online (Sandbox Code Playgroud)

  • 唯一的问题是只包含 1 个元素的数组,因为 bash 不会正确扩展 {a}+{1,2,3}。 (4认同)