Razumijevanje i pisanje funkcija u shell skriptama - Dio VI


Funkcije igraju važnu ulogu u svakom programskom jeziku. Kao i mnogi pravi programski jezici, bash ima funkcije koje se koriste sa ograničenom implementacijom.

Šta su funkcije?

U programiranju, funkcije se nazivaju dijelovi programa koji obavljaju određeni zadatak. U tom smislu, funkcija je vrsta procedure ili rutine. Kada se funkcija pozove, program napušta trenutni dio koda i počinje izvršavati prvi red unutar funkcije. Kad god postoji kod koji se ponavlja ili kada se zadatak ponavlja, razmislite o korištenju funkcije umjesto toga.

Na primjer, uzmite u obzir slučaj kada trebamo pronaći faktorijel broja u nekoliko faza određenog programa. Umjesto pisanja cijelog koda (za izračunavanje faktorijala) svaki put, možemo napisati onaj dio koda koji izračunava faktorijel jednom unutar bloka i ponovo ga koristiti u više navrata.

Zašto pišemo funkcije?

  1. Pomaže nam da ponovo koristimo kod.
  2. Poboljšajte čitljivost programa.
  3. Efikasna upotreba varijabli unutar programa.
  4. Omogućava nam da testiramo program dio po dio.
  5. Prikazuje program kao gomilu podkoraka.
Funkcije u shell skriptama

Opća sintaksa za pisanje funkcija u shell skriptu uključuje sljedeće načine.

function func_name {
	. . .
	commands
	. . .
}

or

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

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

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

Uvijek ste slobodni pisati važeće komande unutar ovih funkcionalnih blokova kao što to obično radimo u shell skriptama. Pokušajmo sada napisati jednu jednostavnu skriptu s malom funkcijom unutar nje.

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

Definicija funkcije mora prethoditi prvom njenom pozivu. Ne postoji ništa poput 'deklariranja funkcije' prije nego što je pozovete. I uvijek možemo ugnijezditi funkcije unutar funkcija.

Napomena: - Pisanje praznih funkcija uvijek rezultira sintaksičkim greškama.

Kada je ista funkcija definirana više puta, konačna verzija je ono što se poziva. Uzmimo primjer.

#!/bin/bash

func_same ( ) {
	echo ‘First definition’
}

func_same ( ) {
	echo ‘Second definition’
}

func_same

exit 0
Funkcije koje uzimaju parametre i vraćaju vrijednosti

Hajdemo dublje razmatrajući funkcije koje uzimaju parametre i vraćaju vrijednosti. Za vraćanje vrijednosti iz funkcije koristimo ugrađenu ljusku za povratak. Sintaksa je sljedeća.

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

Slično možemo proslijediti argumente funkcijama odvojenim razmacima kao što je dato u nastavku.

func_name $arg_1 $arg_2 $arg_3

Unutar funkcije možemo pristupiti argumentima redoslijedom kao $1, $2, $3 i tako dalje. Pogledajte sljedeći primjer skripte da biste pronašli najviše dva cijela broja koristeći funkciju da biste dodali više jasnoće.

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

Gore navedeno izgleda kao malo složeno, ali je jednostavno ako čitamo kroz redove. Prvo su ugniježđene if-else linije u svrhu provjere valjanosti, tj. za provjeru broja i tipa argumenata uz pomoć regularnih izraza. Nakon toga pozivamo funkciju sa dva argumenta komandne linije i tamo prikazujemo rezultat. To je zato što ne možemo vratiti velike cijele brojeve iz funkcije. Drugi način da se zaobiđe ovaj problem je korištenje globalnih varijabli za pohranjivanje rezultata unutar funkcije. Skripta ispod objašnjava ovu metodu.

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

Sada isprobajte neke uzbudljive probleme koji su objašnjeni u prethodnoj seriji shell skriptova koristeći funkcije kako slijedi.

  1. Razumjeti osnovne savjete za jezik skriptiranja za Linux Shell – I dio
  2. 5 Shell skripti za Linux početnike da nauče Shell programiranje – II dio
  3. Plovidba kroz svijet Linux BASH skriptiranja – III dio
  4. Matematički aspekt Linux shell programiranja – IV dio
  5. Izračunavanje matematičkih izraza u jeziku shell skriptiranja – dio V

Vratit ću se s više uvida u funkcionalne karakteristike poput korištenja lokalnih varijabli, rekurzije itd. u sljedećem dijelu. Budite u toku sa komentarima.