¿Es posible usar llaves (permutación) y expansión de matriz simultáneamente?

12

La {}sintaxis de expansión de llaves de Bash permite crear permutaciones fáciles

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

Sin embargo, no está claro para mí si / cómo es posible usar esto junto con las matrices, excepto en el uso incómodo de $() echoyeval

¿Hay una manera simple de usar matrices con expansión de llaves (permutación)?

Por ejemplo, imagina algo como (que, por supuesto, no funciona):

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

echo {${CONS[@]}}{${VOWEL[@]}}
Catskul
fuente
está funcionando en GNU bash, version 4.2.24 Output root@router:~# echo {${CONS[@]}}{${VOWEL[@]}} {b c d}{a e i o u}.si quieres algo diferente, háznoslo saber ... '
Rahul Patil
3
@RahulPatil el OP quiere ba be bi bo bu ca ce ci co cu da de di do du.
terdon

Respuestas:

10

Puede usar eval with IFS=,; "${array[*]}"(que une los valores con comas) o solo dos para bucles:

$ 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
Lri
fuente
9

Es posible con 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

O 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

Con basho ksh93, tendrías que hacer 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%,}}"
Stéphane Chazelas
fuente
2
Solo una razón más para usar zsh.
Kevin
¿Estás seguro de que no hay una forma más directa de hacerlo en bash? ¿O simplemente sospechas que es así?
Catskul
@Catskul, no, lo dudo mucho, pero no estoy seguro, estoy aún menos seguro de ksh93, donde una serie de características no están documentadas. Es posible que desee dejar la pregunta abierta por un tiempo. Sin embargo, estoy bastante seguro de que no puede hacerlo con la expansión de llaves sin otro nivel de evaluación (con evalo .).
Stéphane Chazelas
eval "echo {$(printf ',%s' "${CONS[@]}" "${VOWEL[@]}" | tail -c+2)}"(Sin embargo, no funciona para un solo elemento).
Rockallite
2

Divertido, pero probablemente no el mejor.

temparr=( b{a,e,i,o,u} c{a,e,i,o,u} d{a,e,i,o,u} )
echo "${temparr[@]}"
D.Fitz
fuente
Es cierto, pero requiere repetir las vocales, lo cual no está implícito en la pregunta (asignar una lista estática a CONS y VOCAL cada una).
Jeff Schaller