
Funkce Bash je v podstatě sada příkazů, které lze volat mnohokrát. Účelem funkce je pomoci vám učinit vaše bash skripty čitelnějšími a vyhnout se opakovanému psaní stejného kódu. Ve srovnání s většinou programovacích jazyků jsou funkce Bash poněkud omezené.
V tomto tutoriálu pokryjeme základy funkcí Bash a ukážeme vám, jak je používat ve skriptech shellu.
Definování bashových funkcí #
Syntaxe pro deklaraci bash funkce je přímočará. Funkce mohou být deklarovány ve dvou různých formátech:
-
První formát začíná názvem funkce, za nímž následují závorky. Toto je preferovaný a více používaný formát.
function_name () { commands }
Jednořádková verze:
function_name () { commands; }
-
Druhý formát začíná vyhrazeným slovem
function
, následovaný názvem funkce.function function_name { commands }
Jednořádková verze:
function function_name { commands; }
Je třeba poznamenat několik bodů:
- Příkazy mezi složenými závorkami (
{}
) se nazývají tělo funkce. Složené závorky musí být odděleny od těla mezerami nebo novými řádky. - Definováním funkce nedojde k jejímu provedení. Chcete-li vyvolat funkci bash, jednoduše použijte název funkce. Příkazy mezi složenými závorkami se provádějí vždy, když je funkce volána ve skriptu shellu.
- Definice funkce musí být umístěna před jakýmkoli voláním funkce.
- Při použití jednořádkových „kompaktovaných“ funkcí středník
;
musí následovat za posledním příkazem ve funkci. - Vždy se snažte, aby názvy funkcí byly popisné.
Abyste tomu lépe porozuměli, podívejte se na následující příklad:
~/hello_world.sh#!/bin/bash
hello_world () {
echo 'hello, world'
}
hello_world
Pojďme analyzovat kód řádek po řádku:
- Na řádku 3 definujeme funkci jejím názvem. Složená závorka
{
označuje začátek těla funkce. - Řádek
4
je tělo funkce. Tělo funkce může obsahovat více příkazů, příkazů a deklarací proměnných. - Řádek
5
, uzavírací složená závorka}
, definuje konechello_world
funkce. - V řádku
7
provádíme funkci. Funkci můžete spustit tolikrát, kolikrát potřebujete.
Pokud skript spustíte, vypíše hello, world
.
Rozsah proměnných #
Globální proměnné jsou proměnné, ke kterým lze přistupovat odkudkoli ve skriptu bez ohledu na rozsah. V Bash jsou všechny proměnné standardně definovány jako globální, i když jsou deklarovány uvnitř funkce.
Lokální proměnné lze deklarovat v těle funkce pomocí local
klíčové slovo a lze jej použít pouze v rámci této funkce. V různých funkcích můžete mít lokální proměnné se stejným názvem.
Abychom lépe ilustrovali, jak rozsah proměnných funguje v Bash, uvažujme tento příklad:
~/variables_scope.sh#!/bin/bash
var1='A'
var2='B'
my_function () {
local var1='C'
var2='D'
echo "Inside function: var1: $var1, var2: $var2"
}
echo "Before executing function: var1: $var1, var2: $var2"
my_function
echo "After executing function: var1: $var1, var2: $var2"
Skript začíná definováním dvou globálních proměnných var1
a var2
. Pak je tu funkce, která nastavuje lokální proměnnou var1
a upravuje globální proměnnou var2
.
Pokud skript spustíte, měli byste vidět následující výstup:
Before executing function: var1: A, var2: B
Inside function: var1: C, var2: D
After executing function: var1: A, var2: D
Z výše uvedeného výstupu můžeme usoudit, že:
- Pokud je v těle funkce nastavena lokální proměnná se stejným názvem jako existující globální proměnná, bude mít přednost před globální proměnnou.
- Globální proměnné lze měnit z funkce.
Vrácené hodnoty #
Na rozdíl od funkcí ve „skutečných“ programovacích jazycích vám funkce Bash neumožňují při volání vrátit hodnotu. Po dokončení funkce bash je její návratová hodnota stavem posledního příkazu provedeného ve funkci, 0
pro úspěch a nenulové desetinné číslo v rozsahu 1 - 255 pro neúspěch.
Návratový stav lze určit pomocí return
klíčové slovo a je přiřazeno k proměnné $?
. return
příkaz ukončí funkci. Můžete si to představit jako stav ukončení funkce.
#!/bin/bash
my_function () {
echo "some result"
return 55
}
my_function
echo $?
some result
55
Abychom skutečně vrátili libovolnou hodnotu z funkce, musíme použít jiné metody. Nejjednodušší možností je přiřadit výsledek funkce do globální proměnné:
~/return_values.sh#!/bin/bash
my_function () {
func_result="some result"
}
my_function
echo $func_result
some result
Další, lepší možností, jak vrátit hodnotu z funkce, je poslat hodnotu do stdout
pomocí echoor printf
jako je uvedeno níže:
#!/bin/bash
my_function () {
local func_result="some result"
echo "$func_result"
}
func_result="$(my_function)"
echo $func_result
some result
Namísto prostého provedení funkce, která vytiskne zprávu na stdout, přiřadíme výstup funkce k func_result
proměnnou pomocí $()
substituce příkazů. Proměnnou lze později použít podle potřeby.
Předávání argumentů funkcím Bash #
Chcete-li předat funkci bash libovolný počet argumentů, jednoduše je vložte za název funkce a oddělte je mezerou. Je dobrým zvykem argumenty citovat dvakrát, abyste se vyhnuli chybné analýze argumentu s mezerami.
- Předávané parametry jsou
$1
,$2
,$3
…$n
, odpovídající pozici parametru za názvem funkce. $0
proměnná je vyhrazena pro název funkce.$#
proměnná obsahuje počet pozičních parametrů/argumentů předávaných funkci.$*
a$@
proměnné obsahují všechny poziční parametry/argumenty předané funkci.- Pokud je uveden ve dvojitých uvozovkách,
"$*"
expanduje na jeden řetězec oddělený mezerou (první znak IFS) -"$1 $2 $n"
. - Pokud je uveden ve dvojitých uvozovkách,
"$@"
expanduje na samostatné řetězce -"$1" "$2" "$n"
. - Pokud není uvedeno ve dvojitých uvozovkách,
$*
a$@
jsou stejné.
- Pokud je uveden ve dvojitých uvozovkách,
Zde je příklad:
~/passing_arguments.sh#!/bin/bash
greeting () {
echo "Hello $1"
}
greeting "Joe"
Hello Joe
Závěr č.
Funkce Bash je blok opakovaně použitelného kódu navržený k provedení konkrétní operace. Jakmile je funkce definována, může být v rámci skriptu volána vícekrát.
Můžete si také přečíst o tom, jak použít funkci Bash k vytvoření zapamatovatelného zkratkového příkazu pro delší příkaz.
Pokud máte nějaké dotazy nebo zpětnou vazbu, neváhejte zanechat komentář.