Bash/Klammerexpansion: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
|||
Zeile 48: | Zeile 48: | ||
== Brace expansion == | == 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". | Das Ergebnis sind nun Zeichenketten der Art "PräfixZeichenkette_1_Postfix", "PräfixZeichenkette_2_Postfix",..., "PräfixZeichenkette_n_Postfix". | ||
$ '''echo Beispiel{_1_,_2_,_3_}''' | $ '''echo Beispiel{_1_,_2_,_3_}''' | ||
Beispiel_1_ Beispiel_2_ Beispiel_3_ | Beispiel_1_ Beispiel_2_ Beispiel_3_ | ||
Präfix und Postfix können ihrerseits wiederum Klammererweiterungen sein und Klammererweiterungen | 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}} | $ '''mkdir -p bsp/{ucb/{ex,edit},lib/{bla,foo}}''' | ||
du bsp | cut -b 3-''' | $ '''du bsp | cut -b 3-''' | ||
bsp/ucb/ex | bsp/ucb/ex | ||
bsp/ucb/edit | bsp/ucb/edit | ||
Zeile 86: | Zeile 83: | ||
=== Backup erstellen === | === Backup erstellen === | ||
$ cp -p /etc/apache2/plesk.conf.d/roundcube.conf{,.conf_back} | $ cp -p /etc/apache2/plesk.conf.d/roundcube.conf{,.conf_back} | ||
Zeile 94: | Zeile 90: | ||
$ ls file1.txt file2.txt file3.txt file4.txt file5.txt | $ ls file1.txt file2.txt file3.txt file4.txt file5.txt | ||
ls file{1,2,3,4,5}.txt | $ ls file{1,2,3,4,5}.txt | ||
ls file{1..5..1}.txt | $ ls file{1..5..1}.txt | ||
$ file{1..5}.txt | |||
The first command lists each argument explicitly. | The first command lists each argument explicitly. | ||
The other three commands all use brace expansion to express the arguments more tersely: | |||
* the second command, all the possibilities 1 through 5 are given, separated by commas | |||
* the third command, a numeric sequence is given ("from 1 to 5, incrementing by 1") | |||
* the fourth command is the same as the third, but leaves the ..1 implicit. | |||
We can also list the files in the opposite order: | |||
$ ls file5.txt file4.txt file3.txt file2.txt file1.txt | $ ls file5.txt file4.txt file3.txt file2.txt file1.txt | ||
ls file{5,4,3,2,1}.txt | $ ls file{5,4,3,2,1}.txt | ||
ls file{5..1..-1}.txt | $ ls file{5..1..-1}.txt | ||
ls file{5..1}.txt | $ ls file{5..1}.txt | ||
with the default increment size being -1 when the endpoint of the sequence is less than the starting-point. | with the default increment size being -1 when the endpoint of the sequence is less than the starting-point. | ||
Since in Bash, the first word of a command is the program that is run, we could also write the command this way: | Since in Bash, the first word of a command is the program that is run, we could also write the command this way: | ||
$ {ls,file{1..5}.txt} | |||
{ls,file{1..5}.txt} | |||
but obviously that is not conducive to readability. | but obviously that is not conducive to readability. |
Version vom 25. Juli 2022, 10:45 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
Testfrage 2
Testfrage 3
Testfrage 4
Testfrage 5
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
Similar to filename expansion is brace expansion, which is a compact way of representing multiple similar arguments.
- The following four commands are equivalent:
$ 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
The first command lists each argument explicitly.
The other three commands all use brace expansion to express the arguments more tersely:
- the second command, all the possibilities 1 through 5 are given, separated by commas
- the third command, a numeric sequence is given ("from 1 to 5, incrementing by 1")
- the fourth command is the same as the third, but leaves the ..1 implicit.
We can also list the files in the opposite order:
$ 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
with the default increment size being -1 when the endpoint of the sequence is less than the starting-point.
Since in Bash, the first word of a command is the program that is run, we could also write the command this way:
$ {ls,file{1..5}.txt}
but obviously that is not conducive to readability.
- The same sort of thing, incidentally, can be done with filename expansion.
Brace expansion, like filename expansion, can be disabled by any of the quoting mechanisms; '{', "{", or \{ produces an actual literal curly-brace.
Beispiel
# root@debian ~ # chown -Rc dirkwagner.dirkwagner /media/daten/{tools,kurse,ebooks}