É possível usar a chave (permutação) e a expansão da matriz simultaneamente?

9

A sintaxe de expansão do {} brace do Bash permite a criação de permutações fáceis

# echo {b,c,d}{a,e,i,o,u}
ba be bi bo bu ca ce ci co cu da de di do du

No entanto, não está claro para mim se / como é possível usar isso junto com arrays, exceto no uso muito estranho de $() echo e eval

Existe uma maneira simples de usar arrays com expansão de chaveamento (permutação)?

Por exemplo, imagine algo como (o que não funciona, claro):

CONS=( b c d )
VOWEL=( a e i o u )

echo {${CONS[@]}}{${VOWEL[@]}}
    
por Catskul 16.09.2013 / 23:13

2 respostas

8

Você pode usar o eval com IFS=,; "${array[*]}" (que associa os valores com vírgulas) ou apenas dois loops for:

$ CONS=(b c d);VOWEL=(a e i o u)
$ IFS=,;eval echo "{${CONS[*]}}{${VOWEL[*]}}"
ba be bi bo bu ca ce ci co cu da de di do du
$ for c in "${CONS[@]}";do for v in "${VOWEL[@]}";do echo "$c$v";done;done|paste -sd' ' -
ba be bi bo bu ca ce ci co cu da de di do du
    
por 16.09.2013 / 23:35
6

É possível com zsh :

$ CONS=( b c d )
$ VOWEL=( a e i o u )
$ echo $^CONS$^VOWEL
ba be bi bo bu ca ce ci co cu da de di do du

Ou es :

; VOWEL=( a e i o u )
; CONS=( b c d )
; echo $VOWEL^$CONS
ab ac ad eb ec ed ib ic id ob oc od ub uc ud

Com bash ou ksh93 , você teria que fazer algo complicado como:

VOWEL=( a e i o u )
CONS=( b c d )
qVOWEL=$(printf %q, "${VOWEL[@]}")
qCONS=$(printf %q, "${CONS[@]}")
eval "echo {${qVOWEL%,}}{${qCONS%,}}"
    
por 16.09.2013 / 23:37