GNU/Linux >> Znalost Linux >  >> Linux

Bash Beginner Series #9:Použití funkcí v Bash

Když jsou vaše bash skripty větší a větší, věci mohou být velmi nepořádné!

Může se stát, že znovu a znovu přepisujete stejné části kódu v různých částech svých bash skriptů.

Naštěstí se můžete vyhnout přepisování kódu pomocí funkcí v bash, díky kterým budou vaše skripty organizovanější a čitelnější.

V tomto tutoriálu se naučíte vytvářet funkce, vracet hodnoty funkcí a předávat argumenty funkcí ve skriptech bash shell.

Dále se dozvíte, jak funguje rozsah proměnných a jak definovat rekurzivní funkce.

Vytváření funkcí v bash

Existují dvě různé syntaxe pro deklaraci bash funkcí. Následující syntaxe je nejběžněji používaným způsobem vytváření bash funkcí:

function_name () {
commands
}

Druhá méně často používaná funkce při vytváření bash funkcí začíná vyhrazenou pracovní funkcí následovanou názvem funkce takto:

function function_name {
commands
}

Nyní existuje několik věcí, kterých byste si měli být dobře vědomi při práci s funkcemi:

  • Funkce se nikdy nespustí/neprovede, pokud ji nevyvoláte/zavoláte.
  • Definice funkce musí předcházet všem voláním funkce.

Kdykoli chcete funkci spustit, stačí ji zavolat! Volání funkce se provádí jednoduchým odkazem na název funkce.

Podívejte se na následující fun.sh bash skript:

#!/bin/bash

hello () {
echo "Hello World"
}

hello
hello
hello

Definoval jsem funkci s názvem ahoj to je prostě echo „Ahoj světe“ do terminálu. Všimněte si, že jsem udělal tři ahoj volání funkcí, takže pokud skript spustíte, uvidíte „Ahoj světe“ řádek vytištěný třikrát na obrazovce:

[email protected]:~$ ./fun.sh
Hello World
Hello World
Hello World

Vracení hodnot funkcí v bash

V mnoha programovacích jazycích funkce při volání vracejí hodnotu; to však není případ bash, protože funkce bash nevracejí hodnoty.

Když bash funkce dokončí provádění, vrátí stav ukončení posledního provedeného příkazu zachyceného v $? variabilní. Nula označuje úspěšné provedení nebo nenulové kladné celé číslo (1-255) označuje selhání.

Můžete použít návrat příkaz změnit stav ukončení funkce. Podívejte se například na následující error.sh skript:

#! /bin/bash

error () {
blabla
return 0
}

error
echo "The return status of the error function is: $?"

Pokud spustíte soubor error.sh bash skript, můžete být překvapeni výstupem:

[email protected]:~$ ./error.sh
./error.sh: line 4: blabla: command not found
The return status of the error function is: 0

Bez návratové 0 chyba funkce by nikdy nevrátila nenulový výstupní stav jako blabla je výsledkem příkaz nenalezen chyba.

Jak tedy můžete vidět, i když funkce bash nevracejí hodnoty, provedl jsem řešení změnou stavů ukončení funkce.

Měli byste také vědět, že příkaz return okamžitě ukončí funkci.

Předávání argumentů funkci bash

Argumenty můžete předat funkci stejně jako můžete předat argumenty bash skriptu. Při volání funkce pouze zahrnete argumenty.

Pro demonstraci se podívejme na následující iseven.sh bash skript:

#!/bin/bash

iseven () {
if [ $(($1 % 2)) -eq 0 ]; then
echo "$1 is even."
else
echo "$1 is odd."
fi
}

iseven 3
iseven 4
iseven 20
iseven 111

iseven() funkce testuje, zda je číslo sudé nebo liché. Provedl jsem čtyři volání funkcí iseven() . Pro každé volání funkce jsem dodal jedno číslo, které je prvním rozšířením funkce iseven() a odkazuje na něj $1 proměnná v definici funkce.

Spusťte iseven.sh bash skript, abyste se ujistili, že funguje:

[email protected]:~$ ./iseven.sh
3 is odd.
4 is even.
20 is even.
111 is odd.

Měli byste si také dobře uvědomit, že argumenty funkce bash a argumenty skriptu bash jsou dvě různé věci. Chcete-li porovnat rozdíl, podívejte se na následující funarg.sh bash skript:

#!/bin/bash

fun () {
echo "$1 is the first argument to fun()"
echo "$2 is the second argument to fun()"
}

echo "$1 is the first argument to the script."
echo "$2 is the second argument to the script."

fun Yes 7

