Bash/Klammerexpansion: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung  | 
				Keine Bearbeitungszusammenfassung  | 
				||
| Zeile 1: | Zeile 1: | ||
== Klammerexpansion (Brace expansion) ==  | == Klammerexpansion (Brace expansion) ==  | ||
Mit Hilfe der Klammererweiterung lassen sich beliebige Zeichenketten generieren.    | |||
Mit Hilfe der Klammererweiterung lassen sich beliebige Zeichenketten generieren. 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.    | * 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".    | ||
| Zeile 10: | Zeile 10: | ||
  Beispiel_1_ Beispiel_2_ Beispiel_3_  |   Beispiel_1_ Beispiel_2_ Beispiel_3_  | ||
Präfix und Postfix können ihrerseits wiederum Klammererweiterungen sein und Klammererweiterungen lassen sich verschachteln, so dass sich z.B. mit nur einem Befehl eine ganze Verzeichnishierarchie erzeugen lässt:    | Präfix und Postfix können ihrerseits wiederum Klammererweiterungen sein und Klammererweiterungen lassen sich verschachteln, so dass 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}}  | ||
| Zeile 22: | Zeile 23: | ||
  bsp  |   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''.    | 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.  | * 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  |   $ echo sp{el,il,al}l  | ||
  spell spill spall  |   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.    | 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.  | * 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.    | |||
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.    | * Fehlerhaft formulierte ''brace expansion'' werden von der Bash nicht korrigiert.    | ||
=== Backup erstellen ===  | === Backup erstellen ===  | ||
| Zeile 40: | Zeile 43: | ||
=== Brace expansion ===  | === Brace expansion ===  | ||
Similar to filename expansion is ''brace expansion'', which is a compact way of representing multiple similar arguments.    | |||
Similar to filename expansion is ''brace expansion'', which is a compact way of representing multiple similar arguments. The following four commands are equivalent:  | * The following four commands are equivalent:  | ||
  $ ls file1.txt file2.txt file3.txt file4.txt file5.txt  |   $ ls file1.txt file2.txt file3.txt file4.txt file5.txt  | ||
| Zeile 48: | Zeile 51: | ||
  ls file{1..5}.txt  |   ls 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: in the second command, all the possibilities 1 through 5 are given, separated by commas; in the third command, a numeric sequence is given ("from 1 to 5, incrementing by 1"); and the fourth command is the same as the third, but leaves the ..1 implicit.  | The first command lists each argument explicitly.    | ||
* The other three commands all use brace expansion to express the arguments more tersely: in the second command, all the possibilities 1 through 5 are given, separated by commas; in the third command, a numeric sequence is given ("from 1 to 5, incrementing by 1"); and the fourth command is the same as the third, but leaves the ..1 implicit.    | |||
We can also list the files in the opposite order:  | * 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  | ||
| Zeile 63: | Zeile 66: | ||
  {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.    | ||
* 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.  | 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}  | |||
[[Kategorie:Bash:Expansionen]]  | [[Kategorie:Bash:Expansionen]]  | ||
Version vom 25. Juli 2022, 10:38 Uhr
Klammerexpansion (Brace expansion)
Mit Hilfe der Klammererweiterung lassen sich beliebige Zeichenketten generieren.
- 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".
An einem Beispiel lässt sich das Prinzip leicht verdeutlichen:
$ echo Beispiel{_1_,_2_,_3_}
Beispiel_1_ Beispiel_2_ Beispiel_3_
Präfix und Postfix können ihrerseits wiederum Klammererweiterungen sein und Klammererweiterungen lassen sich verschachteln, so dass 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
ls 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: in the second command, all the possibilities 1 through 5 are given, separated by commas; in the third command, a numeric sequence is given ("from 1 to 5, incrementing by 1"); and 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}