Funkce
Funkce je blok kódu ve skriptu, který má přiřazeno jméno a lze jej opakovaně použít.
function name {
commands
}
Funkci používáme tak, jako bychom používali příkaz se stejným jménem jako funkce. Funkce musí být před použitím definována, jinak dojde k chybě. Jména funkcí musí být ve skriptu unikátní, dvojí definování funkce stejného jména vede k zapomenutí první definice (bez chybového hlášení). Pokud vytvoříme funkci se stejným jménem jako jiný příkaz, bude tento příkaz ve zbytku skriptu nepřístupný, místo něj se bude volat funkce.
# priklad volani funkce, skript vypise dvakrat 'Toto je funkce foo'
function foo {
echo "Toto je funkce foo"
}
foo
foo
Na funkci se v mnoha ohledech dá dívat jako na miniskript:
1. Funkce jako jiný příkaz vrací návratovou hodnotu. Je to buď návratová
hodnota posledního příkazu provedeného v těle funkce, nebo hodnota, která je
vrácena příkazem return. Pro návratové hodnoty funkcí platí stejná pravidla,
jako pro návratové hodnoty skriptu.
2. Můžeme přesměrovat standardní výstup z funkce do proměnné pomocí syntaxe podobné subshellu.
function foo {
echo "testovaci vystup"
}
var=$(foo)
echo ${var} # toto vypise 'testovaci vystup'
3. Funkci můžeme předat argumenty a zpracovat je uvnitř jako ve skriptu.
(Jméno funkce je uloženo v ${0}, další argumenty jsou ${1} …, atd.)
function foo {
count=1
while [ -n "${1}" ]
do
echo "parametr ${count} je ${1}"
count=$[${count} + 1]
shift
done
}
echo "prvni volani"
foo -a -b param1 param2
echo "druhe volani"
foo 120 130
4. Proměnné ve skriptu jsou globální. Pokud bychom v předchozím kódu nahradili za poslední 4 řádky následující
echo "prvni volani"
foo -a -b param1 param2
echo "hodnota count je ${count}"
echo "druhe volani"
foo 120 130
echo "hodnota count je ${count}"
vypíše skript nejdříve jako hodnotu count číslo 5 a posléze číslo 3. Pracovat
uvnitř funkcí s globálními proměnnými není příliš vhodné (z podobných důvodů,
jako musíme být s globálními proměnnými opatrní v běžném programování). Lokální
proměnné vytváříme pomocí slovíčka local, které použijeme při vytvoření
proměnné. Ta je tak platná pouze ve funkci, překryje případnou globální proměnnou
stejného jména.
temp=1
function foo {
local temp=10 # uvnitr funkce je promenna temp lokalni
temp=$[${temp} + 2]
}
foo
echo "hodnota temp je ${temp}" # tady se vypise hodnota 1
5. Do funkce lze přesměrovat standardní vstup. Například
function foo {
local line
while read line
do
echo ${line}
done
}
foo < blah.txt
vypíše obsah souboru blah.txt.