6.5 Lokale contra globale Variablen
In Abschnitt 6.4.3 konnten Sie bereits sehen, dass man ohne Probleme von der Hauptfunktion aus auf Variablen einer Funktion zugreifen kann. Dabei handelt es sich um globale Variablen. Aber wie »global« eigentlich globale Variablen in einer Funktion sind, soll Ihnen das folgende Beispiel zeigen:
# Demonstriert die Verwendung von Parametern
# Name: afunc14
# Funktion value1
value1() {
val1=10
}
# Hauptprogramm
echo $val1
In diesem Beispiel wird nicht wie erwartet der Wert 10 von »val« ausgegeben, sondern ein leerer String. Die globale Variable »val1« steht Ihnen erst zur Verfügung, wenn Sie die Funktion »value1« aufrufen, da erst durch den Aufruf der Funktion »value1« die Variable »val1« mit einem Wert belegt wird.
# Demonstriert die Verwendung von Parametern
# Name: afunc15
# Funktion value1
value1() {
val1=10
}
# Hauptprogramm
value1
echo $val1
Jetzt wird auch der Wert von »val1« gleich 10 ausgegeben. Wünschen Sie aber eine globale Variable, die auch sofort der Hauptfunktion zur Verfügung steht, müssen Sie diese eben noch vor der ersten Verwendung außerhalb einer Funktion definieren.
# Demonstriert die Verwendung von Parametern
# Name: afunc16
# Globale Variable
val1=11
# Funktion value1
value1() {
val1=10
}
# Hauptprogramm
echo $val1
value1
echo $val1
Das Script bei der Ausführung:
you@host > ./afunc16
11
10
Sie müssen sich immer vor Augen halten, dass sich jede Veränderung einer globalen Variablen auch auf diese Variable bezieht. Des Weiteren sind globale Variablen bei immer länger werdenden Scripts eher kontraproduktiv, da man schnell die Übersicht verlieren kann. Besonders bei häufig verwendeten Variablennamen wie »i«, »var«, »file«, »dir« usw. kann es schnell passieren, dass man dieselbe Variable im Script in einer anderen Funktion nochmals verwendet. Solche Doppelungen wurden früher (und heute immer noch) in den Shells mit speziellen Variablennamen vermieden. Hieß bspw. die Funktion »readcmd«, verwendete man Variablen mit dem Präfix »read_var1«, »read_var2« usw. Dadurch, dass man im Variablennamen ein paar Buchstaben des Funktionsnamens voranstellt, lassen sich viele Fehler vermeiden. Ein Beispiel:
# Funktion connect
connect {
con_file=$1
con_pass=$2
con_user=$3
con_i=0
...
}
# Funktion insert
insert {
ins_file=$1
ins_pass=$2
ins_user=$3
ins_i=0
...
}
...
6.5.1 Lokale Variablen (Bash und Korn-Shell only)
In Bash und Korn-Shell können Sie lokale Variablen innerhalb von Funktionen (und nur dort) definieren. Hierzu müssen Sie nur der Variablen bei der Definition das Schlüsselwort local voranstellen.
local var=wert
Eine so definierte Variable hat Ihre Lebensdauer somit auch nur innerhalb der Funktion, in der diese erzeugt wurde. Beendet sich die Funktion, verliert auch die Variable ihre Gültigkeit und zerfällt. Da macht es auch nichts mehr aus, wenn Sie in Ihrem Script eine globale Variable mit demselben Namen verwenden, wie ihn die lokale Variable hat. Mithilfe von lokalen Variablen können Sie eine Variable in einer Funktion vor dem Rest des Scripts verstecken.
Hier ein Beispiel, das den Einsatz von lokalen Variablen demonstriert:
# Demonstriert die Verwendung von Parametern
# Name: afunc17
# Globale Variable
var="ich bin global"
# Funktion localtest
localtest() {
local var="ich bin local"
echo $var
}
# Hauptfunktion
echo $var
localtest
echo $var
Das Script bei der Ausführung:
you@host > ./afunc17
ich bin global
ich bin local
ich bin global
Hätten Sie das Schlüsselwort local nicht verwendet, so würde die Ausgabe des Scripts wie folgt aussehen:
you@host > ./afunc17
ich bin global
ich bin local
ich bin local
Rufen Sie aus einer Funktion eine weitere Funktion auf, steht dieser Funktion ebenfalls die lokale Variable zur Verfügung – auch wenn eine gleichnamige globale Variable hierzu existieren würde.
# Demonstriert die Verwendung von Parametern
# Name: afunc18
# Globale Variable
var="ich bin global"
# Funktion localtest
localtest() {
local var="ich bin local"
alocaltest
}
#Funktion alocaltest
alocaltest() {
echo $var
}
# Hauptfunktion
localtest
Das Script bei der Ausführung:
you@host > ./afunc18
ich bin local
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.
|