Bash/Klammerexpansion: Unterschied zwischen den Versionen

Aus Foxwiki
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]]

Version vom 25. Juli 2022, 12:02 Uhr

topic kurze Beschreibung

Beschreibung

Installation

Anwendungen

Syntax

Optionen

Parameter

Umgebungsvariablen

Exit-Status

Konfiguration

Dateien

Sicherheit

Dokumentation

RFC

Man-Pages

Info-Pages

Siehe auch

Links

Projekt-Homepage

Weblinks

Einzelnachweise

Testfragen

Testfrage 1

Antwort1

Testfrage 2

Antwort2

Testfrage 3

Antwort3

Testfrage 4

Antwort4

Testfrage 5

Antwort5

TMP