Inhaltsverzeichnis
Was wäre ein Shellscript, wenn wir ihm keine Parameter übergeben könnten? Natürlich bietet die Shell diese Möglichkeit, noch dazu auf eine sehr einfache Art und Weise.
Zunächst noch einmal die Erinnerung, was sind Kommandozeilenparameter? Wenn wir ein Script schreiben, das z.B. addiere heißt und das zwei Zahlen addieren soll, dann werden wir vom Anwender des Scripts erwarten, dass er die beiden zu addierenden Zahlen als Parameter übergibt, dass er also z.B. schreibt:
addiere 10 20
In diesem Fall wäre der Kommandozeilenparameter Nummer 1 also die 10, der Parameter2 die 20. Innerhalb der Shell können diese Parameter angesprochen werden mit $1 und $2. Unser Script könnte also folgendermaßen aussehen:
#!/bin/bash let ergebnis=$1+$2 echo $1 plus $2 ergibt $ergebnis
Spezielle Variablen für die Kommandozeilenparameter
Grundsätzlich unterstützt die Bourne-Shell bis zu neun Parameter ($1 – $9), die direkt angesprochen werden können. Die Bourne-Again-Shell (bash) kann bis zu 99 Parameter direkt ansprechen, indem die Nummern der Parametr oberhalb des neunten in geschweifte Klammern gesetzt werden (${10} – ${99}). Der Parameter $0 enthält, wie in allen anderen Hochsprachen auch, den Namen des Scripts, wie es aufgerufen wurde:
Script | Parameter1 | Parameter2 | Parameter3 | Parameter4 | … |
$0 | $1 | $2 | $3 | $4 | … |
Oft ist es gar nicht notwendig, die Parameter einzeln anzusprechen. Wenn wir z.B. einen Unix-Befehl umbenennen wollten, z.B. cp in kopiere, dann wäre es ja lästig, wenn wir innerhalb des Scripts die ganzen denkbaren Parameter einzeln angeben müssten. Dazu gibt es die Sonderform $@ und $*, die beide alle angegebenen Parameter bezeichnen. In unserem Script müßten also nur die Zeilen stehen:
#!/bin/bash cp $*
Egal, wieviele Parameter jetzt angegeben wurden, alle werden einfach durch das $* übermittelt.
Sehr häufig ist es notwendig zu erfahren, wieviele Parameter überhaupt angegeben wurden. Dazu dient die spezielle Variable $#.
Zusammenfassend existieren also folgende spezielle Variablen für die Kommandozeilenparameter:
${n} | Der nte Parameter bei mehr als 9 Parametern (nur bash) |
---|---|
$@ | Steht für alle angegebenen Parameter |
$* | Steht für alle angegebenen Parameter |
$# | Steht für die Anzahl aller angegebenen Parameter |
Der Unterschied zwischen $* und $@ ist marginal und wird sehr selten gebraucht. Er bezieht sich nur auf die Frage, wie die Shell reagiert, wenn $* oder $@ in doppelten Anführungszeichen stehen.
Das | wird ersetzt durch |
---|---|
„$*“ | „$1 $2 $3 …“ |
„$@“ | „$1“ „$2“ „$3“ … |
Der Befehl shift
Der Befehl shift verschiebt die ganze Kette der Kommandozeilenparameter um eines nach links. Das bedeutet, der Parameter 2 wird zum Parameter1, der Parameter3 zum Parameter2 usw. Der erste Parameter fällt weg. Damit kann eine unbestimmte Anzahl von Parametern bearbeitet werden, indem in einer Schleife immer nur der erste Parameter verarbeitet wird und anschließend der Befehl shift aufgerufen wird. Die Schleife wird solange wiederholt, bis keine Parameter mehr übrig sind.
Auch wenn die Schleifenkonstruktion noch unbekannt ist folgt hier ein Beispiel. Das folgende Script gibt alle eingegebenen Parameter untereinander aus:
#!/bin/bash while [ $# -gt 0 ] #Solange die Anzahl der Parameter ($#) größer 0 do echo $1 #Ausgabe des ersten Parameters shift #Parameter verschieben $2->$1, $3->$2, $4->$3,... done
Der Befehl set
Normale Variablen bekommen ihre Werte durch das Gleichheitszeichen. Die Konstruktion
Variablenname=Wert
ist aber für Kommandozeilenparameter nicht möglich. Es ist also verboten zu schreiben
1=Hans
um damit $1 den Wert Hans zu geben. Falls in seltenen Fällen es doch notwendig sein sollte, die Kommandozeilenparameter zu ändern, so kann das mit dem Befehl set erledigt werden. Allerdings können nur alle Parameter gleichzeitig verändert werden. set schreibt einfach die gesamte Parameterkette neu.
Das heißt, alle Parameter, die dem Befehl set übergeben werden, werden so behandelt, als wären sie dem Script übergeben werden. Die echten Parameter, die dem Script wirklich übergeben wurden fallen dadurch alle weg, auch wenn set weniger Parameter erhält, als dem Script mitgegeben wurden.
Diese Anwendung von set macht zum Beispiel Sinn, wenn wir ein Script schreiben wollen, das zwingend zwei Kommandoparameter braucht. Wenn wir am Anfang die Anzahl der Parameter überprüfen und merken, dass das Script keine Parameter bekommen hat, so können wir mit set voreingestellte Parameter definieren.