Bash kurz & gut
von: Karsten Guenther
O'Reilly Verlag, 2012
ISBN: 9783868995244
Sprache: Deutsch
145 Seiten, Download: 3277 KB
Format: EPUB, PDF, auch als Online-Lesen
Parameterersetzungen
(Positions-) Parameter oder Variablen ersetzt die Bash in der Befehlszeile, wobei weitgehende Modifikationen an ihren Inhalten möglich sind. Den Inhalt von Parametern oder Variablen interpretiert die Bash als Zeichenkette. Die grundlegende Syntax für Parameter beginnt mit dem Dollarzeichen, optional gefolgt von einer öffnenden geschweiften Klammer, und endet (ebenfalls optional) mit einer schließenden geschweiften Klammer, bzw. dem ersten white space (Leerzeichen, Tabulator, NL). Geschweifte Klammern sind notwendig, um mehrstellige Positionsparameter (etwa: ${21}
) zu adressieren oder Variablennamen vom folgenden (nicht zum Variablennamen gehörenden) Text abzugrenzen (${
Variable
}
Text
). Die grundlegende Syntax ist:
Wenn das erste Zeichen des Parameters oder Variablennamens (unmittelbar nach der öffnenden geschweiften Klammer) ein Ausrufezeichen ist (${!
Parameter oder Variable
}
) interpretiert die Bash dies als indirekte Adressierung (indirect expansion). In diesem Fall ersetzt die Shell zunächst Parameter oder Variable
durch den Inhalt des entsprechenden Parameters bzw. der Variablen, bevor die eigentliche Expandierung erfolgt. Parameter oder Variable
enthält in diesem Fall den Namen einer Variablen, die expandiert wird. Zwei Ausnahmen berücksichtigt die Bash: ${!
Präfix
*}
und ${!
Name
[@]}
behandelt die Bash gesondert, siehe „Teilersetzungen“.
Dem Parameter oder Variablennamen kann ein Ausdruck folgen, der die Behandlung der (zu expandierenden) Inhalte steuert. Ein Doppelpunkt bewirkt, dass die Bash zunächst überprüft, ob die entsprechende Variable existiert (also gesetzt wurde: Variable
=...
) und ob ihr Inhalt von Null verschieden ist. Ohne den Doppelpunkt überprüft die Bash nur die Existenz einer Variablen.
Anmerkung: Das erste der folgenden Metazeichen nach der öffnenden geschweiften Klammer definiert die durchgeführte Expandierung. In manchen Situationen ist es sinnvoll oder sogar zwingend erforderlich, Metazeichen zwischen den geschweiften Klammer zu maskieren, entweder durch eine Backslash oder (einfache bzw. doppelte) Hochkommata.
Ersetzung durch Voreinstellung
Diese einfache Ersetzung expandiert zu Default
, falls Parameter oder Variable
ungesetzt oder mit dem Doppelpunkt, auch wenn ihr Inhalt leer ist. Ist der Inhalt vorhanden, expandiert ihn die Bash.
Ein typisches Beispiel: MINSWAP=${1:-10M}
definiert die minimale Größe auf 10M, falls kein abweichender Wert angegeben wurde.
Ersetzung mit Zuordnung
In diesem Fall definiert (setzt) die Bash eine Variable
mit Default
, falls diese zuvor nicht definiert – oder bei Angabe der Doppelpunkts auch leer – war. Positionsparameter und andere Shellvariablen lassen sich so nicht setzen. Existiert die Variable, expandiert sie mit ihrem aktuellen Inhalt.
Ein typisches Beispiel: : ${TMPDIR:=/tmp}
definiert die Variable $TMPDIR
, falls dies bisher nicht geschehen ist. :
(„Kontrollstrukturen“) wird eingesetzt, um diese Definition durchzuführen (echo
anstelle von :
zeigt die Zuordnung an, was oft in der Entwicklung nützt). eine Erweiterung von Variableninhalten ist so möglich: Variable
=${
Variable
:=
Erweiterung
}
hängt die Erweiterung an den vorherigen Inhalt an. Diese Ersetzung ist eine der häufigsten in Skripten und Funktionen.
Warnung
Dieser Ausdruck beschreibt keine Expandierung im eigentlichen Sinn. Die Message
wird in den Standardfehlerkanal ausgegeben, falls Parameter oder Variable
ungesetzt (bei Angabe des Doppelpunkts auch leer) ist. Nicht interaktive Shells terminieren anschließend. Dies ist eine sehr einfache Möglichkeit, Eingabefehler abzufangen, etwa so: File=${1:?missing filename.}
Die Variable $File
wird mit dem ersten Argument gesetzt. Fehlt diese, bleibt $File
leer; stattdessen erscheint die Warnung missing filename
.
Bedingte Ersetzungen
Die Bash ersetzt bei dieser Form nur dann Parameter oder Variable
durch Wert
, wenn diese schon existieren (bei Angabe des Doppelpunkts: nicht leer sind). Anderenfalls erfolgt keine Ersetzung. Diese Konstruktion findet sich meistens in verschachtelten Zuweisungen, z. B. als RESULT="$RESULT${RESULT:+ }$LSB_VERSION"
oder als logische Abfrage, ob eine Variable existiert: &{
Variable
:+1}
Teilersetzungen
Mit dieser Form ist es möglich, nur Teile der Ersetzungstexts (so genannte Substring Expansions) zu verwenden. Die Bash fügt vom Inhalt der Variablen ab der Position Offset
genau Länge
Zeichen ein. Fehlt die zweite Angabe, wird der Restinhalt expandiert. Beide Angaben Länge
und Offset
lassen sich als arithmetische Ausdrücke (siehe „Prozessersetzungen“) angeben, also zur Laufzeit berechnen. Länge
muss dabei eine positive Ganzzahl sein, Offset
berücksichtigt die Bash von links (Anfang des Inhalts), wenn der Wert positiv ist, von rechts (also dem Ende), falls negativ.
Falls Parameter oder Variable
@
ist (umfasst damit alle Positionsparameter, siehe S. 75), beginnt die Ausgabe von Länge
-Zeichen ab dem angegebenen Offset
.
Falls Parameter oder Variable
ein Array mit Index *
oder @
ist, interpretiert die Bash den Offset
als Indexnummer (beginnend mit 0
, also $Array[
Offset
]
), und gibt seine Länge
-Elemente aus:
Negative Offset
-Werte bezeichnen in diesem Fall das Element, das sich aus 1 + maximaler_Index
– Offset
berechnet. Mindestens ein Leerzeichen muss hier dem Doppelpunkt folgen, damit die Bash den Ausdruck nicht als :-
interpretiert:
Anmerkung: Bei Positionsparametern beginnt der Array-Index mit 1
, bei »normalen« Variablen mit 0
.
Präfix-Ersetzungen
Präfix-Ersetzungen sind spezielle Ersetzungen, die Variablennamen ausgeben, aber nicht ihre Inhalte. Die Bash sucht alle mit dem angegebenen Präfix
beginnenden Variablennamen heraus und zeigt sie, mit dem ersten Element der Variablen $IFS
getrennt, an:
Ob @
oder *
als Joker eingesetzt wird, spielt keine Rolle. Bei dieser Ersetzung handelt es sich um eine indirekte Adressierung.
Namensersetzungen
Namensersetzungen sind eine Variante der Präfix-Ersetzungen. Falls Name
ein Array ist, listet ${!
Name
[*]}
die Indizes der vorhandenen Elemente auf:
Bei Angabe von @
expandiert der Ausdruck zwischen doppelten Hochkommata zu einer Reihe von einzelnen, durch das erste $IFS
-Zeichen getrennten, Elementen....