Shell-Funktionen
Ab System V können in der Bourne-Shell auch Funktionen definiert werden -
eine weitere Strukturierungsmöglichkeit. Funktionen können in Shellskripts, aber auch interaktiv definiert werden. Sie lassen sich jedoch nicht wie Variablen exportieren. Sie werden nach folgender Syntax definiert: Funktionsname () {Kommandofolge }
Steht die schließende geschweifte Klammer nicht in einer eigenen Zeile, gehört
ein Strichpunkt davor. Die runden Klammern hinter dem Funktionsnamen teilen dem
Kommandozeileninterpreter der Shell mit, daß nun eine Funktion definiert werden
soll (und nicht ein Kommando Funktionsname aufgerufen wird). Es kann
keine Parameterliste in den Klammern definiert werden.
Der Aufruf der Shellfunktion erfolgt durch Angabe des Funktionsnamens, gefolgt
von Parametern (genauso wie der Aufruf eines Skripts). Die Parameter werden innerhalb
der Funktion genauso, wie beim Aufruf von Shellskripts über $1 bis $nn angesprochen.
Ein Wert kann mit der Anweisung 'return <Wert>' zurückgegeben werden,
er ist über den Parameter $? abfragbar. Beispiel:
isdir () # testet, ob $1 ein Verzeichnis ist
{
if [ -d $1 ] ; then
echo "$1 ist ein Verzeichnis" # Kontrolle zum Test
return 0
else
return 1
fi
}
Im Gegensatz zum Aufruf von Shell-Skripts werden Funktionen in der aktuellen Shell
ausgeführt und sie können bei der Boune-Shell nicht exportiert werden; die Bash
erlaubt dagegen das Exportieren mit export -f. Das folgende Beispiel
illustriert die Eigenschaften von Shellfunktionen.
Die folgende Funktion gibt den Eingangsparameter in römischen Zahlen aus. Dabei
wird die Zahl Schritt für Schritt in der Variablen ZAHL zusammengesetzt.
Würde man der Funktion ZIFF ein Skript verwenden, ginge das nicht, da
sich der Wert von ZAHL ja nicht aus dem aufgerufenen Skript heraustransportieren
ließe.
#
# Ausgabe des Eingangsparameters $1 in roemischen Ziffern
#
ZIFF ()
# Funktion zur Bearbeitung einer einstelligen Ziffer $1
# Einer-, Zehner-, Hunderterstelle unterscheiden sich nur
# durch die verw. Zeichen $2: Einer, $3: Fuenfer, $4: Zehner
{ X=$1
if test $X -eq 9; then
ZAHL=${ZAHL}$2$4
elif test $X -gt 4; then
ZAHL=${ZAHL}$3
while test $X -ge 6; do
ZAHL=${ZAHL}$2 ; X=`expr $X - 1`
done
elif test $X -eq 4; then
ZAHL=${ZAHL}$2$3
else
while test $X -gt 0; do
ZAHL=${ZAHL}$2 ; X=`expr $X - 1`
done
fi
}
if test $# -eq 0; then
echo "Usage: roem Zahl"; exit
fi
XX=$1
while test $XX -gt 999; do
ZAHL=${ZAHL}"M"; XX=`expr $XX - 1000`
done
ZIFF `expr $XX / 100` C D M
XX=`expr $XX % 100`
ZIFF `expr $XX / 10` X L C
ZIFF `expr $XX % 10` I V X
echo "$ZAHL \n"
|