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*.txt
Das 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}.txt
In 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: