Baukastensystem
Teil 6: Funktionen und Module
Lokale Variablen
Wir benötigen Variablen, die lediglich für unsere Funktion gelten und auf keinen Fall mit globalen Variablen kollidieren: Lokale Variablen. Sie werden durch Voranstellen des Schlüsselworts local bei der ersten Benutzung oder am Anfang der Funktion definiert und gelten nur für diese eine Funktion. Das folgende Listing zeigt die veränderte Funktion Trennzeile aus unserem Beispiel:
002 Trennzeile ()
003 {
004 local i=0
005 while [ $i -lt 10 ]; do
006 echo -n "*"
007 i=$[$i+1]
008 done
009 echo
010 }Wir verwenden $i nach wie vor im Hauptprogramm (Zeile 13 und 16) und in der Funktion (Zeile 5 und 7), offensichtlich muss es hier eine Kollision geben. Das Problem wird durch Überdeckung bereits benutzter Namen gelöst: Die Variable $i innerhalb von Trennzeile ist unabhängig von ihrer globalen Namensvetterin, wir haben also zwei verschiedene $i. Der Nachteil ist, dass wir jetzt in Trennzeile nicht mehr an die globale Variable $i herankommen. Manchmal benötigt man eine globale Variable als Anfangswert, ohne sie im weiteren Verlauf der Funktion zu verändern zu dürfen, man müßte in der Funktion mit einer neuen Variablen arbeiten. Dafür gibt es einen Trick – wir weisen die globale Variable $i beim Anlegen der lokalen Variable $i als Anfangswert zu. Dabei nutzen wir aus, dass die Bash zunächst den Teil rechts des Gleichheitszeichens auswertet und das Ergebnis der linken Seite zuweist.
002 Trennzeile ()
003 {
004 local i=$i
005 while [ $i -lt 10 ]; do
006 echo -n "*"
007 i=$[$i+1]
008 done
009 echo
010 }Im Ergebnis verkürzt sich damit unsere Trennzeile um jeweils ein Sternchen:
* 1 2 * 3
Rückgabewerte
Eine Funktion hat genau wie ein Programm einen Rückgabewert (Exit-Code), der über die Spezial-Variable $? unmittelbar nach Ende der Funktion abgefragt werden kann. Standardmäßig ist der Rückgabewert einer Funktion identisch mit dem Rückgabewert des zuletzt ausgeführten Befehls. Bei Trennzeile war der letzte Befehl echound somit der Rückgabewert stets 0. Mittels return können Sie andere Werte zurückgeben. Hier eine Funktion, die stets "falsch", also einen Wert ungleich null, liefert:
Falsch ()
{
return 1
}return verlässt die Funktion auf der Stelle und ist besonders dann interessant, wenn in einer Funktion Fehler auftreten können. DateiLesen wird, falls die als Parameter $1 übergebene nicht existiert oder nicht lesbar ist, beendet und liefert als Rückgabewert eins. Andernfalls wird der Inhalt in $Inhalt gespeichert und der Rückgabewert dieser Aktion (dieser ist immer null, eine Zuweisung ist stets erfolgreich) verwendet.
DateiLesen ()
{
if [ ! -r $1 ]; then
return 1
fi
Datei="`cat $1`"
}Durch die Aufgliederung eines Programmes in Funktionen kann es vorkommen, dass erst in einer Funktion ein Fehler festgestellt wird, der die weitere Programmausführung unmöglich macht, wie etwa zu wenig freie Festplattenkapazität. Diesen Fehler kann man an den Aufrufer zurückmelden, einfacher ist es aber das Programm sofort abzubrechen. Dazu dient der Befehl exit, der genau wie return einen Rückgabewert erhalten kann:
DateiLesen ()
{
if [ ! -r $1 ]; then
exit 1
fi
Datei="`cat $1`"
}



