Dýpra í virkni flókinna með Shell Scripting - Hluti VII


Fyrri grein mín um Skilning og ritun aðgerða í Shell Scripts gæti hafa gefið þér grunnhugmynd um hvernig á að skrifa föll undir skel scriptum. Nú er kominn tími til að fara dýpra í virkni eiginleika eins og notkun staðbundinna breytna og endurtekningar.

Hvað gerir breytu staðbundna? Það fer eftir tilteknum blokk þar sem breytan er lýst. Breyta sem lýst er yfir sem staðbundin verður aðgengileg úr kóðablokkinni þar sem hún birtist þ.e.a.s. umfang hennar er staðbundið. Til að útskýra þetta skulum við skoða eitt dæmi hér að neðan.

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

Þegar ofangreint handrit er keyrt verður úttakið.

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

Þetta er vegna þess að aðgerðin func hefur ekki enn kallað á meðan fyrstu 2 echo setningarnar voru keyrðar. Eftir að hafa kallað fallið func gefa sömu 2 bergmálsyfirlýsingarnar aðra niðurstöðu. Nú var hægt að nálgast breytuna j, sem var lýst inni í func en ekki staðbundin, eftirá.

Þannig verður gildi fyrir j 20. Hvað með staðbundnu breytuna i? Þar sem umfang þess var innan aðgerðarinnar func, var ekki hægt að nálgast gildi 10 utan frá. Athugaðu að breytan j sem venjulega er lýst inni í func er sjálfgefið alþjóðleg.

Núna ertu kunnugur staðbundnum breytum og hvernig á að nota þær innan aðgerðablokka. Við skulum halda áfram í áhugaverðasta hlutann undir aðgerðum, endurkomu.

Aðgerð sem kallar sig er almennt kölluð endurtekningaraðferðin. Eða það er hægt að skilgreina það sem að tjá reiknirit með því að nota einfaldari útgáfu af sama reikniritinu. Lítum á dæmið um að finna þáttatölu. Við vitum að n! = 1 x 2 x 3 x … x (n-1) x n. Þannig getum við skrifað endurtekningartengsl sem:

n! = (n-1)! x n

Þannig að það er auðvelt fyrir okkur að hringja endurtekið í sömu aðgerðina og nota afturgildið frá hverju símtali til að margfalda með fyrri niðurstöðu, þ.e.

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

Hér reynum við að skrifa forskrift til að finna þáttatölu með því að nota staðbundnar breytur og endurkomu.

#!/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 er staðbundin breyta sem notuð er til að geyma hvert n-1 gildi í hverju símtali. Hér athugar grunnskilyrðið hvort talan sé jöfn núlli eða ekki (þar sem 0! = 1 og þáttagildi er ekki skilgreint fyrir neikvæðar tölur). Þegar þetta grunnskilyrði er komið skilar það gildinu 1 til þess sem hringir. Nú er num = 1 og ret = 1 x 1.

Á þessu augnabliki skilar það 1 til þess sem hringir. Nú er num = 2 og ret = 2 x 1 og svo framvegis. Að lokum þegar num = 5 skilar gildið 24 og lokaniðurstaðan er ret = 5 x 24. Lokaniðurstaðan 120 er send niður í upphaflegu yfirlýsingu þess sem hringir og birtist.

Það er eitt vandamál í handritinu hér að ofan. Eins og ég útskýrði í fyrri grein geta aðgerðir ekki skilað stórum heiltölum. Svo það er eftir notendum að finna lausn á ofangreindu vandamáli.

Sp. Getum við framkvæmt endurkomu án þess að nota staðbundnar breytur? Svarið er Já.

Horfðu á eftirfarandi dæmi til að sýna Fibonacci röðina með endurkomu. Grunn endurtekningarsambandið er:

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

Engar staðbundnar breytur eru notaðar í ofangreindu handriti. Ég vona að þú getir skilið flæði handritsins meðan á framkvæmd stendur.

Hér táknar gildið 15 fjölda hugtaka í Fibonacci röðinni sem á að sýna. Tókstu eftir einhverju sérstöku varðandi framkvæmd ofangreindra handrita. Það tekur smá tíma, er það ekki? Endurtekning í handriti er hægari en endurtekning í forritunarmálum eins og C.

Með þessari grein ætla ég að ljúka aðgerðahlutanum í skeljaforskriftum. Vertu uppfærður með Tecmint til að hafa komandi greinar um fylki og margt fleira ...