Spusťte skript s několika argumenty a sledujte výsledek:

[email protected]:~$ ./funarg.sh Cool Stuff
Cool is the first argument to the script.
Stuff is the second argument to the script.
Yes is the first argument to fun()7 is the second argument to fun()

Jak můžete vidět, i když jste použili stejné proměnné $1 a $2 k odkazování na argumenty skriptu i argumenty funkce, při volání z funkce generují odlišné výsledky.

Místní a globální proměnné ve funkcích bash

Bash proměnné mohou mít globální nebo lokální rozsah. Ke globální proměnné můžete přistupovat kdekoli ve skriptu bash bez ohledu na rozsah. Naopak k lokální proměnné lze přistupovat pouze z jejich definice funkce.

Chcete-li to demonstrovat, podívejte se na následující scope.sh bash skript:

#!/bin/bash

v1='A'
v2='B'

myfun() {
local v1='C'
v2='D'
echo "Inside myfun(): v1: $v1, v2: $v2"
}

echo "Before calling myfun(): v1: $v1, v2: $v2"
myfun
echo "After calling myfun(): v1: $v1, v2: $v2"

Nejprve jsem definoval dvě globální proměnné v1 a v2 . Pak uvnitř myfun() definice, použil jsem místní klíčové slovo k definování lokální proměnné v1 a upravil globální proměnnou v2. Všimněte si, že můžete použít stejný název proměnné pro lokální proměnné v různých funkcích.

Nyní spustíme skript:

[email protected]:~$ ./scope.sh
Before calling myfun(): v1: A, v2: B
Inside myfun(): v1: C, v2: D
After calling myfun(): v1: A, v2: D

Z výstupu skriptu můžete vyvodit následující:

  • Místní proměnná, která má stejný název jako globální proměnná, bude mít přednost před globálními proměnnými v těle funkce.
  • Globální proměnnou můžete změnit z funkce.

Rekurzivní funkce

Rekurzivní funkce je funkce, která volá sama sebe! Rekurzivní funkce se hodí, když se pokoušíte vyřešit problém s programováním, který lze rozdělit na menší dílčí problémy.

Faktoriální funkce je klasickým příkladem rekurzivní funkce. Podívejte se na následující factorial.sh bash skript:

#!/bin/bash

factorial () {
if [ $1 -le 1 ]; then
echo 1
else
last=$(factorial $(( $1 -1)))
echo $(( $1 * last ))
fi
}

echo -n "4! is: "
factorial 4
echo -n "5! is: "
factorial 5
echo -n "6! is: "
factorial 6

Jakákoli rekurzivní funkce musí začínat základním případem což má nutně ukončit řetězec volání rekurzivních funkcí. V factorial() funkce, základní případ je definován následovně:

if [ $1 -le 1 ]; then
echo 1

Nyní odvoďte rekurzivní případ pro faktoriálovou funkci. K výpočtu faktoriálu čísla n kde n je kladné číslo větší než jedna, můžete vynásobit n faktoriálem n-1 :

factorial(n) = n * factorial(n-1)

Použijme výše uvedenou rovnici k napsání tohoto rekurzivního případu:

last=$(factorial $(( $1 -1)))
echo $(( $1 * last ))

Nyní spusťte skript a ujistěte se, že máte správné výsledky:

[email protected]:~$ ./factorial.sh
4! is: 24
5! is: 120
6! is: 720

Jako další cvičení zkuste napsat rekurzivní funkci pro výpočet n-tého Fibonacciho čísla. Nejprve se pokuste vymyslet základní případ a poté rekurzivní případ; máš to!

Potřebujete více cvičení? Stáhněte si níže uvedené PDF a procvičte si funkce v bash skriptech. Ve stejném PDF máte také řešení.

Bash Kapitola 9 Cvičné otázkyProblémy a jejich řešení k procvičení toho, co jste se právě naučili v této kapitoleBash-Kapitola-9-Procvičení-otázek-Linux-Příručka.pdf31 KB

Úžasný! Další a poslední kapitola této série použije vše, co jste se dosud naučili, k psaní efektivních bash skriptů, které automatizují nudné administrativní úkoly.


Linux
  1. Funkce v proměnných Shell?

  2. Bash Beginner Series #8:Loops in Bash

  3. Použití případových prohlášení v Bash

  1. Použití Bash pro automatizaci

  2. Jak vytvářet a volat funkce v Bash

  3. Používáte hodinky k opakovanému spouštění funkce v Bash?

  1. Bash funkce

  2. Shell Scripting Část V:Funkce v Bash

  3. Bash skriptování – funkce vysvětlené na příkladech