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
4je 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_worldfunkce. - V řádku
7prová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. $0promě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ář.