Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

 << zurück
Shell-Programmierung von Jürgen Wolf
Einführung, Praxis, Referenz
Buch: Shell-Programmierung

Shell-Programmierung
782 S., mit CD, 44,90 Euro
Rheinwerk Computing
ISBN 3-89842-683-1
gp Kapitel 6 Funktionen
  gp 6.1 Definition
    gp 6.1.1 Definition (Bash und Korn-Shell only)
    gp 6.1.2 Funktionsaufruf
    gp 6.1.3 Funktionen exportieren
    gp 6.1.4 Aufrufreihenfolge
    gp 6.1.5 Who is who
    gp 6.1.6 Aufruf selbst bestimmen
    gp 6.1.7 Funktionen auflisten
  gp 6.2 Funktionen, die Funktionen aufrufen
  gp 6.3 Parameterübergabe
    gp 6.3.1 FUNCNAME (Bash only)
  gp 6.4 Rückgabewert aus einer Funktion
    gp 6.4.1 Rückgabewert mit return
    gp 6.4.2 Rückgabewert mit echo und einer Kommando-Substitution
    gp 6.4.3 Rückgabewert ohne eine echte Rückgabe (lokale Variable)
    gp 6.4.4 Funktionen und exit
  gp 6.5 Lokale contra globale Variablen
    gp 6.5.1 Lokale Variablen (Bash und Korn-Shell only)
  gp 6.6 alias und unalias
  gp 6.7 Autoload (Korn-Shell only)


Rheinwerk Computing

6.4 Rückgabewert aus einer Funktiodowntop

Sie haben verschiedene Möglichkeiten, ein Ergebnis von einer Funktion zu erhalten:

gp  mit dem Schlüsselwort return
gp  mit globalen Variablen
gp  mittels echo wird das Ergebnis in die Standardausgabe ausgegeben und in der Hauptfunktion eine Kommando-Substitution vorgenommen.

Rheinwerk Computing

6.4.1 Rückgabewert mit return  downtop

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.


Rheinwerk Computing

6.4.2 Rückgabewert mit echo und einer Kommando-Substitution  downtop

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

Rheinwerk Computing

6.4.3 Rückgabewert ohne eine echte Rückgabe (lokale Variable)  downtop

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"

Rheinwerk Computing

6.4.4 Funktionen und exit  toptop

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


Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.

>> Zum Feedback-Formular
 << zurück
  
  Zum Katalog
Zum Katalog: Shell-Programmierung
Shell-Programmierung
bestellen
 Buchtipps
Zum Katalog: Shell-Programmierung






 Shell-Programmierung


Zum Katalog: Linux-Server






 Linux-Server


Zum Katalog: Das Komplettpaket LPIC-1 & LPIC-2






 Das Komplettpaket
 LPIC-1 & LPIC-2


Zum Katalog: Linux-Hochverfügbarkeit






 Linux-
 Hochverfügbarkeit


Zum Katalog: Linux Handbuch






 Linux Handbuch


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo





Copyright © Rheinwerk Verlag GmbH 2005
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Rheinwerk Computing]

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de