
Funkcje pozwalają wielokrotnie wykorzystywać raz napisany kod, zmniejsza to objętość skryptu oraz pozwala uniknąć powtarzania identycznego kodu dla różnych danych.
Składnia definicji funkcji w powłoce bash
nazwa_funkcji()
{
polecenia}
Wywoływanie funkcji
Do funkcji odwołujemy się w następujący sposób:
nazwa_funkcji argumenty
Dostęp do argumentów funkcji
Do argumentów wewnątrz funkcji odwołujemy się tak samo jak do parametrów linii poleceń czyli poprzez zmienne $1,$2 itd. Liczbę argumentów można sprawdzić za pomocą zmiennej $#. Całą listę argumentów możemy odczytać ze zmiennej $@.
Prosty przykład użycia funkcji
#!/bin/bash
funkcja()
{
if [ "$#" -eq "0" ]; then
echo "Brak parametrów funkcji."
return
fi
for i in $@ ; do
echo $i
done
}
echo
echo "Wywołanie z parametrami:"
echo
funkcja a b c d
echo
echo "Wywołanie bez parametrów:"
echo
funkcja
Wynikiem wykonania tego skryptu będzie:
Wywołanie z parametrami: a b c d Wywołanie bez parametrów: Brak parametrów funkcji.
Funkcja najpierw sprawdza liczbę parametrów. Jeżeli nie został przekazany żaden parametr wyświetla komunikat braku parametrów i kończy działanie (instrukcja return przerywa działanie funkcji). W przeciwnym wypadku wypisuje wszystkie podane parametry.
Wartość zwracana funkcji
Wartość zwracaną funkcji możemy odczytać ze zmiennej $?. Jeżeli nie określimy tej wartości będzie ona odpowiadała wartości zwróconej przez ostatnie polecenie funkcji. Wartość zwracaną możemy ustawić za pomocą instrukcji return:
#!/bin/bash
funkcja2()
{
return 3
}
echo $?
funkcja2
echo $?
Wynikiem wykonania tego skryptu będzie:
0 3
Niestety wywołanie return ogranicza nas do zwrócenia liczby całkowitej. Dlatego zwykle do zwrócenia wartości używa się zmiennej globalnej lub echo i mechanizmu rozwinięcia zawartości nawiasów.
#!/bin/bash
#wywołanie echo:
funkcja3()
{
echo "to jest wynik tekstowy"
}
#zmienna globalna:
funkcja4()
{
a="to jest wynik tekstowy"
}
wynik=$(funkcja3)
echo $wynik
funkcja4
echo $a
Wynikiem wykonania skryptu będzie:
to jest wynik tekstowy to jest wynik tekstowy
Mechanizm rozwinięcia zawartości nawiasów pozwala zapisać wynik polecenia do zmiennej (podobnie jak odwrotny cudzysłów).
Zmienne lokalne
W funkcjach warto korzystać ze zmiennych lokalnych. Pozwala to uniknąć sytuacji, w której różne funkcje modyfikują tą samą zmienną przypadkowo np.:
#!/bin/bash
a=1
funkcja5()
{
a=5
echo "Wartość a w funkcji5 to $a"
}
funkcja6()
{
a=6
echo "Wartość a w funkcji6 to $a"
}
echo $a
funkcja5
echo $a
funkcja6
echo $a
Uruchomienie skryptu zakończy się komunikatami:
1 Wartość a w funkcji5 to 5 5 Wartość a w funkcji6 to 6 6
Jak widać obydwie funkcje modyfikują tą samą zmienną.
Definiowanie zmiennych lokalnych
Aby zdefiniować zmienną lokalną używamy słowa local np.:
#!/bin/bash
a=1
funkcja5()
{
local a=5
echo "Wartość a w funkcji5 to $a"
}
funkcja6()
{
local a=6
echo "Wartość a w funkcji6 to $a"
}
echo $a
funkcja5
echo $a
funkcja6
echo $a
Wykonanie tego skryptu nie zmieni wartości zmiennej globalnej:
1 Wartość a w funkcji5 to 5 1 Wartość a w funkcji6 to 6 1
W kursie ukazały się następujące części:
