Array Cartesian product in bash

5

Existe uma maneira de gerar produtos cartesianos de arrays sem usar loops no bash?

Pode-se usar chaves para fazer algo semelhante:

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

mas eu preciso usar arrays como entradas, e os truques mais óbvios me falham.

    
por xl0 27.10.2013 / 16:45

1 resposta

5

Você pode usar a expansão de contraventamento. Mas é feio. Você precisa usar eval , já que a expansão de contraventamento acontece antes da expansão da variável (matriz). E "${var[*]}" com IFS=, para criar as vírgulas.

Considere um comando para gerar a string

echo {a,b,c}+{1,2,3}

Supondo que as matrizes são chamadas letters e numbers , você poderia fazer isso usando a notação "${var[*]}" , com IFS=, para inserir vírgulas entre os elementos em vez de espaços.

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

Que imprime

{a,b,c}+{1,2,3}

Agora adicione eval , então ele executa essa string como um comando

eval echo {"${letters[*]}"}+{"${numbers[*]}"}

E você começa

a+1 a+2 a+3 b+1 b+2 b+3 c+1 c+2 c+3
    
por 27.10.2013 / 16:52