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?
- Pomaže nam da ponovo koristimo kod.
- Poboljšajte čitljivost programa.
- Efikasna upotreba varijabli unutar programa.
- Omogućava nam da testiramo program dio po dio.
- 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.
- Razumjeti osnovne savjete za jezik skriptiranja za Linux Shell – I dio
- 5 Shell skripti za Linux početnike da nauče Shell programiranje – II dio
- Plovidba kroz svijet Linux BASH skriptiranja – III dio
- Matematički aspekt Linux shell programiranja – IV dio
- 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.