Logo projektu bash

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