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

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

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

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

Richtig, erfordert jedoch das Wiederholen der Vokale, was nicht aus der Frage hervorgeht (Zuweisen einer statischen Liste zu CONS und VOWEL).
Jeff Schaller
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.