6.4 Rückgabewert aus einer Funktion
Sie haben verschiedene Möglichkeiten, ein Ergebnis von einer Funktion zu erhalten:
|
mit dem Schlüsselwort return |
|
mit globalen Variablen |
|
mittels echo wird das Ergebnis in die Standardausgabe ausgegeben und in der Hauptfunktion eine Kommando-Substitution vorgenommen. |
6.4.1 Rückgabewert mit return
Wird der Befehl return innerhalb einer Funktion ausgeführt, wird die Funktion verlassen und der Wert n als Ganzzahl zurückgegeben. Die Syntax:
return [n]
Wird hierbei nicht der Parameter n verwendet, dann wird der Rückgabewert des zuletzt ausgeführten Kommandos zurückgegeben. Für n können Sie einen Wert zwischen 0 bis 255 angeben. Negative Werte sind ebenfalls möglich. Den Rückgabewert von return kann man dann im Hauptprogramm des Scripts mit der Variablen $? auswerten.
Hinweis Verwendet man kein return innerhalb einer Funktion, kann man dennoch die Variable $? auswerten. Allerdings befindet sich darin dann der Exit-Status des zuletzt ausgeführten Kommandos in der Funktion.
|
# Demonstriert die Verwendung von Parametern
# Name: afunc9
# Funktion usage
usage() {
if [ $# -lt 1 ]
then
echo "usage: $0 datei_zum_lesen"
return 1 # return-Code 1 zurückgeben : Fehler
fi
return 0 # return-Code 0 zurückgeben : Ok
}
# Hauptprogramm
usage $*
# Wurde 1 aus usage zurückgegeben ...
if [ $? -eq 1 ]
then
printf "Bitte Datei zum Lesen eingeben : "
read file
else
file=$1
fi
echo "Datei $file wird gelesen"
Das Script bei der Ausführung:
you@host > ./afunc9
usage: ./afunc1 datei_zum_lesen
Bitte Datei zum Lesen eingeben : testfile.dat
Datei testfile.dat wird gelesen
you@host > ./afunc9 testfile.dat
Datei testfile.dat wird gelesen
Im folgenden Script gibt die Funktion usage den Rückgabewert 1 zurück, wenn keine Datei als Argument zum Lesen angegeben wurde. Im Hauptprogramm werten wir dann die Variable $? aus. Befindet sich hier der Wert 1 (von der Funktion usage), wird der Anwender erneut aufgefordert, eine Datei zum Lesen einzugeben.
6.4.2 Rückgabewert mit echo und einer Kommando-Substitution
Sicherlich wird sich der ein oder andere hier fragen, wie man denn nun tatsächlich »echte« Werte wie Ergebnisse mathematischer Berechnungen oder Zeichenketten aus einer Funktion zurückgeben kann. Hierfür kommt nur die bereits bekannte Kommando-Substitution in Frage. Das Prinzip ist einfach: Sie geben das Ergebnis in der Funktion mittels echo auf die Standardausgabe aus und im Hauptprogramm leiten Sie diese Daten mit einer Kommando-Substitution in eine Variable um.
variable=`functions_name arg1 arg2 ... arg_n`
Hierzu ein Beispiel:
# Demonstriert die Verwendung von Parametern
# Name: afunc10
# Funktion verdoppeln
verdoppeln() {
val=`expr $1 \* 2`
echo $val
}
#Funktion halbieren
halbieren() {
val=`expr $1 / 2`
echo $val
}
# Alle Kleinbuchstaben zu Grossbuchstaben
upper() {
echo $string | tr 'a-z' 'A-Z'
}
# Alle Grossbuchstaben zu Kleinbuchstaben
lower() {
echo $string | tr 'A-Z' 'a-z'
}
# Hauptprogramm
val=`verdoppeln 25`
echo "verdoppeln 25 = $val"
# So geht es auch ...
echo "halbieren 20 = `halbieren 20`"
string="Hallo Welt"
ustring=`upper $string`
echo "upper $string = $ustring"
string="Hallo Welt"
echo "lower $string = `lower $string`"
Das Script bei der Ausführung:
you@host > ./afunc10
verdoppeln 25 = 50
halbieren 20 = 10
upper Hallo Welt = HALLO WELT
lower Hallo Welt = hallo welt
Rückgabe mehrerer Werte aus einer Funktion
Mit derselben Methode, die eben verwendet wurde, ist es auch möglich, mehrere Werte aus einer Funktion zurückzugeben. Hierzu müssen Sie nur alle Variablen als eine Zeichenkette mittels echo auf die Standardausgabe schreiben und in der Hauptfunktion diese Zeichenkette mittels set wieder auf die einzelnen Positionsparameter aufsplitten. Das Beispiel dazu:
# Demonstriert die Verwendung von Parametern
# Name: afunc11
# Funktion verdoppeln
verdoppeln_und_halbieren() {
val1=`expr $1 \* 2`
val2=`expr $1 / 2`
echo $val1 $val2
}
# Hauptprogramm
val=`verdoppeln_und_halbieren 20`
# Aufsplitten auf die einzelnen Positionsparameter
set $val
echo "verdoppeln 20 = $1"
echo "halbieren 20 = $2"
Das Script bei der Ausführung:
you@host > ./afunc11
verdoppeln 20 = 40
halbieren 20 = 10
6.4.3 Rückgabewert ohne eine echte Rückgabe (lokale Variable)
Die letzte Methode besteht darin, eine Variable aus einer Funktion, also auch in der Hauptfunktion, zu verwenden. Für jemanden, der schon in anderen Programmiersprachen Erfahrung gesammelt hat, dürfte dies recht ungewöhnlich sein, weil es von der üblichen Struktur der Programmierung abweicht. Da aber alle Funktionen auf alle Variablen des Hauptprogramms zugreifen können, ist dies hier möglich. Ein Beispiel:
# Demonstriert die Verwendung von Parametern
# Name: afunc12
# Funktion verdoppeln
verdoppeln_und_halbieren() {
val1=`expr $1 \* 2`
val2=`expr $1 / 2`
}
# Hauptprogramm
verdoppeln_und_halbieren 20
echo "verdoppeln 20 = $val1"
echo "halbieren 20 = $val2"
6.4.4 Funktionen und exit
Beachten Sie bitte: Wenn Sie eine Funktion mit exit beschließen, beenden Sie hiermit das komplette Script bzw. die Subshell. Der exit-Befehl reißt das komplette Script in den Beendigungsstatus. Dies kann bspw. gewollt sein, wenn eine Funktion bzw. ein Script nicht die Daten (Argumente) erhält, die für ein sinnvolles Weiterarbeiten erforderlich wären. Ein Beispiel ist die Übergabe von Argumenten aus der Kommandozeile.
# Demonstriert die Verwendung von Parametern
# Name: afunc13
# Funktion usage
usage() {
if [ $# -lt 1 ]
then
echo "usage: $0 datei_zum_lesen"
exit 1
fi
}
# Hauptprogramm
echo "Vor der Funktion ..."
usage $*
echo "... nach der Funktion"
Das Script bei der Ausführung:
you@host > ./afunc13
Vor der Funktion ...
usage: ./afunc12 datei_zum_lesen
you@host > echo $?
1
you@host > ./afunc13 test
Vor der Funktion ...
... nach der Funktion
you@host > echo $?
0
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.
|