6.3 Parameterübergabe
Da Sie nun wissen, dass Funktionen wie gewöhnliche Kommandos ausgeführt werden, stellt sich die Frage, ob dies auch für die Argumente gilt. Und in der Tat erfolgt die Übergabe von Argumenten an eine Funktion nach demselben Schema wie schon bei den gewöhnlichen Kommandos bzw. Scriptaufrufen.
functions_name arg1 arg2 arg3 ... arg_n
Und, so wie Sie es schon von den Argumenten aus der Kommandozeile her kennen, können Sie auch in der Funktion auf die einzelnen Variablen mit den Positionsparametern $1, $2 bis $9 bzw. ${n} zugreifen. Genauso sieht dies auch mit $@ und $* aus, worin Sie alle übergebenen Argumente in Form einer Liste bzw. Zeichenkette wieder finden. Die Anzahl der Parameter finden Sie in der Funktion ebenfalls wieder mit der Variable $#. Allerdings bleibt der Positionsparameter $0 weiterhin dem Scriptnamen vorbehalten und nicht dem Funktionsnamen.
# Demonstriert die Verwendung von Parametern
# Name: afunc5
# Funktion readarg
readarg() {
i=1
echo "Anzahl der Parameter, die übergeben wurden : $#"
for var in $*
do
echo "$i. Parameter : $var"
i=`expr $i + 1`
done
# Oder via Positionsparameter; die ersten drei
echo $1:$2:$3
}
# Hauptprogramm
printf "Ein paar Argumente bitte : "
read
readarg $REPLY
Das Script bei der Ausführung:
you@host > ./afunc5
Ein paar Argumente bitte : eins zwei drei vier
Anzahl der Parameter, die übergeben wurden : 4
1. Parameter : eins
2. Parameter : zwei
3. Parameter : drei
4. Parameter : vier
eins:zwei:drei
Um keine Missverständnisse aufkommen zu lassen: Die Parameter, die Sie an die Funktionen übergeben, haben nichts mit den Kommandozeilenparametern des Scripts zu tun, auch wenn eine Funktion nach demselben Schema arbeitet. Würden Sie die Kommandozeilenparameter eines Scripts einfach in einer Funktion verwenden, so würde die Funktion diese nicht sehen, weil sie von den eigentlichen Funktionsparametern überdeckt werden. Hier ein Beispiel, das zeigt, worauf ich hinaus will:
# Demonstriert die Verwendung von Parametern
# Name: afunc6
# Funktion readcmd
readcmd() {
echo "Anzahl der Parameter in der Kommandozeile : $#"
for var in $*
do
echo "$i. Parameter : $var"
i=`expr $i + 1`
done
}
# Hauptprogramm
echo "Vor der Funktion ..."
readcmd
echo "... nach der Funktion"
Das Script bei der Ausführung:
you@host > ./afunc6 eins zwei drei vier
Vor der Funktion ...
Anzahl der Parameter in der Kommandozeile : 0
... nach der Funktion
Wollen Sie die Kommandozeilenparameter in einer Funktion verwenden, müssen Sie die entsprechenden Parameter auch als Argument beim Funktionsaufruf mit angeben:
# Demonstriert die Verwendung von Parametern
# Name: afunc7
# Funktion readcmd
readcmd() {
echo "Anzahl der Parameter in der Kommandozeile : $#"
for var in $*
do
echo "$i. Parameter : $var"
i=`expr $i + 1`
done
}
# Hauptprogramm
echo "Vor der Funktion ..."
readcmd $*
echo "... nach der Funktion"
Das Script bei der Ausführung:
you@host > ./afunc7 eins zwei drei vier
Vor der Funktion ...
Anzahl der Parameter in der Kommandozeile : 4
. Parameter : eins
1. Parameter : zwei
2. Parameter : drei
3. Parameter : vier
... nach der Funktion
Natürlich können Sie auch einzelne Kommandozeilenparameter an eine Funktion übergeben, z. B.:
# Positionsparameter 1 und 3 an die Funktion übergeben
readcmd $1 $3
6.3.1 FUNCNAME (Bash only)
In der Bash ab Version 2.04 wird Ihnen eine Variable namens FUNCNAME angeboten, in der sich der Name der aktuell ausgeführten Funktion befindet.
# Demonstriert die Verwendung von Parametern
# Name: afunc8
# Funktion myname
myname() {
echo "Ich bin die Funktion: $FUNCNAME"
}
# Funktion andmyname
andmyname() {
echo "Und ich heiße $FUNCNAME"
}
# Hauptprogramm
echo "Vor der Funktion ..."
myname
andmyname
echo "... nach der Funktion"
Das Script bei der Ausführung:
you@host > ./afunc8
Vor der Funktion ...
Ich bin die Funktion: myname
Und ich heiße andmyname
... nach der Funktion
Im Hauptprogramm des Scripts ist diese Variable allerdings leer (""). Hierbei steht Ihnen ja weiterhin $0 zur Verfügung. Wollen Sie den Funktionsnamen innerhalb der Funktion löschen (warum auch immer), können Sie dies mit unset $FUNCNAME erreichen.
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.
|