Funkce je opakovaně použitelný blok kódu. Často vkládáme opakovaný kód do funkce a voláme tuto funkci z různých míst. Knihovna je soubor funkcí. Můžeme definovat běžně používané funkce v knihovně a ostatní skripty je mohou používat bez duplikace kódu.
V tomto článku probereme více o funkcích a receptech. Pro účely předvedení budu používat Bourne Again SHell (Bash) na počítači Ubuntu.
Funkce volání
Volání funkce v Shell je úplně stejné jako volání jakéhokoli jiného příkazu. Pokud je například název vaší funkce my_func, lze ji spustit následovně:
$ my_func
Pokud nějaká funkce přijímá argumenty, lze je zadat z příkazového řádku následovně:
$ my_func arg1 arg2 arg3
Definování funkce
K definici funkce můžeme použít níže uvedenou syntaxi:
function function_name { Tělo funkce }
Tělo funkce může obsahovat jakýkoli platný příkaz, omezení smyčky, jinou funkci nebo skript. Nyní vytvoříme jednoduchou funkci, která zobrazí zprávu na obrazovce.
funkce print_msg { echo "Ahoj světe" }
Nyní spusťte tuto funkci:
$ print_msg Ahoj, světe
Podle očekávání tato funkce zobrazí zprávu na obrazovce.
Ve výše uvedeném příkladu jsme vytvořili funkci přímo na terminálu. Tuto funkci můžeme uložit i do souboru. Níže uvedený příklad to demonstruje.
#! /bin/bash funkce print_msg { echo "Ahoj světe" } print_msg
Tuto funkci jsme definovali v function.sh soubor. Nyní spusťte tento skript:
$ chmod +x function.sh $ ./function.sh Ahoj, světe
Pokud si všimnete, výše uvedený výstup je přesně totožný s předchozím.
Další informace o funkcích
V předchozí části jsme definovali velmi základní funkci. Při vývoji softwaru však potřebujeme pokročilejší funkce, které mohou přijímat různé parametry a návratové hodnoty. V této části si probereme takové funkce.
Předávání argumentů do funkce
Můžeme poskytnout argumenty, aby fungovaly stejně jako jiné příkazy. K těmto argumentům můžeme přistupovat z funkce pomocí symbolu dolaru ($). Například $1 představuje první argument, $2 představuje druhý argument a tak dále.
Upravme výše uvedenou funkci tak, aby přijala zprávu jako argument. Naše upravená funkce bude vypadat takto:
funkce print_msg { echo "Ahoj $1" }
Ve výše uvedené funkci přistupujeme k prvnímu argumentu pomocí $1. Proveďme tuto funkci:
$ print_msg "LinuxTechi"
Když tuto funkci spustíte, vygeneruje následující výstup:
Dobrý den, LinuxTechi
Vrácení hodnoty z funkce
Stejně jako ostatní programovací jazyky poskytuje Bash příkaz return, pomocí kterého můžeme vrátit hodnotu volajícímu. Pojďme to pochopit na příkladu:
function func_return_value { return 10 }
Výše uvedená funkce vrací svému volajícímu hodnotu 10. Proveďme tuto funkci:
$ func_return_value $ echo "Hodnota vrácená funkcí je:$?"
Když provedete výše uvedenou funkci, vygeneruje následující výstup:
Hodnota vrácená funkcí je:10
POZNÁMKA: V bash musíme použít $? k zachycení návratové hodnoty funkce
Funkční receptury
Zatím jsme měli dobrou představu o bash funkcích. Nyní pojďme vytvořit několik užitečných bash funkcí, které nám mohou usnadnit život.
Protokol
Vytvořme funkci loggeru, která bude tisknout datum a čas spolu se zprávou protokolu.
function log_msg { echo "[`date '+ %F %T'` ]:[e-mail chráněn]“ }
Proveďme tuto funkci:
$ log_msg "Toto je ukázková zpráva protokolu"
Když tuto funkci spustíte, vygeneruje následující výstup:
[ 2018-08-16 19:56:34 ]:Toto je ukázková zpráva protokolu
Zobrazení systémových informací
Vytvořme funkci pro zobrazení informací o systému GNU/Linux
funkce system_info { echo "### Informace o operačním systému ###" lsb_release -a echo echo "### Informace o procesoru ###" procesor=`grep -wc "processor `gre" /proc model `grep` /proc -w "název modelu" /proc/cpuinfo | awk -F:'{print $2}'` echo "Procesor =$processor" echo "Model =$model" echo echo "### Informace o paměti ###" m celkem =`Total" / em " | awk '{print $2}'` free=`grep -w "MemFree" /proc/meminfo | awk '{print $2}'` echo "Celková paměť:$total kB" echo "Volná paměť:$volná kB" }
Když provedete výše uvedenou funkci, vygeneruje následující výstup:
### Informace o operačním systému ###Nejsou dostupné žádné moduly LSB.ID distributora: UbuntuDescription: Ubuntu 18.04.1 LTSRease: 18.04Kódové jméno: bionic### Informace o procesoru = Del) Processor #1 Moe Core TM) i7-7700HQ CPU @ 2,80 GHz### Informace o paměti ###Celková paměť:4015648 kBVolná paměť:2915428 kB
Najít soubor nebo adresář z aktuálního adresáře
Níže uvedená funkce vyhledává soubor nebo adresář z aktuálního adresáře:
funkce hledat { najít . -name $1 }
Prohledejme adresář jmenovitě dir4 pomocí níže uvedeného příkazu:
$ hledat dir4
Když provedete výše uvedený příkaz, vygeneruje následující výstup:
./dir1/dir2/dir3/dir4
Digitální hodiny
Níže uvedená funkce vytváří jednoduché digitální hodiny na terminálu
funkce digital_clock { clear zatímco [ 1 ] do datum +'%T'Vytvoření knihovny
Knihovna je soubor funkcí. Chcete-li vytvořit knihovnu – definujte funkce v souboru a importujte tento soubor do aktuálního prostředí.
Předpokládejme, že jsme definovali všechny funkce v souboru utils.sh a poté použijte níže uvedený příkaz k importu funkcí v aktuálním prostředí:
zdroj $ utils.shDále můžete spustit jakoukoli funkci z knihovny stejně jako jakýkoli jiný příkaz bash.
Závěr
V tomto článku jsme probrali několik užitečných receptů, které zlepší vaši produktivitu. Doufám, že vás tyto články inspirují k vytváření vlastních receptů.
Naučte se a používejte systémová volání fork(), vfork(), wait() a exec() napříč systémy Linux Jak porovnávat čísla a řetězce ve skriptu Linux ShellLinux