Lalim pa ngadto sa Function Complexities uban sa Shell Scripting - Bahin VII


Ang akong miaging artikulo bahin sa \Pagsabot ug Pagsulat sa mga gimbuhaton sa Shell Scripts tingali naghatag kanimo usa ka sukaranan nga ideya kung giunsa pagsulat ang mga gimbuhaton sa ilawom sa mga script sa kabhang. Karon na ang panahon aron mas lawom ang mga bahin nga magamit sama sa paggamit sa mga lokal nga variable ug recursion.

Unsa ang nakapahimo sa usa ka variable nga lokal? Nagdepende kini sa partikular nga bloke kung diin gipahayag ang variable. Ang usa ka variable nga gideklarar nga local mahimong ma-access gikan sa block sa code diin kini makita i.e. ang sakup niini lokal. Aron sa pagpatin-aw niini nga butang atong tan-awon ang usa ka pananglitan sa ubos.

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

Sa pagpatuman sa script sa ibabaw ang output mahimong.

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

Kini tungod kay ang function funcwala pa nagtawag samtang ang unang 2 ka echo nga pahayag gipatuman. Human sa pagtawag sa function func ang parehas nga 2 nga echo nga pahayag nagpatunghag lahi nga resulta. Karon ang variable j, nga gideklarar sulod sa funcug dili lokal, mahimong ma-access pagkahuman.

Busa ang bili sa j nahimong 20. Unsa man ang bahin sa lokal nga variable i? Tungod kay ang sakup niini naa sa sulod sa function func, ang kantidad nga 10 dili ma-access gikan sa gawas. Timan-i nga ang variable j kasagarang gideklarar sulod sa func kay global pinaagi sa default.

Karon pamilyar ka sa mga lokal nga variable ug kung giunsa kini gamiton sa sulod sa mga bloke sa function. Mopadayon kita sa labing makapaikag nga seksyon sa ilawom sa mga gimbuhaton, ang recursion.

Ang usa ka function nga nagtawag sa iyang kaugalingon sa kasagaran gitawag nga pamaagi sa pag-recursion. O mahimo kini nga gihubit ingon pagpahayag sa usa ka algorithm pinaagi sa paggamit sa usa ka mas simple nga bersyon sa parehas nga algorithm. Tagda ang pananglitan sa pagpangita sa factorial sa usa ka numero. Nahibal-an namon nga n! = 1 x 2 x 3 x … x (n-1) x n. Sa ingon mahimo naton isulat ang usa ka relasyon sa pagbalik ingon:

n! = (n-1)! x n

Mao nga dali alang kanamo nga balikbalik nga tawagan ang parehas nga function ug gamiton ang kantidad sa pagbalik gikan sa matag tawag aron magdaghan sa miaging resulta, i.e.

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

Dinhi gisulayan namon ang pagsulat sa usa ka script alang sa pagpangita sa factorial sa usa ka numero gamit ang mga lokal nga variable ug recursion.

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

Ang num usa ka lokal nga variable nga gigamit sa pagtipig sa matag n-1 nga kantidad sa matag tawag. Dinhi gisusi sa base nga kondisyon kung ang numero katumbas sa sero o dili (tungod kay 0! = 1 ug ang factorial wala gihubit alang sa negatibo nga mga numero). Sa pag-abot niini nga base nga kondisyon gibalik niini ang bili 1 ngadto sa nagtawag niini. Karon num = 1 ug ret = 1 x 1.

Niining higayona mibalik kini og 1 sa nagtawag niini. Karon num = 2 ug ret = 2 x 1 ug uban pa. Sa katapusan kung ang num = 5 mobalik nga kantidad mahimong 24 ug ang katapusan nga resulta mao ang ret = 5 x 24. Ang katapusan nga resulta 120 gipasa ngadto sa inisyal nga caller nga pahayag ug gipakita.

Adunay usa ka problema sa script sa ibabaw. Sama sa akong gipatin-aw sa miaging artikulo, ang mga gimbuhaton dili makabalik sa dagkong mga integer. Mao nga ang nahabilin sa mga tiggamit aron makapangita usa ka solusyon alang sa isyu sa ibabaw.

P. Makahimo ba mi og recursion nga dili mogamit ug lokal nga variables? Ang tubag kay Oo.

Tan-awa ang mosunod nga pananglitan sa pagpakita sa serye sa Fibonacci gamit ang recursion. Ang nag-unang relasyon sa pagbalik-balik mao ang:

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

Walay lokal nga mga variable ang gigamit sa script sa ibabaw. Nanghinaut ko nga masabtan nimo ang dagan sa script sa panahon sa pagpatuman.

Dinhi ang kantidad nga 15 nagrepresentar sa gidaghanon sa mga termino sa serye sa Fibonacci nga ipakita. Namatikdan ba nimo ang bisan unsang espesyal bahin sa pagpatuman sa script sa ibabaw. Nagkinahanglan kini og usa ka panahon, dili ba? Ang recursion sa usa ka script mas hinay kay sa recursion sa programming language sama sa C.

Uban niini nga artikulo, nagplano ako nga tapuson ang bahin sa mga function sa shell scripting. Magpabilin nga na-update sa Tecmint aron makuha ang umaabot nga mga artikulo sa mga arrays ug daghan pa…