Next: Ablaufsteuerung Up: Bourne-Shell als Kommando- und Previous: Argumentübergabe beim Aufruf eines
Shell-Variablen
-
Shell-Variablen speichern Zeichenketten. Namen von Shell-Variablen müssen mit einem
Buchstaben beginnen, dem Buchstaben, Ziffern und Unterstreichungszeichen folgen können.
Die Zuweisung eines Zeichenkettenwertes geschieht folgendermaßen
$ varname=zeichenkette
Beispiel:$ farbe=blau $ vorname=Hans
Bemerkung:Variable werden durch ihre Verwendung (Nennung des Namens) definiert, sie besitzen standardmäßig den Wert der leeren Zeichenkette.
-
Wenn die zuzuweisende Zeichenkette Leerzeichen, Tabulatorzeichen oder Newlinezeichen
enthält, so muß die Zeichenkette markiert werden, z.B.
$ name="ANTON ADLER" $ name=ANTON\ ADLER $ name='ANTON ADLER'
Bemerkung: Markierungsmechanismen der Shell werden noch genauer erläutert -
Eine Variable kann mit dem Attribut ,,Nur lesen`` versehen werden, so daß ihr Wert
nicht mehr verändert werden kann, z.B.
$ einrichtung="Fachbereich Informatik" $ readonly einrichtung
-
Shell-Variable besitzen einen definierten Gültigkeitsbereich, sie sind
standardmäßig lokal bezüglich des aktuellen Shell-Prozesses. Eine Erweiterung
des Gültigkeitsbereiches auf untergeordnete Shell-Instanzen (Kindprozesse) ist über
das export -Kommando möglich, z.B.
$ export einrichtung
Bemerkung: export ohne Argument liefert eine Liste der exportierten Variablen -
Der Zugriff auf den aktuellen Wert einer Variablen geschieht dadurch, daß vor den
Variablenname das Zeichen $ gesetzt wird, z.B.:
$einrichtung $farbe
somit liefert$ echo $einrichtung Fachbereich Informatik
während echo für eine Variable, der noch kein Wert zugewiesen wurde, nichts liefert:$ echo $xyz $
Der Wert einer exportierten Variablen kann in einer Sub-Shell nur lokal verändert werden.
Beispiel:$ trainer=ANTON\ ADLER $ echo $trainer ANTON ADLER $ export trainer $ sh $ echo $trainer ANTON ADLER $ trainer=BERND\ BIBER $ echo $trainer BERND BIBER $ exit $ echo $trainer ANTON ADLER $
-
Mit dem Kommando unset kann eine Variablendefinition rückgängig gemacht
werden, z.B.
$ unset trainer
-
Wenn der Wert einer Variablen mit einer nicht dazugehörigen Zeichenfolge verkettet
werden soll, so muß der Variablenname in geschweiften Klammern eingeschlossen werden,
z.B.
$ jahreszeit=Winter $ echo ${jahreszeit}ferien Winterferien $ file=prog $ echo ${file}.c prog.c
-
Spezielle Ersetzungsmechanismen für Shell-Variable
${name:-wort} ersetzt name durch seinen Wert, falls dieser ungleich Null ist, ansonsten wird wort eingesetzt ${name:=wort} ersetzt name durch seinen Wert, falls dieser ungleich Null ist, andernfalls wird wort eingesetzt und name zugewiesen. ${name:?wort} ersetzt name durch seinen Wert, falls dieser ungleich Null ist, andernfalls wird wort auf der Standardfehlerausgabe ausgegeben und das Script abgebrochen. ${name:+wort} Setzt den Wert wort ein, falls name ungleich Null ist, ansonsten wird nichts ersetzt. -
Shell-Variablen werden oft verwendet, um den Dialog am Terminal zu erleichtern, d.h. den
,,Tippaufwand`` zu reduzieren, indem z.B. für Pfadnamen Synonyme eingeführt werden:
$ dir=/afs/tu-chemnitz.de/home/urz/s/stb $ ls $dir $ ls $dir/*.c
Falls z.B. /afs/tu-chemnitz.de/home/urz/s/stb/cmd ein Shell-Script enthält, so ist der Aufruf auch einfach möglich$ $dir/cmd ...
-
Folgende spezielle Shell-Variablen besitzen einen von der Shell vordefinierten Wert:
# Anzahl der Argumente, die dem Shell-Script übergeben wurden (bzw. Anzahl der mittels set gesetzten Shell-Variablen i (Werte $1, $2, ...) * Bezugnahme auf alle Argumentwerte $1, $2, etc. (z.B. beim Aufruf des Shell-Scripts) @ analog wie $*; die Angabe ,,$@`` bezieht sich auf alle Variablen ,,$1``, ,,$2`` etc. Name des aktuell ausgeführten Shell-Scripts - Optionen dieser Shell ? Exitstatus (Return value) des letzten Kommandos $ Prozessnummer der Shell ! Prozessnummer des letzten Kommandos mit & IFS Liste von Worttrennzeichen in Argument MAIL File, das bei Änderung ,,you have mail``- Meldung bewirkt PS1 Primäre Prompt-Zeichenkette; Voreinstellung '' PS2 Sekundäre Prompt-Zeichenkette; Voreinstellung '>' -
Die folgenden speziellen Shell-Variablen sind nicht automatisch gesetzt; ihre Werte werden
gewöhnlich beim Sitzungsbeginn festgelegt (die Wertzuweisungen sind dabei im File
$HOME/.profile enthalten). Sie können jedoch wie ,,normale`` Variablen modifiziert
werden.
HOME Standardargument für das cd- Kommando (HOME-Verzeichnis, für jeden Nutzer im Passwordfile /etc/passwd festgelegt) PATH Suchpfade für Kommandos, d.h. Reihenfolge der Verzeichnisse, in denen nach den Programmen bzw. Shell-Scripts gesucht werden soll. Die einzelnen Verzeichnisse sind durch das Zeichen : voneinander getrennt (p1:p2:p3:...:pn) -
Beispiele:
$ echo $PATH /bin:/usr/bin/: # 1. /bin # 2. /usr/bin # 3. aktuelles Verzeichnis $ PATH=:/bin:/usr/bin:$HOME/bin # Suchreihenfolge: # 1. aktuelles Verzeichnis # 2. /bin # 3. /usr/bin # 4. Verzeichnis bin im Homeverzeichnis $ PATH=/bin::/usr/bin # Suchreihenfolge: # 1. /bin # 2. aktuelles Verzeichnis # 3. /usr/bin
-
Bemerkung:
- Privatversionen von ,,Systemprogrammen``
- Suchreihenfolge Antwortzeitverhalten
PS1 Festlegung der Promptzeichenkette der Shell, standardmäßig $ Beispiel: PS1=``Sie wünschen:''
PS2 Promptzeichenkette bei Folgeeingaben, standardmäßig > Beispiel: $echo 'Hallo >wie geht's?'
IFS Separatorzeichen der Shell, standardmäßig Leerzeichen, Tabulator- und Newlinezeichen MAIL Name des Nachrichtenfiles des Nutzers; er wird benachrichtet, wenn Nachrichten in dem File eingetroffen sind -
Kommandosubstitution
`cmd` wird ersetzt durch die Standardausgabe von cmd-
Beispiel:
$ date # Uhrzeit, Datum Don Mär 16 11:18:58 MET 2000 $ echo Aktuelles Datum und Uhrzeit: `date` Aktuelles Datum und Uhrzeit: Don Mär 16 11:19:59 MET 2000 $ $ pwd /afs/tu-chemnitz.de/home/urz/s/stb $ dir=`pwd` $ echo $dir /afs/tu-chemnitz.de/home/urz/s/stb
-
Beispiel:
-
Textsubstitution und Markierungsmöglichkeiten (quoting)
-
Die Shell führt Substitutionen in folgender Reihenfolge durch:
- 1.
-
Variablensubstitution
alle mit $ beginnenden Worte werden ersetzt durch ihren Zeichenkettenwert - 2.
-
Kommandosubstitution
`cmd` wird ersetzt durch Standardausgabe von cmd - 3.
-
Leerzeichen-, Tabulator-, Newline-Interpretation
Das nach 1. und 2. entstehende Ergebnis wird nach Trennzeichen durchsucht und die entsprechende Separierung durchgeführt (Ausnahmen: Trennzeichen in markierten Worten) - 4.
-
Filenamengenerierung
Auswertung der Metazeichen *, ?, [-]
-
Markierungsmechanismen (quoting) dienen dazu, die Sonderbedeutung von Metazeichen
aufzuheben
- 1.
- z hebt die (eventuelle) Sonderbedeutung von z auf
- 2.
- In Apostrophe eingeschlossene Texte ('...' ) werden keinerlei Textsubstitution unterworfen. Das Zeichen ' darf in diesem Text nicht enthalten sein.
- 3.
- Bei in Anführungszeichen (``...'') eingeschlossenen Texten ist die Sonderbedeutung der Metazeichen außer , `, `` und $ aufgehoben, d.h. die Shell führt Kommando- und Variablensubstituion durch.
-
Beispiel:
$ echo "heute ist `date`; HOME-Verzeichnis: $HOME" heute ist Don Mär 16 11:21:40 MET 2000; HOME-Verzeichnis: /afs/tu-chemnitz.de/home/urz/s/stb $ echo "1 \$ = 1.95 DM" 1 $ = 1.95 DM $
-
Die Shell führt Substitutionen in folgender Reihenfolge durch:
Next: Ablaufsteuerung Up: Bourne-Shell als Kommando- und Previous: Argumentübergabe beim Aufruf eines