Organizacja kodu

W każdym języku dłuższe programy można organizować korzystajac z funkcji i plików z funkcjami nie inaczej jest w Bashu, co prawda nie jest językiem wspierajacym pisanie obiektowe - ale kto tego potrzebuje pisząc w gruncie rzeczy proste skrypty powłoki?

Funkcje

To coś w rodzaju podprogramów. Stosuje się je gdy w naszym skrypcie powtarza się jakaś grupa poleceń (po co pisać je kilka razy), skoro można to wszystko umieścić w funkcji. Do danej funkcji odwołujemy się podając jej nazwę, a wykonane zostanie wszystko co wpisaliśmy między nawiasy { }, skraca to znacznie długość skryptu, a więc ilość miejsc w których moglismy się pomylić, orócz tego ułatwia zrozumienie kodu.

Składnia

Właściwie są dwa równoważne sposoby deklarowania funkcji

Pierwszy:

function nazwa_funkcji {
        polecenie1
        polecenie2
        polecenie3
}

Drugi:

nazwa_funkcji() {
        polecenie_1
        polecenie_2
        polecenie_3
}

Przykład

#!/bin/bash

function napis {
        echo "To jest napis"
}

# main
napis

W przykładzie nazwę funkcji umieszczamy po słowie kluczowym function, w powyższym przykładzie mamy funkcje o nazwie napis, odwołujemy się do niej podając jej nazwę, wykonane zostaną wtedy wszystkie polecenia, jakie jej przypiszemy.

Ostrzeżenie

Znacznie częściej stosowany do deklaracji funkcji stosowany jest sposób drugi, wynika to z tego, że jest on bardzo podobny do tego znanego z języka ANSI C.

Przekazywanie parametrów do funkcji

Przekazanie parametrów do funkcji następuje dokładnie tak samo jak do każdego polecenia które jest w naszym skrypcie

Składnia

nazwa_funkcji parametr_1 parametr_2

Przykład

#!/bin/bash

funkcja_z_parametrami() {
        echo "Przekazano $# parametrów"
        echo "Parametr $1"
        echo "Parametr $2"
}

funkcja_z_parametrami "param1" "param2"

Ostrzeżenie

Zmienna specjalna $0 przechowujaca nazwę skryptu nie jest dostępna! Choć na pierwszy rzut oka wydaje się, że powinna przechowywać nazwę funkcji.

Pliki dołączane

Funkcje moga się znajdować w innym pliku, co uczyni nasz skrypt bardziej przejrzystym i wygodnym. Nie jest to trudne wystarczy utworzyć skrypt (dokładnie taki sam jak każdy do tej twory tworzony) i dołączyć go do naszego głownego „programu”.

Składnia

. ~/naszplik_z_funkcjami

lub

source ~/naszplik_z_funkcjami

gdzie plik z funkcjami bedzie podobny do tego poniżej:

nazwa_funkcji() {
        polecenie_1
}

nazwa_funkcji2() {
        polecenie_1
}

Trzeba pamiętać o podaniu kropki i spacja przed nazwą pliku który ma zostać dołączony …

Podpowiedź

Można skorzystać dla lepszej czytelności z polecenia source

Przykład

#!/bin/bash
function nasza_funkcja {
        echo -e 'Właśnie użyłeś funkcji o nazwie "nasza_funkcja".\a'
}

Teraz pozostało jeszcze utworzyć skrypt w którym wywołamy funkcje: nasza_funkcja:

#!/bin/bash
echo "Test funkcji."
. plik_z_funkcja
nasza_funkcja

Łączenie instrukcji w bloki

Wszędzie tam, gdzie musimy użyć pojedynczej instrukcji, możemy zastosować blok instrukcji, czyli ciąg instrukcji ujęty w nawiasy klamrowe lub zwykłe.

Składnia:

{
        ciąg poleceń
        ...
}

W przypadku nawiasów klamrowych polecenia są wykonywane w bieżącej powłoce i środowisku. Wartością takiego bloku jest wartość ostatniej instrukcji.

Przykład:

#!/bin/bash
if true && { false;false;true } ; then
        echo TRUE
fi

Powyższy skrypt wypisze TRUE, ponieważ ostatnia instrukcja zwraca wartość 0 (true).

Składnia

(
        ciąg poleceń
)

Dla poleceń w nawiasach zwykłych tworzona jest nowa powłoka. Wartością zwracaną jest kod ostatniej instrukcji bądź wartość zwrócona przez komendę exit (notabene to jest zwrócenie wartości ustalonej wcześniej).

Przykład

if true && (false;false;exit 0) ; then
echo TRUE
fi

Powyższy skrypt wypisze TRUE, ponieważ ostatnia instrukcja zwraca wartość 0 (true).