„Shell Scripts“ funkcijų supratimas ir rašymas – VI dalis


Funkcijos vaidina svarbų vaidmenį bet kurioje programavimo kalboje. Kaip ir daugelis tikrų programavimo kalbų, bash turi funkcijų, kurios naudojamos su ribotu įgyvendinimu.

Kas yra funkcijos?

Programavime funkcijos įvardijamos tam tikrą užduotį atliekančios programos dalys. Šia prasme funkcija yra tam tikros rūšies procedūra arba rutina. Kai funkcija iškviečiama, programa palieka dabartinę kodo dalį ir pradeda vykdyti pirmąją eilutę funkcijos viduje. Kai yra pasikartojantis kodas arba kai užduotis kartojasi, apsvarstykite galimybę vietoj jos naudoti funkciją.

Pavyzdžiui, apsvarstykite atvejį, kai mums reikia rasti skaičiaus faktorialą keliuose konkrečios programos etapuose. Užuot rašę visą kodą (faktorialui apskaičiuoti) kiekvieną kartą, galime parašyti tą kodo dalį, kuri apskaičiuoja faktorialą vieną kartą bloke ir pakartotinai panaudoti tą patį kelis kartus.

Kodėl rašome funkcijas?

  1. Tai padeda mums pakartotinai naudoti kodą.
  2. Pagerinkite programos skaitomumą.
  3. Efektyvus kintamųjų naudojimas programos viduje.
  4. Leidžia išbandyti programą po dalies.
  5. Rodo programą kaip papildomų veiksmų rinkinį.
Funkcijos apvalkalo scenarijuose

Bendroji funkcijų rašymo į apvalkalo scenarijų sintaksė apima šiuos būdus.

function func_name {
	. . .
	commands
	. . .
}

or

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

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

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

Jūs visada galite laisvai rašyti tinkamas komandas šiuose funkciniuose blokuose, kaip įprastai darome apvalkalo scenarijuose. Dabar pabandykime parašyti vieną paprastą scenarijų su maža funkcija.

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

Funkcijos apibrėžimas turi būti prieš pirmąjį jos iškvietimą. Nėra nieko panašaus į funkciją „deklaruoti funkciją“ prieš ją iškviečiant. Ir visada galime sudėti funkcijas funkcijų viduje.

Pastaba: rašant tuščias funkcijas visada atsiranda sintaksės klaidų.

Kai ta pati funkcija apibrėžiama kelis kartus, iškviečiama galutinė versija. Paimkime pavyzdį.

#!/bin/bash

func_same ( ) {
	echo ‘First definition’
}

func_same ( ) {
	echo ‘Second definition’
}

func_same

exit 0
Funkcijos, paimančios parametrus ir grąžinančios reikšmes

Pažvelkime giliau, apsvarstydami funkcijas, kurios ima parametrus ir grąžina reikšmes. Norėdami grąžinti reikšmę iš funkcijos, naudojame įmontuotą apvalkalą „grįžti“. Sintaksė yra tokia.

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

Panašiai galime perduoti argumentus funkcijoms, atskirtoms tarpais, kaip nurodyta toliau.

func_name $arg_1 $arg_2 $arg_3

Funkcijos viduje galime pasiekti argumentus tokia tvarka kaip $1, $2, $3 ir pan. Pažvelkite į šį scenarijaus pavyzdį, kad surastumėte daugiausiai du sveikuosius skaičius naudodami funkciją, kad padidintumėte aiškumą.

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

Tai, kas išdėstyta pirmiau, atrodo šiek tiek sudėtinga, bet tai paprasta, jei perskaitome eilutes. Pirmiausia įdėtos jei-else if eilutės patvirtinimo tikslais, ty patikrinti argumentų skaičių ir tipą naudojant reguliariąsias išraiškas. Po to mes iškviečiame funkciją su dviem komandinės eilutės argumentais ir parodome rezultatą. Taip yra todėl, kad iš funkcijos negalime grąžinti didelių sveikųjų skaičių. Kitas būdas išspręsti šią problemą yra naudoti visuotinius kintamuosius, kad būtų išsaugotas rezultatas funkcijos viduje. Toliau pateiktame scenarijuje paaiškinamas šis metodas.

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

Dabar išbandykite keletą įdomių problemų, kurios buvo paaiškintos ankstesnėje apvalkalo scenarijų serijoje, naudodami toliau nurodytas funkcijas.

  1. Supraskite pagrindinius „Linux Shell“ scenarijų kalbos patarimus – I dalis
  2. 5 apvalkalo scenarijai, skirti Linux naujokams mokytis apvalkalo programavimo – II dalis
  3. Plaukimas per Linux BASH scenarijų pasaulį – III dalis
  4. Matematinis Linux apvalkalo programavimo aspektas – IV dalis
  5. Matematinių išraiškų skaičiavimas Shell skriptų kalba – V dalis

Kitoje dalyje pateiksiu daugiau įžvalgų apie funkcines funkcijas, tokias kaip vietinių kintamųjų naudojimas, rekursija ir kt. Sekite naujienas su komentarais.