Bash Shell-Erweiterung
Eine der Operationen der Shell bei der Analyse der Eingabe ist die Shell-Erweiterung. Bash bietet verschiedene Arten von Erweiterungen. Lassen Sie uns in diesem Artikel eine wichtige Erweiterung besprechen – „Brace-Erweiterung“.
Dieser Artikel ist Teil unserer fortlaufenden Bash-Tutorial-Reihe.
Klammererweiterung
Die Klammererweiterung wird verwendet, um beliebige Zeichenfolgen zu generieren. Die Klammererweiterung ermöglicht es Ihnen, mehrere modifizierte Befehlszeilenargumente aus einem einzigen Argument zu erstellen. Die angegebenen Zeichenfolgen werden verwendet, um alle möglichen Kombinationen mit den optional umgebenden Präambeln und Postscripts zu generieren. Die Präambel wird jedem in geschweiften Klammern enthaltenen String vorangestellt, und das Postscript wird dann an jeden resultierenden String angehängt und von links nach rechts erweitert.
$ echo last{mce,boot,xorg}.log lastmce.log lastboot.log lastxorg.log where last is Preamble and .log is the postscript
Die obige Echo-Anweisung vermeidet die separate Angabe der drei Protokolldateien. Wenn Sie den Inhalt des letzten Boot-Logs, mce-Logs und xorg-Logs sehen möchten, können Sie die Klammererweiterung verwenden, wie in der obigen Echo-Anweisung gezeigt.
1. Beispiel für Backup mit geschweifter Erweiterung
$ cat bkup.sh set -x # expand the commands da=`date +%F` cp $da.log{,.bak} $ ./bkup.sh ++ date +%F + da=2010-05-28 + cp 2010-05-28.log 2010-05-28.log.bak
Im obigen Sicherungsskript kopiert es die Protokolldatei des aktuellen Datums mit der Erweiterung .bak. Das erste Element ist in den geschweiften Klammern leer, also hat das erste Element nur eine Präambel.
2. Beispiel für Wiederherstellung mit geschweifter Erweiterung
$ cat restore.sh set -x # expand the commands da=`date +%F` cp $da.log{.bak,} $ ./restore.sh ++ date +%F + da=2010-05-28 + cp 2010-05-28.log.bak 2010-05-28.log
Im Wiederherstellungsskript ist das erste Element im Parameter .bak, wobei das zweite Element leer ist.
Weitere Informationen finden Sie auch in unserem früheren Artikel über Bash-Shell-Funktionen.
3. Beispiel für Klammererweiterung ohne Präambel und Postscript
Wenn es keine Präambel und kein Postscript gibt, erweitert es einfach die in geschweiften Klammern angegebenen Elemente.
$ cat expand.sh echo {oct,hex,dec,bin} $ ./expand.sh oct hex dec bin
Ohne die optionalen Präambel- und Postscript-Strings ist das Ergebnis nur eine durch Leerzeichen getrennte Liste der angegebenen Strings
Klammererweiterung für Ranges
Klammererweiterung erweitert auch die Sequenzen. Die Sequenzen können aus ganzen Zahlen oder Zeichen bestehen.
4. Beispiel für Integer und Zeichenfolgen
$ cat sequence.sh cat /var/log/messages.{1..3} echo {a..f}{1..9}.txt $ ./sequence.sh May 9 01:18:29 x3 ntpd[2413]: time reset -0.132703 s May 9 01:22:38 x3 ntpd[2413]: synchronized to LOCAL(0), stratum 10 May 9 01:23:44 x3 ntpd[2413]: synchronized to May 9 01:47:48 x3 dhclient: DHCPREQUEST on eth0 May 9 01:47:48 x3 dhclient: DHCPACK from 23.42.38.201 .. .. a1.txt a2.txt a3.txt a4.txt b1.txt b2.txt b3.txt b4.txt c1.txt c2.txt c3.txt c4.txt
Der erste cat-Befehl erweitert messages.1, messages.2 und messages.3 und zeigt den Inhalt an. und in der nächsten Echo-Anweisung werden Zeichen- und Integer-Folgen kombiniert und verwendet.
Sequenzen mit Inkrementwert
In der kshell-Klammererweiterung können Sie den Inkrementwert verwenden, um die Sequenzen zu generieren.
Syntax: <start>..<end>..<incr>
incr ist numerisch. Sie können eine negative Ganzzahl verwenden, aber das richtige Vorzeichen wird aus der Reihenfolge von Start und Ende abgeleitet.
5. Beispiel für die Verwendung von Increment in Sequenzen
$ ksh $ echo /var/log/messages.{1..7..2} /var/log/messages.1 /var/log/messages.3 /var/log/messages.5 /var/log/messages.7 $
Mit diesem können Sie die Logfiles der alternativen Tage sehen.
Falle bei der Brace-Erweiterung
Die Klammererweiterung erweitert keine Bash-Variablen, da die Klammererweiterung der allererste Schritt der Shell-Erweiterung ist, die Variable wird später erweitert.
6. Beispiel für Variablen in Erweiterung
Wenn Sie die Ausgabe der folgenden beiden for-Anweisungen sehen, könnten Sie die obige Falle identifizieren.
$ cat var_seq.sh # Print 1 to 4 using sequences. for i in {1..4} do echo $i done start=1 end=4 # Print 1 to 4 using through variables echo "Sequences expressed using variables" for i in {$start..$end} do echo $i done $ ./var_seq.sh 1 2 3 4 Sequences expressed using variables {1..4}