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: