Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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.