GNU/Linux >> Znalost Linux >  >> Linux

Bash Scripting Part6 – Vytváření a používání funkcí Bash

Než budeme mluvit o bash funkcích, proberme tuto situaci. Při psaní bash skriptů zjistíte, že používáte stejný kód na více místech.

Pokud vás unavuje psát stejné řádky kódu znovu a znovu ve vašem bash skriptu, bylo by hezké napsat blok kódu jednou a zavolat jej kdekoli ve vašem bash skriptu.

Prostředí bash vám to umožňuje pomocí Funkcí .

Funkce Bash jsou bloky kódu, které můžete znovu použít kdekoli v kódu. Kdykoli budete chtít tento blok kódu použít ve svém skriptu, jednoduše zadáte název funkce, který je mu přidělen.

Budeme mluvit o tom, jak vytvořit bash funkce a jak je používat ve skriptech shellu.

Vytvoření funkce

Funkci můžete definovat takto:

functionName() {}

Hranaté závorky () jsou nutné k definování funkce.

Funkci můžete také definovat pomocí klíčového slova function, ale toto klíčové slovo je pro přenositelnost POSIX zastaralé.

function functionName() { # Definice zastaralá, ale stále používaná a funkční}

Ve druhé definici nejsou závorky povinné.

Používání funkcí

#!/bin/bashmyfunc() { echo "Používání funkcí"}total=1while [ $total -le 3 ]; do myfunc total=$(($total + 1))doneecho "Smyčka dokončena"myfuncecho "Konec skriptu"

Zde jsme vytvořili funkci s názvem myfunc a abychom ji mohli zavolat, pouze jsme napsali její název.

Funkci můžete volat mnohokrát, jak chcete.

Upozornění:Pokud se pokusíte použít funkci, která není definována, co se stane?

#!/bin/bashtotal=1zatímco [ $total -le 3 ]; do myfunc total=$(($total + 1))doneecho "Konec smyčky"myfunc() { echo "Používání funkce ..."}echo "Konec skriptu"

Oh, to je chyba, protože žádná taková funkce neexistuje.

Další upozornění:název funkce bash musí být jedinečný. V opačném případě nová funkce zruší starou funkci bez jakýchkoli chyb.

#!/bin/bashmyfunc() { echo "První definice funkce"}myfuncfunction myfunc() { echo "Definice druhé funkce"}myfuncecho "Konec skriptu"

Jak můžete vidět, druhá definice funkce přebírá řízení z první bez jakékoli chyby, takže při definování funkcí buďte opatrní.

Pomocí příkazu return

Příkaz return vrátí celé číslo z funkce.

Existují dva způsoby použití příkazu return; první způsob je takto:

#!/bin/bashmyfunc() { read -p "Zadejte hodnotu:" value echo "přidání hodnoty" return $(($value + 10))}myfuncecho "Nová hodnota je $?"

Funkce myfunc přidá 10 k proměnné  $value a poté zobrazí součet pomocí $? Proměnná.

Před získáním hodnoty funkce neprovádějte žádné příkazy, protože proměnná $? vrátí stav posledního řádku.

Tato návratová metoda vrací celá čísla. A co vracení řetězců?

Použití výstupu funkce

Druhým způsobem, jak vrátit hodnotu z bash funkce, je substituce příkazů. Tímto způsobem můžete vrátit cokoli z funkce.

#!/bin/bashmyfunc() { read -p "Zadejte hodnotu:" value echo $(($value + 10))}result=$(myfunc)echo "Hodnota je $result"

Předávání parametrů

S bashovými funkcemi se můžeme vypořádat jako s malými úryvky, které můžeme znovu použít, a to je v pořádku, ale musíme funkci vytvořit jako engine, dáme jí něco a vrátí výsledek na základě toho, co poskytujeme.

Proměnné prostředí můžete použít ke zpracování předávaných parametrů do funkce. Název funkce je deklarován jako proměnná $0 a předávané parametry jsou $1, $2, $3 atd.

Počet parametrů předaných funkci můžete získat pomocí ($# ) proměnná.

Parametry předáváme takto:

myfunc $val1 10 20

Následující příklad ukazuje, jak použít proměnnou ($#):

#!/bin/bashaddnum() { if [ $# -gt 2 ]; then echo "Předané nesprávné parametry" # Pokud se parametry nerovnají 2 else echo $(($1 + $2)) # Jinak je přidejte fi}echo -n "Přidání 10 a 15:"value=$(addnum 10 15)echo $valueecho -n "Přidání tří čísel:"value=$(addnum 10 15 20)echo $value

Funkce addnum získá počet předaných parametrů. Pokud je hodnota vyšší než 2, vrátí hodnotu -1.

Pokud existuje jeden parametr, funkce addnum tento parametr přidá dvakrát. Pokud projdou dva parametry, funkce addnum je sečte, a pokud se pokusíte přidat tři parametry, vrátí -1.

Pokud se pokusíte použít předané parametry uvnitř funkce, funkce selže:

#!/bin/bashmyfunc() { echo $(($1 + $2 + $3 + $4))}if [ $# -eq 4 ]; then value=$(myfunc) echo "Total=$value"else echo "Předané parametry jako tento:myfunc a b c d"fi

Místo toho je musíte odeslat do funkce takto:

#!/bin/bashmyfunc() { echo $(($1 + $2 + $3 + $4))}if [ $# -eq 4 ]; then value=$(myfunc $1 $2 $3 $4) echo "Total=$value"else echo "Předané parametry jako tento:myfunc a b c d"fi

Teď to funguje!!

Zpracování proměnných ve funkcích Bash

Každá proměnná, kterou používáme, má rozsah; rozsah je variabilní viditelnost vašeho skriptu.

Můžete definovat dva typy proměnných:

  • Globální
  • Místní

Globální proměnné

Jsou viditelné a platné kdekoli ve skriptu bash. Můžete dokonce získat jeho hodnotu zevnitř funkce.

Pokud deklarujete globální proměnnou v rámci funkce, můžete získat její hodnotu mimo funkci.

Každá proměnná, kterou deklarujete, je ve výchozím nastavení globální proměnná. Pokud definujete proměnnou mimo funkci, zavoláte ji uvnitř funkce bez problémů:

#!/bin/bashmyfunc() { input=$(($input + 10))}read -p "Zadejte číslo:" inputmyfuncecho "Nová hodnota je:$input"

Pokud změníte hodnotu proměnné uvnitř funkce, hodnota se změní mimo funkci.

Jak tedy něco takového překonat? Použijte místní proměnné.

Místní proměnné

Pokud proměnnou použijete pouze uvnitř funkce, můžete ji deklarovat jako lokální proměnnou pomocí místního klíčového slova  takto:

místní tmp=$(( $val + 10 ))

Pokud tedy máte dvě proměnné, jednu uvnitř funkce a druhou mimo funkci, a mají identický název, vzájemně se neovlivní.

#!/bin/bashmyfunc() { local tmp=$(($val + 10)) echo "Funkce Temp from inside is $tmp"}tmp=4myfuncecho "Teplota zvenku je $tmp" 

Když použijete proměnnou $tmp uvnitř funkce myfunc, nezmění to hodnotu $tmp, která je mimo funkci.

Předávání polí jako parametrů

Co se stane, když předáte pole jako parametr funkci:

#!/bin/bashmyfunc() { echo "Parametry jsou:[email protected]" arr=$1 echo "Přijaté pole je ${arr[*]}"}my_arr=(5 10 15)echo "Staré pole je:${my_arr[*]}"myfunc ${my_arr[*]}

Funkce přebírá pouze první hodnotu proměnné pole.

Pole byste měli rozebrat na jednotlivé hodnoty a poté tyto hodnoty použít jako parametry funkce. Nakonec je zabalte do pole ve funkci takto:

#!/bin/bashmyfunc() { local new_arr new_arr=("[email protected]") echo "Aktualizovaná hodnota je:${new_arr[*]}"}my_arr=(4 5 6)echo "Staré pole je ${my_arr[*]}"myfunc ${my_arr[*]}

Proměnná pole byla přestavěna díky funkci.

Rekurzivní funkce

Tato funkce umožňuje funkci volat sama sebe ze samotné funkce.

Klasickým příkladem rekurzivní funkce je výpočet faktoriálů. K výpočtu faktoriálu 3 použijte následující rovnici:

3! =1 * 2 * 3

Místo toho můžeme použít rekurzivní funkci takto:

x! =x * (x-1)!

Chcete-li tedy napsat faktoriální funkci pomocí skriptování bash, bude to vypadat takto:

#!/bin/bashfac_func() { if [ $1 -eq 1 ]; potom echo 1 else local tmp=$(($1 - 1)) local res=$(fac_func $tmp) echo $(($res * $1)) fi}read -p "Zadejte hodnotu:" valres=$(fac_func $ val)echo "Faktoriál $val je:$res"

Použití rekurzivních bash funkcí je tak snadné!

Vytváření knihoven

Nyní víme, jak psát funkce a jak je volat, ale co když chcete použít tyto bash funkce nebo bloky kódu v různých souborech skriptů bash bez kopírování a vkládání do vašich souborů.

Můžete vytvořit knihovnu pro své funkce a ukázat na ni z libovolného souboru podle potřeby.

Pomocí příkazu source , můžete skript souboru knihovny vložit do skriptu shellu.

Zdrojový příkaz má alias, což je tečka. Chcete-li získat soubor ve skriptu shellu, napište následující řádek:

. ./myscript

Předpokládejme, že máme soubor s názvem myfuncs, který obsahuje následující:

addnum() { echo $((1 $ + 2 $ + 3 $ + 4 $))}

Nyní jej použijeme v jiném souboru skriptu bash, jako je tento:

#!/bin/bash. ./myfuncsresult=$(addnum 10 10 5 5)echo "Total =$result"

Úžasný!! Použili jsme funkce bash v našem souboru skriptu bash; můžeme je také použít přímo v našem shellu.

Používejte funkce Bash z příkazového řádku

No, to je snadné, pokud si přečtete předchozí příspěvek, který se týkal signálů a úloh, budete mít představu o tom, jak získat zdroj našeho souboru funkcí v souboru bashrc, a proto můžeme funkce používat přímo z shellu bash . Skvělé

Upravte soubor bashrc na /home/username a přidejte tento řádek:

. /home/likegeeks/Desktop/myfuncs

Ujistěte se, že jste zadali správnou cestu.

Nyní je funkce dostupná pro použití přímo v příkazovém řádku:

$ addnum 10 20

Poznámka:Možná se budete muset odhlásit a přihlásit, abyste mohli používat funkce bash z shellu.

Další poznámka:pokud název funkce vytvoříte jako kterýkoli z vestavěných příkazů, přepíšete výchozí příkaz, takže byste se o to měli postarat.

Doufám, že se vám příspěvek líbí. Vraťte se.

Děkuji.


Linux
  1. Jak vytvořit alias a používat příkaz Alias ​​v Linuxu

  2. Vytvořte novou databázi a použijte ji v MySQL/MariaDB

  3. V Bash, kdy alias, kdy skript a kdy napsat funkci?

  1. Funkce v proměnných Shell?

  2. Exportujte proměnnou z bash a použijte ji v Pythonu

  3. Kdy použít Bash a kdy Perl/Python/Ruby?

  1. Jak definovat a používat funkce v Linux Shell Script

  2. Je možné vytvářet a používat nabídky v (terminálovém) Vimu?

  3. Problém se skriptováním Bash – porovnat dva seznamy a vytvořit třetí?