Möglichkeit, Klammer (Permutation) und Array-Erweiterung gleichzeitig zu verwenden?

12

Die {}Klammererweiterungssyntax von Bash ermöglicht das Erstellen einfacher Permutationen

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

Es ist mir jedoch nicht klar, ob / wie es möglich ist, dies zusammen mit Arrays zu verwenden, außer bei sehr umständlicher Verwendung von $() echoundeval

Gibt es eine einfache Möglichkeit, Arrays mit geschweifter Klammer (Permutation) zu verwenden?

Stellen Sie sich zum Beispiel so etwas vor (was natürlich nicht funktioniert):

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

echo {${CONS[@]}}{${VOWEL[@]}}
Catskul
quelle
Es funktioniert in der GNU bash, version 4.2.24 Ausgabe, root@router:~# echo {${CONS[@]}}{${VOWEL[@]}} {b c d}{a e i o u}.wenn Sie etwas anderes wollen, dann lassen Sie es uns wissen. `
Rahul Patil
3
@ RahulPatil das OP will ba be bi bo bu ca ce ci co cu da de di do du.
Terdon

Antworten:

10

Sie können eval with IFS=,; "${array[*]}"(das die Werte mit Kommas verbindet) oder nur zwei for-Schleifen verwenden:

$ 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
quelle
9

Es ist möglich mit 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

Oder 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

Mit bashoder ksh93müssten Sie etwas tun, das wie folgt verwickelt ist:

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
quelle
2
Nur noch ein Grund, zsh zu verwenden.
Kevin
Sind Sie sicher, dass es keinen direkteren Weg gibt, dies in Bash zu tun? Oder vermuten Sie nur, dass es so ist?
Catskul
@Catskul, nein, ich bezweifle es stark, aber ich bin nicht sicher, ich bin noch weniger sicher für ksh93, wo eine Reihe von Funktionen nicht dokumentiert sind. Vielleicht möchten Sie die Frage für eine Weile offen lassen. Ich bin mir ziemlich sicher, dass Sie dies nicht mit einer Klammererweiterung ohne eine andere Bewertungsstufe (mit evaloder .) tun können .
Stéphane Chazelas
eval "echo {$(printf ',%s' "${CONS[@]}" "${VOWEL[@]}" | tail -c+2)}"(Funktioniert jedoch nicht für einzelne Elemente.)
Rockallite
2

Spaß, aber wahrscheinlich nicht der beste.

temparr=( b{a,e,i,o,u} c{a,e,i,o,u} d{a,e,i,o,u} )
echo "${temparr[@]}"
D. Fitz
quelle
Richtig, erfordert jedoch das Wiederholen der Vokale, was nicht aus der Frage hervorgeht (Zuweisen einer statischen Liste zu CONS und VOWEL).
Jeff Schaller