Aktar fil-fond fil-Kumplessitajiet tal-Funzjonijiet bi Shell Scripting - Parti VII


L-artiklu preċedenti tiegħi dwar \Fehim u Kitba tal-funzjonijiet fi Shell Scripts seta' tak idea bażika dwar kif tikteb funzjonijiet taħt shell scripts. Issa wasal iż-żmien li tidħol aktar fil-fond fil-karatteristiċi funzjonali bħall-użu ta' varjabbli lokali u rikorsi.

X'jagħmel varjabbli lokali? Jiddependi fuq dik il-blokka partikolari fejn tiġi ddikjarata l-varjabbli. Varjabbli ddikjarata bħala lokali tkun aċċessibbli minn dik il-blokka ta’ kodiċi fejn tidher jiġifieri l-ambitu tagħha huwa lokali. Sabiex nispjegaw din il-ħaġa ejja nħarsu lejn eżempju wieħed hawn taħt.

#!/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

Fuq l-eżekuzzjoni tal-iskript ta 'hawn fuq l-output se jkun.

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

Dan minħabba li l-funzjoni func għadha ma sejħitx waqt li l-ewwel 2 dikjarazzjonijiet echo ġew esegwiti. Wara li ssejjaħ il-funzjoni func l-istess 2 dikjarazzjonijiet echo jipproduċu riżultat differenti. Issa l-varjabbli j, li kienet iddikjarata ġewwa funcu mhux lokali, setgħet tiġi aċċessata wara.

Għalhekk il-valur għal j isir 20. Xi ngħidu dwar il-varjabbli lokali i? Peress li l-ambitu tiegħu kien ġewwa l-funzjoni func, il-valur 10 ma setax jiġi aċċessat minn barra. Innota li l-varjabbli j normalment iddikjarata ġewwa func hija globali awtomatikament.

Issa inti familjari mal-varjabbli lokali u kif tużahom ġewwa blokok tal-funzjoni. Ejja ngħaddu għat-taqsima l-aktar interessanti taħt il-funzjonijiet, ir-rikors.

Funzjoni li ssejjaħ lilha nnifisha ġeneralment tissejjaħ bħala l-proċedura ta' rikorsi. Jew jista 'jiġi definit bħala li jesprimi algoritmu billi tuża verżjoni aktar sempliċi ta' dak l-istess algoritmu. Ikkunsidra l-eżempju tas-sejba ta’ fatturi ta’ numru. Nafu li n! = 1 x 2 x 3 x … x (n-1) x n. Għalhekk nistgħu niktbu relazzjoni ta' rikorrenza bħala:

n! = (n-1)! x n

Allura huwa faċli għalina li nsejħu b'mod rikorsiv l-istess funzjoni u nużaw il-valur tar-ritorn minn kull sejħa biex timmultiplika bir-riżultat preċedenti, i.e.

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

Hawnhekk nippruvaw niktbu skript biex insibu l-fatturali ta 'numru bl-użu ta' varjabbli lokali u rikorsi.

#!/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 hija varjabbli lokali użata biex taħżen kull valur n-1 fuq kull sejħa. Hawnhekk il-kundizzjoni bażi tiċċekkja jekk in-numru huwiex ugwali għal żero jew le (peress 0! = 1 u l-fatturali mhuwiex definit għal numri negattivi). Meta tasal din il-kundizzjoni bażi hija tirritorna l-valur 1 lil min iċempel. Issa num = 1 u ret = 1 x 1.

F'dan il-mument jirritorna 1 lil min iċempel. Issa num = 2 u ret = 2 x 1 u l-bqija. Fl-aħħarnett meta num = 5 il-valur tar-ritorn ikun 24 u r-riżultat finali huwa ret = 5 x 24. Ir-riżultat finali 120 jiġi mgħoddi għad-dikjarazzjoni inizjali ta' min iċempel u jintwera.

Hemm problema waħda fl-iskrittura ta 'hawn fuq. Kif spjegajt fl-artiklu preċedenti, il-funzjonijiet ma jistgħux jirritornaw interi kbar. Allura ħalla lill-utenti biex isibu soluzzjoni għall-kwistjoni ta 'hawn fuq.

Q. Nistgħu nwettqu rikorsi mingħajr ma nużaw varjabbli lokali? It-tweġiba hija Iva.

Ħares lejn l-eżempju li ġej biex turi s-serje Fibonacci billi tuża r-rikorsjoni. Ir-relazzjoni bażika tar-rikorrenza hija:

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

L-ebda varjabbli lokali ma jintuża fl-iskrittura ta' hawn fuq. Nittama li tista' tifhem il-fluss tal-iskrittura waqt l-eżekuzzjoni.

Hawnhekk il-valur 15 jirrappreżenta n-numru ta 'termini fis-serje Fibonacci li għandhom jintwerew. Innotajt xi ħaġa speċjali rigward l-eżekuzzjoni tal-iskrittura ta' hawn fuq. Huwa jieħu ftit, hux? Ir-rikorsjoni fi skript hija aktar bil-mod minn rikorsi f'lingwi ta' programmar bħal C.

B'dan l-artikolu, qed nippjana li nikkonkludi l-parti tal-funzjonijiet fil-shell scripting. Ibqa' aġġornat ma' Tecmint biex ikollok l-artikoli li ġejjin dwar l-arrays u ħafna aktar...