Méi déif a Funktiounskomplexitéite mat Shell Scripting - Deel VII


Mäi viregten Artikel iwwer Funktionalitéiten an Shell-Skripten verstoen an schreiwen hätt Iech vläicht eng Basis Iddi ginn, wéi Dir Funktiounen ënner Shell-Skripte schreift. Elo ass et Zäit fir méi déif a funktionell Fonctiounen wéi d'Benotzung vu lokalen Variablen a Rekursioun ze ginn.

Wat mécht eng Variabel lokal? Et hänkt vun deem bestëmmte Block of, wou d'Variabel deklaréiert gëtt. Eng Variabel, déi als lokal deklaréiert gëtt, wäert aus deem Codeblock zougänglech sinn, wou se erschéngt, d.h. säin Ëmfang ass lokal. Fir dës Saach z'erklären, kucke mer e Beispill hei ënnen.

#!/bin/bash 

func( ) { 
	local i=10 
	j=20 
	echo "i from func = $i" 
	echo "j from func = $j" 
} 

echo "i outside func = $i" 
echo "j outside func = $j" 

func 

echo "i outside func = $i" 
echo "j outside func = $j" 

exit 0

Beim Ausféierung vum uewe genannte Skript wäert d'Ausgab sinn.

i outside func = 
j outside func = 
i from func = 10 
j from func = 20 
i outside func = 
j outside func = 20

Dëst ass well d'Funktioun func nach net geruff gouf wärend déi éischt 2 Echo Aussoen ausgefouert goufen. Nodeems Dir d'Funktioun func opgeruff hutt, produzéieren déiselwecht 2 Echo Aussoen en anert Resultat. Elo konnt d'Variabel j, déi bannent func deklaréiert gouf an net lokal, duerno zougänglech sinn.

Sou gëtt de Wäert fir j 20. Wéi ass et mat der lokaler Variabel i? Well säin Ëmfang an der Funktioun func war, konnt de Wäert 10 net vu baussen zougänglech sinn. Bedenkt datt d'Variabel j normalerweis bannent func deklaréiert gëtt als Standard global ass.

Elo sidd Dir vertraut mat lokalen Variablen a wéi Dir se a Funktiounsblocken benotzt. Loosst eis op déi interessantst Rubrik ënner Funktiounen goen, d'Rekursioun.

Eng Funktioun déi sech selwer nennt gëtt allgemeng als Rekursiounsprozedur bezeechent. Oder et kann definéiert ginn als en Algorithmus auszedrécken andeems Dir eng méi einfach Versioun vum selwechte Algorithmus benotzt. Betruecht d'Beispill fir Faktorial vun enger Zuel ze fannen. Mir wëssen, datt n! = 1 x 2 x 3 x … x (n-1) x n. Also kënne mir eng Widderhuelungsrelatioun schreiwen wéi:

n! = (n-1)! x n

Also et ass einfach fir eis déiselwecht Funktioun rekursiv ze ruffen an de Retourwäert vun all Uruff ze benotzen fir mat dem virege Resultat ze multiplizéieren, d.h.

5! = 4! x 5
4! = 3! x 4
3! = 2! x 3
2! = 1! x 2
1! = 0! x 1

Hei probéieren mir e Skript ze schreiwen fir Faktorial vun enger Zuel ze fannen mat lokalen Variablen a Rekursioun.

#!/bin/bash 

fact( ) { 
	local num=$1 
	if [ $num -eq 0 ]; then 
		ret=1 
	else 
		temp=$((num-1)) 
		fact $temp 
		ret=$((num*$?)) 
	fi 
	return $ret 
} 

fact 5 

echo "Factorial of 5 = $?" 

exit 0

num ass eng lokal Variabel déi benotzt gëtt fir all n-1 Wäert op all Uruff ze späicheren. Hei kontrolléiert d'Basisbedingung ob d'Zuel gläich ass null oder net (well 0! = 1 a Faktorial ass net fir negativ Zuelen definéiert). Beim Arrivée vun dëser Basiskonditioun gëtt de Wäert 1 un säin Uruffer zréck. Elo num = 1 an ret = 1 x 1.

An dësem Moment gëtt et 1 zréck op säin Uruffer. Elo num = 2 an ret = 2 x 1 a sou weider. Endlech wann num = 5 de Retourwäert 24 ass an d'Endresultat ass ret = 5 x 24. D'Finale Resultat 120 gëtt un déi initial Urufferklärung weiderginn a gëtt ugewisen.

Et gëtt ee Problem am uewe genannte Skript. Wéi ech am viregten Artikel erkläert hunn, kënnen d'Funktioune keng grouss ganz Zuelen zréckginn. Also ass et un d'Benotzer lénks fir eng Léisung fir dat uewe genannte Problem ze fannen.

Q. Kënne mir Rekursioun ausféieren ouni lokal Variabelen ze benotzen? D'Äntwert ass Jo.

Kuckt de folgende Beispill fir d'Fibonacci Serie mat Rekursioun ze weisen. Déi Basis Widderhuelung Relatioun ass:

fib(0) = 0 
fib(1) = 1 
else 
	fib(n) = fib(n-1) + fib(n-2)

Fibonacci series using recursion

#!/bin/bash 

fib( ) { 
	a=$1 
	if [ $a -lt 2 ]; then 
		echo $a 
	else 
		((--a)) 
		b=$(fib $a) 

		((--a)) 
		c=$(fib $a) 

		echo $((b+c)) 
	fi 
} 

for i in $(seq 0 15) 
do 
	out=$(fib $i) 
	echo $out 
done 

exit 0

Keng lokal Variablen ginn am uewe genannte Skript benotzt. Ech hoffen Dir kënnt de Flux vum Skript während der Ausféierung verstoen.

Hei stellt de Wäert 15 d'Zuel vun de Begrëffer an der Fibonacci Serie duer fir ze weisen. Hutt Dir eppes Besonnesches betreffend d'Ausféierung vum uewe genannte Skript gemierkt. Et dauert eng Zäit, oder? Rekursioun an engem Skript ass méi lues wéi e Rekursioun a Programméierungssprooche wéi C.

Mat dësem Artikel plangen ech d'Funktiounen Deel am Shell Scripting ofzeschléissen. Bleift aktualiséiert mam Tecmint fir déi kommend Artikelen iwwer Arrays ze hunn a vill méi ...