3.9 Vorgabewerte für Variablen
 
Da Sie sich nicht immer darauf verlassen können, dass die Anwender Ihrer Scrips schon das Richtige eingeben werden, gibt es so genannte Vorgabewerte für Variablen. Dass ich hier nicht »Vorgabewerte für Argumente« schreibe, deutet schon darauf hin, dass dieses Anwendungsgebiet nicht nur für die Kommandozeile gilt, sondern auch für Variablen im Allgemeinen. Neben den Positionsparametern können Sie damit also auch jegliche Art von Benutzereingaben bearbeiten.
Wenn Sie zu Kapitel 4, Kontrollstrukturen, kommen, wird Ihnen auffallen, dass die Verwendung von Vorgabewerten den if-then-else-Konstrukten ähnelt. Hierzu ein simples Beispiel. Es sollen aus einem Verzeichnis alle Verzeichnisse, die sich darin befinden, ausgegeben werden. Nehmen wir als Scriptnamen »lsdirs«. Rufen Sie dieses Script ohne ein Argument auf, wird durch einen Standardwert (im Beispiel einfach das aktuelle Arbeitsverzeichnis pwd) das aufzulistende Verzeichnis vorgegeben. Hier das Shellscript:
# Vorgabewerte setzen
# Name: lsdirs
directory=${1:-`pwd`}
ls -ld $directory | grep ^d
Das Script bei der Ausführung:
you@host > ./lsdirs
drwxr-xr-x 2 tot users 72 2005–02–07 10:29 bin
drwx------ 3 tot users 424 2005–02–07 11:29 Desktop
drwxr-xr-x 2 tot users 112 2005–02–17 08:11 Documents
drwxr-xr-x 4 tot users 208 2005–02–07 10:29 HelpExplorer
drwxr-xr-x 2 tot users 80 2005–02–05 15:03 public_html
drwxr-xr-x 3 tot users 216 2004–09–04 19:55 Setup
drwxr-xr-x 4 tot users 304 2005–02–15 07:19 Shellbuch
you@host > ./lsdirs /home/tot/Shellbuch
drwxr-xr-x 2 tot users 2712 2005–02–09 03:57 chm_pdf
drwxr-xr-x 2 tot users 128 2005–02–05 15:15 Planung
you@host > ./lsdirs /home
drwxr-xr-x 27 tot users 2040 2005–02–18 00:30 tot
drwxr-xr-x 45 you users 2040 2005–01–28 02:32 you
Zugegeben, das mit dem grep ^d hätte man auch mit einem einfachen test-Kommando realisieren können, aber hier müsste ich wieder auf ein Thema vorgreifen, was bisher noch nicht behandelt wurde. Durch ^d werden einfach alle Zeilen von ls –ld herausgezogen, die mit einem d (hier für die Dateiart directory) anfangen. Mit der Zeile
directory=${1:-`pwd`}
übergeben Sie der Variablen »directory« entweder den Wert des Positionsparameters $1 oder – wenn diese Variable leer ist – es wird stattdessen eine Kommando-Substitution durchgeführt (hier pwd) und deren Wert in »directory« abgelegt. Es gibt noch mehr solcher Konstruktionen für Standardwerte von Variablen, wie sie hier mit ${var:–wort} verwendet wurde. Tabelle 3.1 nennt alle Möglichkeiten:
Tabelle 3.1
Vorgabewerte für Variablen
Vorgabewert-Konstrukt
|
Bedeutung
|
${var:–wort}
|
Ist var mit einem Inhalt besetzt (nicht Null), wird var zurückgegeben. Ansonsten wird die Variable wort verwendet.
|
${var:+wort}
|
Hier wird wort zurückgegeben, wenn die var nicht (!) leer ist. Ansonsten wird ein Null-Wert zurückgegeben. Praktisch das Gegenteil von ${var:–wort}.
|
${var:=wort}
|
Ist var nicht gesetzt oder entspricht var einem Null-Wert, dann setze var=wort. Ansonsten wird var zurückgegeben.
|
${var:?wort}
|
Gibt var zurück, wenn var nicht Null ist. Ansonsten: Ist ein wort gesetzt, dann eben wort ausgeben. Wenn kein wort angegeben wurde, einen vordefinierten Text verwenden und das Shellscript verlassen.
|
Anmerkung wort kann hier in allen Ausdrücken entweder ein String sein oder eben ein Ausdruck (wie im Beispiel eine Kommando-Substitution).
Hinweis Lassen Sie bei diesen Ausdrücken den Doppelpunkt weg, ändert sich die erste Abfrage so, dass nur überprüft wird, ob diese Variable definiert ist oder nicht.
|
Zu den Standardvorgabewerten soll hier auch noch ein einfaches Beispiel-Script zur Demonstration der einzelnen Funktionalitäten gezeigt werden. Das Shellscript und seine Ausführung sollten durch das eben Erläuterte selbsterklärend sein:
# Demonstriert Vorgabewerte
# Name: adefaultvar
var2=var2
var4=var4
var5=var5
# Erstes Argument in der Kommandozeile, falls nicht verwendet
echo ${1:-"Alternatives_erstes_Argument"}
# Hier ist var1 nicht besetzt – also Leerstring zurückgeben
echo ${var1:+"wort1"}
# var2 ist gesetzt ("var2") und wird somit von "wort2"
überschrieben
echo ${var2:+"wort2"}
# Hier ist var3 nicht gesetzt und wird vom String "wort3"
beschrieben
echo ${var3:="wort3"}
# Hier ist var4 besetzt mit "var4" und wird so auch zurückgegeben
echo ${var4:="wort4"}
# var5 ("var5") ist nicht leer und wird somit auch zurückgegeben
echo ${var5:?"wort5"}
# var6 ist leer und somit wird eine Fehlermeldung mit dem Text
"wort6" ...
# ausgegeben und das Shellscript beendet
echo ${var6:?"wort6"}
echo "Dieser String wird nie ausgegeben"
Das Script bei der Ausführung:
you@host > ./adefaultvar
Alternatives_erstes_Argument
wort2
wort3
var4
var5
./adefaultvar: line 22: var6: wort6
you@host > ./adefaultvar mein_Argument
mein_Argument
wort2
wort3
var4
var5
./adefaultvar: line 22: var6: wort6
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.
|