Brace Expansion
Brace Expansion in Linux ist eine leistungsstarke Shell-Funktion, die es ermöglicht, in der Kommandozeile mehrere Strings in einer kompakten Form zu erzeugen. Diese Technik wird hauptsächlich in der bash-Shell verwendet, aber auch andere Shells wie zsh unterstützen sie.
Syntax
Die grundlegende Syntax für Brace Expansion sieht wie folgt aus.
{string1,string2,...}Die Klammern {} enthalten eine durch Komma getrennte Liste von Strings. Wenn die Shell auf eine solche Konstruktion stößt, wird sie in jede mögliche Kombination der angegebenen Strings expandiert.
Beispiele
Einfachste Form der Brace Expansion
echo {a,b,c}Dies erzeugt die Ausgabe a b c. Die Shell expandiert die Eingabe {a,b,c} zu a, b und c.
Brace Expansion mit Dateipfaden
touch file{1,2,3}.txt
ls file*.txtDas Kommando touch{1,2,3}.txt erzeugt drei Dateien: file1.txt, file2.txt und file3.txt. Die Brace Expansion sorgt dafür, dass die Shell die Eingabe file{1,2,3}.txt zu file1.txt, file2.txt und file3.txt expandiert, die dann von touch erstellt werden.
Range Expansion - Zahlen
echo {1..5}Dies erzeugt die Ausgabe “1 2 3 4 5”. Der Ausdruck wird zu allen Zahlen expandiert.
Range Expansion - Buchstaben
echo {a..e}Dies erzeugt die Ausgabe “a b c d e”. Der Ausdruck wird zu allen Buchstaben von a bis e expandiert.
Range Expansion - Zahlen mit Schritten
echo {0..10..2}Diese Anweisung erzeugt die Ausgabe “0 2 4 6 8 10”. Der Ausdruck wird zu den Zahlen von 0 bis 10 expandiert, wobei der Schritt zwischen den Zahlen 2 beträgt.
Kombination mit Variablen
prefix="file"
touch ${prefix}{1,2,3}.txtIn dieser Anweisung wird die Variable prefix mit Brace Expansion kombiniert. Die Shell ersetzt ${prefix} durch den Wert file, sodass file{1,2,3}.txt zu file1.txt, file2.txt und file3.txt expandiert wird.
Brace Expansion und Ordner
Diese Anweisung erstellt im aktuellen Ordner einen Ordner dir, in welchem dann der Reihe nach die Ordner subOne, subTwo und subThree erstellt werden.
Wenn man sich direkt nach dieser Anweisung die Ordner rekursiv anzeigt, sieht die Struktur folgendermaßen aus.
ls dir/*dir/subOne:
dir/subTwo:
dir/subThree: