Bash/Klammerexpansion: Unterschied zwischen den Versionen

Aus Foxwiki
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. (The same sort of thing, incidentally, can be done with filename expansion.)
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}