~
Nur durch Klammererweiterung, Worttrennung oder Pfadnamenerweiterung können neue Wörter in der Kommandozeile entstehen. Die Ergebnisse aller anderen Erweiterungen werden als einzelne Wörter interpretiert. Einzige Ausnahme ist der Spezialparameter ` $@', dessen Inhalt ungeachtet von Blanks als einziges Wort behandelt wird.
Die Klammererweiterung generiert aus einer in geschweiften Klammern eingeschlossenen Liste von Bausteinen mehrere Zeichenketten (Wörter). Wenn die Klammer von konstanten Zeichenketten eingeschlossen ist, werden diese Zeichenketten an jedes der erzeugten Wörter angefügt. Es können mehrere Klammern verschachtelt werden.
Die dem Beispiel zur for-Schleife zugrunde liegende Aufgabe kann durch Klammererweiterung auf einer einzigen Kommandozeile formuliert werden:
$ mkdir /usr/local/man/{man,cat}{1,2,3,4,5,6,7,8,9,n,l} $ _
Dieses Beispiel zeigt, daß im Unterschied zur Pfadnamenerweiterung hier auch neue Dateinamen erzeugt werden können.
Die Klammererweiterung wird vor allen anderen Ersetzungsoperationen durchgeführt. Es handelt sich um eine reine Textoperation, es werden keine Zeichen aus den Bausteinen verändert. Das geschieht erst in den darauf folgenden Schritten.
Mit dieser Behandlung geschweifter Klammern verhält sich die bash absichtlich anders als die Bourne-Shell, die solche Zeichen als Teil von Wörtern nicht verändert. Um die Kompatibilität zur sh wiederherzustellen, kann die Klammererweiterung durch die Kommandozeilenoption -nobraceexpansion oder durch das Kommando set +o braceexpand abgeschaltet werden.
Wenn ein Wort mit einer Tilde (`~
') beginnt,
werden alle Buchstaben vor dem ersten Schrägstrich `/' (Slash) als
Benutzername interpretiert. Diese werden dann durch den absoluten Pfad
des Heimatverzeichnisses dieses Benutzers ersetzt. Wenn kein
Benutzername angegeben ist, wird die Tilde durch den Inhalt der
Umgebungsvariablen HOME bzw. das Heimatverzeichnis des
aktuellen Anwenders ersetzt.
Wenn der Tilde ein `+' folgt, wird das aktuelle Verzeichnis aus der Shellvariablen PWD eingesetzt. Folgt der Tilde ein `-', so wird mit dem letzten aktuellen Verzeichnis aus der Variablen OLDPWD erweitert.
Die Shell führt eine Tildenerweiterung bei der Zuweisung von Zeichenketten an Shellvariable durch. Dabei werden neben der Tilde am Wortanfang auch solche erkannt und ersetzt, die auf den Doppelpunkt `:' folgen. Auf diese Weise kann Tildenerweiterung auch für die Variablen PATH, CDPATH und MAILPATH durchgeführt werden.
Die Tildenerweiterung findet nach der Klammererweiterung und vor allen anderen Erweiterungen statt.
Das `$' Zeichen leitet Parametererweiterung, Kommandosubstitution und arithmetische Ersetzung ein. Der zu erweiternde Parameter kann in geschweiften Klammern eingeschlossen werden, um ihn von den folgenden Zeichen sicher abzugrenzen, die sonst als Teil des Variablennamens mißverstanden werden könnten.
Die folgenden Konstruktionen stellen verschiedene Arten bedingter Parametererweiterung dar. Der mit Wort bezeichnete Teil ist seinerseits wieder Gegenstand von Tildenerweiterung, Parametererweiterung, Kommandosubstitution und arithmetischer Erweiterung. In allen Konstruktionen, die einen Doppelpunkt enthalten, wird der Parameter daraufhin getestet, ob er leer oder ungesetzt ist. Diese Konstruktionen können alle auch ohne den Doppelpunkt verwendet werden. In diesem Fall wird der Parameter nur daraufhin getestet, ob er ungesetzt bzw. gesetzt (auch leer!) ist.
Normalerweise wird eine Parametererweiterung an der Stelle im Shellscript durchgeführt, wo der entsprechende Wert das erste Mal benutzt wird. Bei der im folgenden vorgestellten Möglichkeit, Variable mit Defaultwerten zu belegen, ist es oft erwünscht, solche Belegungen gemeinsam an bestimmten Stellen des Scripts durchzuführen. Weil die Parametererweiterung nur als Bestandteil eines Kommandos oder einer Zuweisung durchgeführt wird, bietet sich zu diesem Zweck die :-Funktion an. Diese ``Shellfunktion'' hat keine direkte Wirkung. Als Seiteneffekt können aber Parameter auf der Kommandozeile erweitert werden.
Beispielsweise kann der Kommandoname ohne Pfadanteil aus einem
absoluten Kommando durch die
Konstruktion
basename=${pathname##*/}
aus dem Pfadnamen in
pathname extrahiert werden; eine Aufgabe, für die normalerweise
das Shellutility basename benutzt wird.
Beispielsweise kann analog zum vorhergehenden Beispiel der reine
Pfadanteil eines absoluten Kommandos durch die Konstruktion
dirname=${pathname%/*}
aus der Zeichenkette in pathname
gezogen werden.
$( Kommando) und
` Kommando`
Die Kommandosubstitution wird durchgeführt, indem die Standardausgabe des Kommandos anstelle des Parameters eingesetzt wird.
Wenn die Substitution in der ``alten'' Form mit den Apostrophen
(Backquote, nicht Hochkomma) durchgeführt wird, behält das
Fluchtsymbol `\
' nur dann seine Sonderfunktion, wenn es vor
den Zeichen ` $', ` `' oder
`\
' steht. Wenn das Kommando in der Klammerform aufgerufen
wird, werden alle Zeichen unverändert belassen.
Kommandosubstitution kann auch verschachtelt werden. In der ``alten'' Form muß vor den inneren Apostrophen ein Fluchtsymbol stehen.
Wenn eine Kommandosubstitution innerhalb von Anführungszeichen durchgeführt wird, wird die Ausgabe des Kommandos nicht mehr in einzelne Wörter geteilt.
Durch die arithmetische Erweiterung ist es möglich, mit Shellvariablen zu rechnen.
Durch die Konstruktion
$[ Ausdruck]
wird anstelle des Ausdrucks das Ergebnis der darin formulierten arithmetischen Berechnungen eingesetzt.
Die Berechnungen werden mit `langen Ganzzahlwerten', wie sie in der Programmiersprache C verwendet werden, ausgeführt. Eine Überlaufkontrolle findet nicht statt. Die Division durch Null führt zu einem Fehler und kann mit der trap-Shellfunktion abgefangen werden.
Die folgenden Operatoren sind erlaubt (die Gruppierung entspricht der Prioritätshierarchie):
~
Alle Shellvariablen sind als Operanden erlaubt. Die Berechnung macht natürlich nur Sinn, wenn es sich bei den Werten um gültige Zahlen handelt. Das Ganzzahlattribut für die Variable muß nicht gesetzt sein.
Die Operationen werden von links nach rechts (der Reihe nach) ausgeführt. Klammern werden erkannt und vorrangig behandelt.
Die kombinierten Zuweisungsoperationen sowie die logischen UND-, ODER- und Shift-Operationen gibt es erst seit bash Version 1.13.
Der Ausdruck wird behandelt, als ob er in Anführungszeichen stünde. Zusätzliche Anführungszeichen im Ausdruck werden ignoriert. Alle Wörter des Ausdrucks werden vor der Berechnung einer Parametererweiterung, Kommandosubstitution und Quotenreduktion unterzogen.
Im Gegensatz zu einer normalen Pipeline können durch Prozeßsubstitution mehrere Pipelines gleichzeitig benutzt werden.
Die Subkommandos einer Prozeßsubstitution werden gleichzeitig mit den Parameter-, Kommando- und Arithmetikerweiterungen ausgeführt.
Die bisher beschriebenen Erweiterungen (Parametererweiterung, Kommandosubstitution und arithmetische Erweiterung) werden vor der weiteren Bearbeitung jeweils einer Worttrennung unterzogen, wenn die erweiterten Parameter nicht in Anführungszeichen stehen.
Bei der Worttrennung wird jedes der in der Shellvariablen IFS -- dem internen Feldseparator -- festgelegten Zeichen als Trenner behandelt. Wenn der Inhalt der IFS-Variablen exakt SPACE TAB RETURN (die Voreinstellung) ist, wird eine beliebige Folge dieser Zeichen als ein einziger Trenner behandelt. Anderenfalls führt jeder Separator zu einem neuen Wort. Wenn die IFS-Variable leer ist, wird keine Worttrennung durchgeführt.
Leere Token, wie sie zum Beispiel durch die Erweiterung leerer Parameter entstehen, werden entfernt, wenn sie nicht ausdrücklich als leere Zeichenkette in Anführungszeichen gesetzt sind.
Wenn keine Erweiterung durchgeführt wurde, findet auch keine Worttrennung statt.
Nach der Worttrennung werden alle Wörter der Kommandozeile nach den Zeichen *, ? und [ durchsucht. Wenn ein solches Zeichen gefunden wird, wird das gesamte Wort, das dieses Zeichen enthält, als Muster für eine Pfadnamenerweiterung benutzt. Es werden alle Dateien und Verzeichnisse des aktuellen Verzeichnisses mit dem Muster verglichen und anstelle des Musters eine alphabetisch geordnete Liste aller passenden Pfadnamen eingesetzt.
Wenn kein passender Pfadname gefunden wurde und die Shellvariable allow_null_glob _expansion nicht gesetzt ist, bleibt das Wort unverändert. Andernfalls wird es aus der Kommandozeile entfernt.
Bei der Pfadnamenerweiterung werden Datei- oder Verzeichnisnamen, die mit einem Punkt beginnen nur dann berücksichtigt, wenn die Shellvariable glob_dot_filenames gesetzt ist. Auch der die Verzeichnisnamen trennende Schrägstrich `/' (Slash) kann durch kein Jokerzeichen ersetzt, sondern muß immer ausdrücklich angegeben werden.
Die Jokerzeichen (Wildcards) zur Pfadnamenerweiterung haben die folgende Bedeutung:
[
...]
^
') ist, paßt das Muster auf alle Zeichen, die nicht
eingeschlossen sind. Das Minuszeichen oder die eckige Klammer selbst
kann in den Bereich eingeschlossen werden, indem es zusätzlich als
einzelnes Zeichen vor oder nach dem Bereich angegeben wird.
Wenn die Option braceexpand gesetzt ist, werden in geschweiften Klammern eingeschlossene, durch Komma getrennte Listen von Wortteilen zu einer Liste von Wörtern erweitert wie in der C-Shell.
Zum Beispiel wird ` *.{c,h}' zu ` *.c *.h' erweitert.
Nach allen Erweiterungen werden die unquotierten Fluchtsymbole und Apostrophe entfernt.