È possibile utilizzare contemporaneamente il rinforzo (permutazione) e l'espansione dell'array?


12

La {}sintassi di espansione del controvento di Bash consente di creare facili permutazioni

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

Tuttavia non mi è chiaro se / come sia possibile utilizzarlo insieme alle matrici se non in un uso molto imbarazzante di $() echoeeval

Esiste un modo semplice per utilizzare le matrici con espansione parentesi graffa (permutazione)?

Per esempio, immagina qualcosa di simile (che non funziona ovviamente):

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

echo {${CONS[@]}}{${VOWEL[@]}}

funziona in GNU bash, version 4.2.24 Output root@router:~# echo {${CONS[@]}}{${VOWEL[@]}} {b c d}{a e i o u}.se vuoi diverso, allora facci sapere ... `
Rahul Patil,

3
@RahulPatil l'OP vuole ba be bi bo bu ca ce ci co cu da de di do du.
terdon

Risposte:


10

È possibile utilizzare eval con IFS=,; "${array[*]}"(che unisce i valori con virgole) o solo due per i loop:

$ 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

È possibile 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

Oppure 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, dovresti fare qualcosa di contorto come:

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

2
Un motivo in più per usare zsh.
Kevin,

Sei sicuro che non esiste un modo più diretto per farlo in bash? O sospetti solo che sia così?
Catskul,

@Catskul, no, ne dubito fortemente, ma non ne sono certo, ne sono ancora meno sicuro per ksh93 in cui non sono documentate alcune funzionalità. Potresti voler lasciare la domanda aperta per un po '. Sono abbastanza sicuro che non puoi farlo con l'espansione del controvento senza un altro livello di valutazione (con evalo .).
Stéphane Chazelas,

eval "echo {$(printf ',%s' "${CONS[@]}" "${VOWEL[@]}" | tail -c+2)}"(Non funziona per singolo elemento però.)
Rockallite,

2

Divertente, ma probabilmente non il migliore.

temparr=( b{a,e,i,o,u} c{a,e,i,o,u} d{a,e,i,o,u} )
echo "${temparr[@]}"

Vero, ma richiede di ripetere le vocali, il che non è implicito nella domanda (assegnando un elenco statico a CONS e VOWEL ciascuno).
Jeff Schaller
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.