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.3 Parameterübergabdowntop

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

Rheinwerk Computing

6.3.1 FUNCNAME (Bash only)  toptop

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.



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.


Nutzungsbestimmungen | Datenschutz | Impressum

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