Shelliskriptide funktsioonide mõistmine ja kirjutamine - VI osa


Funktsioonid mängivad olulist rolli igas programmeerimiskeeles. Nagu paljudel tegelikel programmeerimiskeeltel, on ka bashil funktsioone, mida kasutatakse piiratud rakendusega.

Mis on funktsioonid?

Programmeerimisel nimetatakse funktsioone programmi sektsioonideks, mis täidavad konkreetset ülesannet. Selles mõttes on funktsioon teatud tüüpi protseduur või rutiin. Kui funktsiooni nimetatakse, lahkub programm praegusest koodiosast ja hakkab täitma funktsiooni esimest rida. Alati, kui kood on korduv või ülesanne kordub, kaaluge funktsiooni kasutamist.

Vaatleme näiteks juhtumit, kus peame leidma arvu faktori konkreetse programmi mitmel etapil. Selle asemel, et kirjutada iga kord kogu kood (faktooriumi arvutamiseks), võime kirjutada selle osa koodist, mis arvutab faktoori kord plokis ja kasutab seda mitu korda uuesti.

  1. See aitab meil koodi uuesti kasutada.
  2. Parandage programmi loetavust.
  3. Muutujate tõhus kasutamine programmis.
  4. lubab meil programmi osa kaupa testida.
  5. Kuvab programmi hulga alamastmetena.

Shelliskriptis funktsioonide kirjutamise üldine süntaks sisaldab järgmisi viise.

function func_name {
	. . .
	commands
	. . .
}

or

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

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

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

Nendesse funktsiooniplokkidesse saate alati kirjutada kehtivaid käske, nagu tavaliselt shelliskriptides. Proovime nüüd kirjutada ühe lihtsa skripti, mille sees on väike funktsioon.

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

Funktsiooni määratlus peab eelnema esimesele sellele helistamisele. Enne funktsiooni kutsumist pole midagi sellist deklareerida. Ja funktsioone saab alati pesastada funktsioonide sees.

Märkus. - Tühjade funktsioonide kirjutamine põhjustab alati süntaksivigu.

Kui sama funktsioon on mitu korda määratletud, kasutatakse lõplikku versiooni. Võtame näite.

#!/bin/bash

func_same ( ) {
	echo ‘First definition’
}

func_same ( ) {
	echo ‘Second definition’
}

func_same

exit 0

Läheme sügavamale, kaaludes funktsioone, mis võtavad parameetreid ja tagastavad väärtused. Funktsiooni väärtuse tagastamiseks kasutame sisseehitatud kestat „return”. Süntaks on järgmine.

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

Samamoodi võime edastada argumente tühikutega eraldatud funktsioonidele, nagu allpool toodud.

func_name $arg_1 $arg_2 $arg_3

Funktsiooni sees pääseme juurde argumentidele järjestuses $1, $2, $3 ja nii edasi. Vaadake järgmist skripti näidiskomplekti, et leida maksimaalselt kaks täisarvu, kasutades funktsiooni suurema selguse suurendamiseks.

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

Ülaltoodu näeb välja veidi keeruline, kuid see on lihtne, kui loeme read läbi. Esmalt pesitsesid valideerimise eesmärgil rida if-else if, st argumendi arvu ja tüübi kontrollimiseks regulaaravaldiste abil. Pärast seda kutsume funktsiooni kahe käsureaargumendiga ja kuvame tulemuse seal ise. Seda seetõttu, et me ei saa funktsioonist suuri täisarvusid tagastada. Teine võimalus selle probleemi lahendamiseks on globaalsete muutujate kasutamine tulemuse funktsiooni salvestamiseks. Allpool olev skript selgitab seda meetodit.

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

Proovige nüüd mõnda põnevat probleemi, mida eelmises shelliskriptide seerias selgitati, kasutades järgmisi funktsioone.

  1. Mõistke põhilisi Linuxi šelli skriptikeele näpunäiteid - I osa
  2. 5 Shelli skripti Linuxi algajatele, et õppida Shelli programmeerimist - II osa
  3. Purjetamine Linuxi BASH-skriptide maailmas - III osa
  4. Linuxi kesta programmeerimise matemaatiline aspekt - IV osa
  5. Matemaatiliste avaldiste arvutamine šelli skriptikeeles - V osa

Järgmises osas saan rohkem ülevaate funktsionaalsetest funktsioonidest, nagu kohalike muutujate kasutamine, rekursioon jne. Hoidke end kommentaaridega kursis.