<Poprzedni | Spis treści | Następne>
Zmienne lokalne
W skryptach, które do tej pory napisaliśmy, wszystkie zmienne (w tym stałe) zostały: zmienne globalne. Zmienne globalne zachowują swoje istnienie w całym programie. Jest to dobre dla wielu rzeczy, ale czasami może komplikować użycie funkcji powłoki. Wewnątrz powłoki często pożądane jest posiadanie zmienne lokalne. Zmienne lokalne są dostępne tylko w funkcji powłoki, w której są zdefiniowane, i przestają istnieć po zakończeniu działania funkcji powłoki.
Posiadanie zmiennych lokalnych pozwala programiście na używanie zmiennych o nazwach, które mogą już istnieć, albo w skrypcie globalnie, albo w innych funkcjach powłoki, bez martwienia się o potencjalne konflikty nazw.
Oto przykładowy skrypt, który demonstruje sposób definiowania i używania zmiennych lokalnych:
#! / bin / bash
# local-vars: skrypt demonstrujący lokalne zmienne
#! / bin / bash
# local-vars: skrypt demonstrujący lokalne zmienne
foo=0
# globalna zmienna foo
foo=0
funkcja_1 () {
lokalna foo # zmienna foo lokalna na funct_1 foo=1
echo "funct_1: foo = $foo"
}
funkcja_2 () {
lokalna foo # zmienna foo lokalna na funct_2 foo=2
echo "funct_2: foo = $foo"
}
echo "global: foo = $foo" funct_1
funkcja_1 () {
lokalna foo # zmienna foo lokalna na funct_1 foo=1
echo "funct_1: foo = $foo"
}
funkcja_2 () {
lokalna foo # zmienna foo lokalna na funct_2 foo=2
echo "funct_2: foo = $foo"
}
echo "global: foo = $foo" funct_1
Zmienne lokalne
echo "global: foo = $foo" funct_2
echo "global: foo = $foo"
echo "global: foo = $foo" funct_2
echo "global: foo = $foo"
Jak widać, zmienne lokalne definiuje się przez poprzedzenie nazwy zmiennej słowem miejscowy. Tworzy to zmienną lokalną dla funkcji powłoki, w której jest zdefiniowana. Po wyjściu z funkcji powłoki zmienna już nie istnieje. Po uruchomieniu tego skryptu widzimy wyniki:
[ja@linuxbox ~]$ lokalne-wars
globalne: foo = 0 funct_1: foo = 1 globalne: foo = 0 funct_2: foo = 2 globalne: foo = 0
[ja@linuxbox ~]$ lokalne-wars
globalne: foo = 0 funct_1: foo = 1 globalne: foo = 0 funct_2: foo = 2 globalne: foo = 0
Widzimy, że przypisanie wartości do zmiennej lokalnej bla w obu funkcjach powłoki nie ma wpływu na wartość bla zdefiniowane poza funkcjami.
Ta cecha umożliwia pisanie funkcji powłoki tak, aby pozostawały niezależne od siebie i od skryptu, w którym się pojawiają. Jest to bardzo cenne, ponieważ pomaga zapobiegać ingerencji jednej części programu w inną. Pozwala także na pisanie funkcji powłoki tak, aby były przenośne. Oznacza to, że w razie potrzeby można je wycinać i wklejać ze skryptu do skryptu.