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[@]}}

ç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

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%,}}"

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[@]}"

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.