Est-il possible d'utiliser l'accolade (permutation) et l'expansion du tableau simultanément?

12

La {}syntaxe d'expansion des accolades de Bash permet de créer des permutations faciles

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

Cependant, il n'est pas clair pour moi si / comment il est possible de l'utiliser avec des tableaux, sauf dans une utilisation très maladroite de $() echoeteval

Existe-t-il un moyen simple d'utiliser des tableaux avec une extension d'accolade (permutation)?

Par exemple, imaginez quelque chose comme (qui ne fonctionne pas bien sûr):

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

echo {${CONS[@]}}{${VOWEL[@]}}
Catskul
la source
ça marche dans GNU bash, version 4.2.24 Output root@router:~# echo {${CONS[@]}}{${VOWEL[@]}} {b c d}{a e i o u}.si vous voulez différent alors faites le nous savoir .. `
Rahul Patil
3
@RahulPatil l'OP veut ba be bi bo bu ca ce ci co cu da de di do du.
terdon

Réponses:

10

Vous pouvez utiliser eval avec IFS=,; "${array[*]}"(qui joint les valeurs par des virgules) ou seulement deux pour les boucles:

$ 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
la source
9

C'est possible avec 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

Avec bashou ksh93, vous devriez faire quelque chose de compliqué comme:

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
la source
2
Une raison de plus pour utiliser zsh.
Kevin
Êtes-vous certain qu'il n'y a pas de moyen plus direct de le faire en bash? Ou pensez-vous simplement qu'il en est ainsi?
Catskul
@Catskul, non, j'en doute fortement mais je n'en suis pas certain, je le suis encore moins pour ksh93 où un certain nombre de fonctionnalités ne sont pas documentées. Vous voudrez peut-être laisser la question ouverte pendant un certain temps. Je suis sûr que vous ne pouvez pas le faire avec l'expansion de l'accolade sans un autre niveau d'évaluation (avec evalou .).
Stéphane Chazelas
eval "echo {$(printf ',%s' "${CONS[@]}" "${VOWEL[@]}" | tail -c+2)}"(Ne fonctionne pas pour un seul élément cependant.)
Rockallite
2

Amusant, mais probablement pas le meilleur.

temparr=( b{a,e,i,o,u} c{a,e,i,o,u} d{a,e,i,o,u} )
echo "${temparr[@]}"
D.Fitz
la source
Vrai, mais nécessite de répéter les voyelles, ce qui n'est pas implicite dans la question (en assignant une liste statique à CONS et à VOWEL chacune).
Jeff Schaller