Kuelewa na Kuandika utendakazi katika Hati za Shell - Sehemu ya VI


Kazi zina jukumu muhimu katika lugha yoyote ya programu. Kama lugha nyingi za programu halisi, bash ina kazi ambazo hutumiwa na utekelezaji mdogo.

Kazi ni nini?

Katika programu, kazi huitwa sehemu za programu inayofanya kazi maalum. Kwa maana hii, kazi ni aina ya utaratibu au utaratibu. Wakati kazi inaitwa mpango huacha sehemu ya sasa ya msimbo na huanza kutekeleza mstari wa kwanza ndani ya kazi. Wakati wowote kunapokuwa na msimbo unaojirudia au kazi inapojirudia, zingatia kutumia chaguo la kukokotoa badala yake.

Kwa mfano, zingatia hali ambapo tunahitaji kupata hali halisi ya nambari katika hatua kadhaa za mpango mahususi. Badala ya kuandika msimbo mzima (kwa kukokotoa kipengele) kila mara, tunaweza kuandika sehemu hiyo ya msimbo ambayo hukokotoa kipengele mara moja ndani ya kizuizi na kuitumia tena mara nyingi.

  1. Inatusaidia kutumia tena msimbo.
  2. Boresha usomaji wa programu.
  3. Matumizi bora ya vigeu ndani ya programu.
  4. Inaturuhusu kujaribu programu sehemu kwa sehemu.
  5. Inaonyesha programu kama rundo la hatua ndogo.

Syntax ya jumla ya kazi za uandishi katika hati ya ganda inajumuisha njia zifuatazo.

function func_name {
	. . .
	commands
	. . .
}

or

func_name ( ) {
	. . .
	commands
	. . .
}

Opening curly braces can also be used in the second line as well.

func_name ( )
{
	. . .
	commands
	. . .
}

Una uhuru kila wakati kuandika amri halali ndani ya vizuizi hivi vya kukokotoa kama tunavyofanya kawaida katika hati za ganda. Sasa hebu tujaribu kuandika script moja rahisi na kazi ndogo ndani yake.

#!/bin/bash

call_echo ( ) {
	echo ‘This is inside function’
}

op=$1

if [ $# -ne 1 ]; then
	echo "Usage: $0 <1/0>"
else
	if [ $1 = 0 ] ; then
		echo ‘This is outside function’
	elif [ $1 = 1 ] ; then
		call_echo
	else
		echo ‘Invalid argument’
	fi
fi

exit 0

Ufafanuzi wa chaguo za kukokotoa lazima utangulie mwito wa kwanza kwake. Hakuna kitu kama 'kutangaza kazi' kabla ya kuiita. Na tunaweza kuweka vitendaji ndani ya vitendakazi kila wakati.

Kumbuka: - Kuandika kazi tupu kila wakati husababisha makosa ya sintaksia.

Wakati utendakazi sawa unafafanuliwa mara nyingi, toleo la mwisho ndilo linalotumiwa. Hebu tuchukue mfano.

#!/bin/bash

func_same ( ) {
	echo ‘First definition’
}

func_same ( ) {
	echo ‘Second definition’
}

func_same

exit 0

Hebu tupate undani zaidi kwa kuzingatia chaguo za kukokotoa kuchukua vigezo na kurejesha thamani. Ili kurejesha thamani kutoka kwa chaguo za kukokotoa tunatumia ganda la 'rejesha' lililojengewa ndani. Sintaksia ni kama ifuatavyo.

func_name ( ) {
	. . .
	commands
	. . .
	return $ret_val
}

Vile vile tunaweza kupitisha hoja kwa kazi zilizotenganishwa na nafasi kama zilivyotolewa hapa chini.

func_name $arg_1 $arg_2 $arg_3

Ndani ya kitendakazi tunaweza kufikia hoja kwa mpangilio kama $1, $2, $3 na kadhalika. Angalia hati ya mfano ifuatayo ili kupata upeo wa nambari mbili kamili kwa kutumia chaguo la kukokotoa ili kuongeza uwazi zaidi.

#!/bin/bash

USG_ERR=7

max_two ( ) {
	if [ "$1" -eq "$2" ] ; then
		echo 'Equal'
		exit 0
	elif [ "$1" -gt "$2" ] ; then
		echo $1
	else
		echo $2
	fi
}

err_str ( ) {
	echo "Usage: $0 <number1>  <number2>"
	exit $USG_ERR
}

NUM_1=$1
NUM_2=$2
x
if [ $# -ne 2 ] ; then
	err_str
elif [ `expr $NUM_1 : '[0-9]*'` -eq ${#NUM_1} ] ; then
	if [ `expr $NUM_2 : '[0-9]*'` -eq ${#NUM_2} ] ; then  
		max_two $NUM_1 $NUM_2
	else
		err_str
	fi
else
	err_str
fi

exit 0

Hapo juu inaonekana kama ngumu kidogo, lakini ni rahisi ikiwa tunasoma kupitia mistari. Kwanza iliwekwa kama-ikiwa ni mistari kwa madhumuni ya uthibitishaji, yaani, kuangalia nambari na aina ya hoja kwa usaidizi wa maneno ya kawaida. Baada ya hapo tunaita kazi na hoja mbili za mstari wa amri na kuonyesha matokeo huko yenyewe. Hii ni kwa sababu hatuwezi kurudisha nambari kamili kutoka kwa chaguo za kukokotoa. Njia nyingine ya kusuluhisha shida hii ni kutumia anuwai za ulimwengu kuhifadhi matokeo ndani ya kazi. Nakala hapa chini inaelezea njia hii.

#!/bin/bash

USG_ERR=7
ret_val=

max_two ( ) {
	if [ "$1" -eq "$2" ] ; then
		echo 'Equal'
		exit 0
	elif [ "$1" -gt "$2" ] ; then
		ret_val=$1
	else
		ret_val=$2
	fi
}

err_str ( ) {
	echo "Usage: $0 <number1>  <number2>"
	exit $USG_ERR
}

NUM_1=$1
NUM_2=$2

if [ $# -ne 2 ] ; then
	err_str
elif [ `expr $NUM_1 : '[0-9]*'` -eq ${#NUM_1} ] ; then
	if [ `expr $NUM_2 : '[0-9]*'` -eq ${#NUM_2} ] ; then  
		max_two $NUM_1 $NUM_2
		echo $ret_val
	else
		err_str
	fi
else
	err_str
fi

exit 0

Sasa jaribu matatizo ya kusisimua ambayo yalielezewa katika mfululizo wa awali wa uandishi wa ganda kwa kutumia vitendaji kama vifuatavyo.

  1. Elewa Vidokezo vya Msingi vya Lugha ya Uandishi wa Shell ya Linux - Sehemu ya I
  2. Hati 5 za Shell za Linux Wapya Kujifunza Utayarishaji wa Shell - Sehemu ya II
  3. Kusafiri Katika Ulimwengu wa Linux BASH Scripting - Sehemu ya III
  4. Kipengele cha Hisabati cha Upangaji wa Linux Shell - Sehemu ya IV
  5. Kukokotoa Tamko la Hisabati katika Lugha ya Hati ya Shell - Sehemu ya V

Nitarudi na ufahamu zaidi wa vipengee vya kufanya kazi kama kutumia vigeu vya kawaida, kujirudia n.k katika sehemu inayofuata. Endelea kusasishwa na maoni.