|
|
Zeile 44: |
Zeile 44: |
|
| |
|
| [[Kategorie:Entwurf]] | | [[Kategorie:Entwurf]] |
| = TMP =
| |
| Mit Hilfe der Klammererweiterung lassen sich beliebige Zeichenketten generieren.
| |
|
| |
| == Brace expansion ==
| |
| Im einfachsten Fall verwendet man eine Präfix-Zeichenkette, gefolgt von beliebig vielen, mit geschweiften Klammern umschlossenen und durch Kommas getrennten Zeichen(ketten), wiederum gefolgt von einer optionalen Postfix-Zeichenkette.
| |
|
| |
| Das Ergebnis sind nun Zeichenketten der Art "PräfixZeichenkette_1_Postfix", "PräfixZeichenkette_2_Postfix",..., "PräfixZeichenkette_n_Postfix".
| |
|
| |
| $ '''echo Beispiel{_1_,_2_,_3_}'''
| |
| Beispiel_1_ Beispiel_2_ Beispiel_3_
| |
|
| |
| Präfix und Postfix können ihrerseits wiederum Klammererweiterungen sein und Klammererweiterungen können verschachtelt werden, sodass sich z.B. mit nur einem Befehl eine ganze Verzeichnishierarchie erzeugen lässt:
| |
|
| |
| $ '''mkdir -p bsp/{ucb/{ex,edit},lib/{bla,foo}}'''
| |
| $ '''du bsp | cut -b 3-'''
| |
| bsp/ucb/ex
| |
| bsp/ucb/edit
| |
| bsp/ucb
| |
| bsp/lib/bla
| |
| bsp/lib/foo
| |
| bsp/lib
| |
| bsp
| |
|
| |
| Der Klammer-Mechanismus der eine große Menge an Zeichenketten erzeugen kann.
| |
| * Muster für die Klammerexpansion (brace-expanded) haben eine optionale ''PREAMBLE'', gefolgt von einer kommaseparierten Liste von Zeichenketten zwischen einem Paar von Klammern gefolgt von einem optionalem ''POSTSCRIPT''.
| |
| * Die ''PREAMBLE'' wir jeder Zeichenkette vorangestellt, dass die Klammern enthalten, dass ''POSTSCRIPT'' wird an jede Ergebniszeichenkette abgehangen.
| |
| * Die Klammererweiterung kann auch verschachtelt werden.
| |
| * Das Ergebnis wird nicht sortiert, die links-zu-rechts-Ordnung bleibt erhalten.
| |
|
| |
| $ echo sp{el,il,al}l
| |
| spell spill spall
| |
|
| |
| Die ''brace expansion'' wird vor allen anderen Expansionen ausgeführt und alle Zeichen, die für andere Expansionen eine besondere Bedeutung haben bleiben erhalten; es ist eine reine Textoperation.
| |
| * Die Bash führt keine syntaktische Interpretationen durch.
| |
| * Um Konflikte mit der ''parameter expansion'' zu vermeiden, werden Zeichenketten die mit "${" beginnen, nicht als ''brace expansion'' verstanden.
| |
| * Eine korrekt formulierte ''brace expansion ''muss eine unmaskierte öffnende und schließende Klammer besitzen und mindestens ein unmaskiertes Komma enthalten.
| |
| * Fehlerhaft formulierte ''brace expansion'' werden von der Bash nicht korrigiert.
| |
|
| |
| === Backup erstellen ===
| |
| $ cp -p /etc/apache2/plesk.conf.d/roundcube.conf{,.conf_back}
| |
|
| |
| === Brace expansion ===
| |
| Ähnlich wie die Expansion von Dateinamen ist die Expansion von geschweiften Klammern eine kompakte Methode, um mehrere ähnliche Argumente darzustellen.
| |
|
| |
| Die folgenden vier Befehle sind gleichwertig:
| |
| $ ls file1.txt file2.txt file3.txt file4.txt file5.txt
| |
| $ ls file{1,2,3,4,5}.txt
| |
| $ ls file{1..5..1}.txt
| |
| $ file{1..5}.txt
| |
|
| |
| * Der erste Befehl listet jedes Argument explizit auf.
| |
| * Die anderen drei Befehle verwenden alle Klammererweiterungen, um die Argumente knapper auszudrücken:
| |
| * beim zweiten Befehl werden alle Möglichkeiten von 1 bis 5 angegeben, getrennt durch Kommas
| |
| * beim dritten Befehl wird eine numerische Folge angegeben ("von 1 bis 5, aufsteigend um 1")
| |
| * der vierte Befehl ist derselbe wie der dritte, lässt aber die ..1 implizit.
| |
|
| |
| Wir können die Dateien auch in der umgekehrten Reihenfolge auflisten:
| |
| $ ls file5.txt file4.txt file3.txt file2.txt file1.txt
| |
| $ ls file{5,4,3,2,1}.txt
| |
| $ ls file{5..1..-1}.txt
| |
| $ ls file{5..1}.txt
| |
|
| |
| wobei die Standard-Inkrementgröße -1 ist, wenn der Endpunkt der Sequenz kleiner ist als der Startpunkt.
| |
|
| |
| Da in der Bash das erste Wort eines Befehls das Programm ist, das ausgeführt wird, könnten wir den Befehl auch so schreiben:
| |
| $ {ls,file{1..5}.txt}
| |
|
| |
| aber das ist natürlich der Lesbarkeit nicht förderlich.
| |
|
| |
| Dasselbe kann übrigens auch mit der Expansion von Dateinamen gemacht werden.
| |
|
| |
| Die Expansion von geschweiften Klammern kann wie die Expansion von Dateinamen durch jeden der Anführungszeichen-Mechanismen deaktiviert werden; '{', "{" oder \{ erzeugt eine tatsächliche geschweifte Klammer.
| |
|
| |
| === Beispiel ===
| |
| # root@debian ~ # chown -Rc dirkwagner.dirkwagner /media/daten/{tools,kurse,ebooks}
| |
|
| |
| = TMP = | | = TMP = |
|
| |
|
|
| |
|
| [[Kategorie:Bash:Expansionen]] | | [[Kategorie:Bash:Expansionen]] |