next up previous contents index
Next: Synonyme Up: bash Previous: Parameter

Erweiterung

  Nachdem die Kommandozeile in einzelne Kommandos zerlegt ist, werden die Wörter jedes einzelnen Kommandos nach Token durchsucht, die zu ersetzen sind. Es gibt acht Formen der Erweiterung:
  1. Klammererweiterung { , }
  2. Tildenerweiterung ~
  3. Parameter- und Variablenerweiterung ${ }
  4. Kommandosubstitution ` ` oder $( )
  5. Arithmetische Erweiterung $[ ]
  6. Prozeßsubstitution <( )
  7. Worttrennung
  8. Pfadnamenerweiterung * ? [ ]

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.

Klammererweiterung

   

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.

Tildenerweiterung

  

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.

Parametererweiterung

 

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.

${ Parameter}
Der Wert des Parameters wird eingesetzt. Die geschweiften Klammern sind zwingend, wenn ein Positionsparameter mit mehr als einer Ziffer benannt ist oder wenn der Variablenname nicht eindeutig von den darauffolgenden Zeichen getrennt werden kann.

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.

${ Parameter :- Wort}
Benutzung von Standardwerten. Wenn der Parameter ungesetzt oder leer ist, wird das Wort anstelle des gesamten Ausdrucks eingesetzt.

${ Parameter := Wort}
Setzen von Standardwerten. Wenn der Parameter ungesetzt oder leer ist, wird der Inhalt des Wortes dem Parameter zugewiesen und der neue Parameter eingesetzt. Den Positionsparametern und den speziellen Parametern kann allerdings auch auf diese Weise kein Wert zugewiesen werden!

${ Parameter :? Wort}
gibt eine Fehlermeldung, wenn der Parameter leer oder ungesetzt ist. Der Inhalt von Wort wird als Fehlermeldung auf der Standardfehlerausgabe ausgegeben und eine nichtinteraktive Shell wird verlassen. Wenn der Parameter gültig gesetzt ist, wird sein Wert eingesetzt.

${ Parameter :+ Wort}
erzwingt die Benutzung eines anderen Wertes. Wenn der Parameter weder leer, noch ungesetzt ist, wird der Inhalt von Wort eingesetzt. Sonst wird nichts eingesetzt.

${ # Parameter}
wird durch die Anzahl der Zeichen im Parameter ersetzt. Wenn als Parameter ` *' oder ` @' angegeben werden, wird die gesamte Länge des erweiterten Parameters eingesetzt. Das ist die Längensumme aller Positionsparameter inklusive der Worttrenner.

${ Parameter # Wort}
und
${ Parameter ## Wort}
  Der Anfang der im Parameter enthaltenen Zeichenkette wird mit dem erweiterten Wort verglichen und der übereinstimmende Teil aus dem Parameter entfernt. Dabei werden Jokerzeichen (Wildcards) (` *', ` ?' und [...]) behandelt, wie bei der Pfadnamenerweiterung (Seite gif) beschrieben. Im Fall der Konstruktion mit einem ` #' wird das kürzeste passende Muster vom Parameter entfernt, im Fall der zwei ` ##' das längste.

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.

${ Parameter % Wort}
und
${ Parameter %% Wort}
 Das Ende der im Parameter enthaltenen Zeichenkette wird mit dem erweiterten Wort verglichen und der übereinstimmende Teil aus dem Parameter entfernt. Die Jokerzeichen werden auch hier wie bei der Pfadnamenerweiterung behandelt. Bei der Konstruktion mit einem ` %' wird das kürzeste passende Muster vom Parameter entfernt, bei der Konstruktion mit zwei ` %%' das längste.

Beispielsweise kann analog zum vorhergehenden Beispiel der reine    Pfadanteil eines absoluten Kommandos durch die Konstruktion dirname=${pathname%/*} aus der Zeichenkette in pathname gezogen werden.

Kommandosubstitution

   Die Kommandosubstitution ermöglicht es, die Ausgabe eines Kommandos direkt einer Shellvariablen zuzuweisen. Es gibt zwei mögliche Formen der Kommandosubstitution:

$( 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.

Arithmetische Erweiterung

   

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):

+ -
die Vorzeichen
! ~
die logische und die bitweise Negation
* / %
Multiplikation, Division und Modulo (Rest bei ganzzahliger Division)
+ -
Addition und Subtraktion
<< >>
bitweise Links- und Rechts-Shift-Operation
<= >= < >
die Vergleiche
== !=
gleich und ungleich
&
bitweise Addition
^
bitweise XOR (Exclusiv-ODER)
|
bitweise ODER
&&
logisch UND
||
logisch ODER
Zuweisungen
durch die Zuweisungsoperatoren = *= /= %= += -= <<= >>= &= ^= |= kann wie in der Programmiersprache C eine Zuweisung mit einer Rechenoperation verbunden werden; zum Beispiel der Ausdruck
let zahl=$zahl+1
kann durch den Zuweisungsoperator ` +=' zu
let zahl+=1
verkürzt werden

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.

Prozeßsubstitution

  Eine dem Pipelining ähnliche Erweiterung wird durch die Prozeßsubstitution angeboten. Durch die beiden Konstruktionen
<( Subkommando)
>( Subkommando)
wird das Subkommando gestartet und sein Aus- bzw Eingabekanal mit einer automatisch erzeugten ``named pipe'' oder FIFO-Datei verbunden. Auf der Kommandozeile wird die Konstruktion durch den Namen dieser FIFO-Datei ersetzt, so daß das eigentlich aufgerufene Kommando aus dieser Datei lesen bzw. dorthin schreiben kann.

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.

Worttrennung

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.

Pfadnamenerweiterung

 

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:

*
paßt auf alle Zeichenketten, einschließlich der leeren Zeichenkette
?
paßt auf jedes einzelne Zeichen, außer auf das Zeilenende
[...]
paßt auf alle der in den eckigen Klammern eingeschlossenen Zeichen. Ein Paar Zeichen mit einem Minuszeichen dazwischen ist ein Bereich. Dieser Bereich enthält alle Zeichen, die nach lexikalischer Ordnung zwischen den beiden begrenzenden Zeichen angeordnet sind. Wenn das erste Zeichen ein Ausrufezeichen (` !') oder ein Caret (` ^') 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.

Quotenreduktion

Nach allen Erweiterungen werden die unquotierten Fluchtsymbole und Apostrophe entfernt.



next up previous contents index
Next: Synonyme Up: bash Previous: Parameter



Linux Anwenderhandbuch -- Copyright 1993, 1994, 1995 S. Hetze, D. Hohndel, O. Kirch, M. Müller