A Shell Scripts függvényeinek megértése és írása – VI. rész
A függvények fontos szerepet játszanak minden programozási nyelvben. Sok valódi programozási nyelvhez hasonlóan a bash is rendelkezik olyan funkciókkal, amelyeket korlátozott megvalósítással használnak.
Mik azok a függvények?
A programozásban a függvények a program egy adott feladatot végrehajtó szakaszai. Ebben az értelemben a függvény egyfajta eljárás vagy rutin. Amikor egy függvényt hívunk, a program elhagyja az aktuális kódrészt, és elkezdi végrehajtani a függvényen belüli első sort. Ha ismétlődő kód van, vagy egy feladat ismétlődik, fontolja meg egy függvény használatát.
Vegyük például azt az esetet, amikor meg kell találnunk egy szám faktoriálisát egy adott program több szakaszában. Ahelyett, hogy minden alkalommal megírnánk a teljes kódot (a faktoriális kiszámításához), megírhatjuk a kódnak azt a részét, amely egy blokkon belül egyszer kiszámítja a faktoriálist, és többször is felhasználhatja.
Miért írunk függvényeket?
- Segít a kód újrafelhasználásában.
- A program olvashatóságának javítása.
- Változók hatékony felhasználása a programon belül.
- Lehetővé teszi a program részenkénti tesztelését.
- A programot egy csomó allépésként jeleníti meg.
Funkciók shell szkriptekben
A függvények shell szkriptben történő írásának általános szintaxisa a következő módokat tartalmazza.
function func_name {
. . .
commands
. . .
}
or
func_name ( ) {
. . .
commands
. . .
}
Opening curly braces can also be used in the second line as well.
func_name ( )
{
. . .
commands
. . .
}
Mindig szabadon írhat érvényes parancsokat ezekbe a funkcióblokkba, ahogy azt általában a shell szkriptekben tesszük. Most próbáljunk meg írni egy egyszerű szkriptet egy kis funkcióval.
#!/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
A függvénydefiníciónak meg kell előznie az első hívást. Semmi sem olyan, mint a függvény „deklarálása” hívás előtt. És mindig beágyazhatunk függvényeket a függvényekbe.
Megjegyzés: Az üres függvények írása mindig szintaktikai hibákat okoz.
Ha ugyanazt a függvényt többször definiáljuk, akkor a végső verziót hívjuk meg. Vegyünk egy példát.
#!/bin/bash
func_same ( ) {
echo ‘First definition’
}
func_same ( ) {
echo ‘Second definition’
}
func_same
exit 0
Paramétereket felvevő és értékeket visszaadó függvények
Menjünk mélyebbre, ha figyelembe vesszük a paramétereket felvevő és az értékeket visszaadó függvényeket. Ahhoz, hogy egy függvényből értéket adjunk vissza, a beépített „return” parancsértelmezőt használjuk. A szintaxis a következő.
func_name ( ) {
. . .
commands
. . .
return $ret_val
}
Hasonlóképpen adhatunk át argumentumokat a szóközökkel elválasztott függvényeknek az alábbiak szerint.
func_name $arg_1 $arg_2 $arg_3
A függvényen belül elérhetjük az argumentumokat $1, $2, $3 és így tovább. Tekintse meg a következő példaszkriptet, hogy megkeresse a maximum két egész számot a függvény használatával az egyértelműség növelése érdekében.
#!/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
A fenti kissé bonyolultnak tűnik, de egyszerű, ha végigolvassuk a sorokat. Először beágyazott if-else if sorok érvényesítési célból, azaz az argumentumok számának és típusának ellenőrzéséhez reguláris kifejezések segítségével. Ezután két parancssori argumentummal meghívjuk a függvényt, és ott megjeleníti az eredményt. Ennek az az oka, hogy egy függvényből nem tudunk nagy egész számokat visszaadni. A probléma megkerülésének másik módja a globális változók használata az eredmény függvényen belüli tárolására. Az alábbi szkript elmagyarázza ezt a módszert.
#!/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
Most próbáljon ki néhány izgalmas problémát, amelyeket az előző shell script-sorozatban magyaráztunk el a következő függvények használatával.
- Alapvető Linux Shell Scripting nyelvi tippek – I. rész
- 5 Shell Script Linux kezdőknek a Shell programozás elsajátításához – II. rész
- Áthajózás a Linux BASH Scripting világán – III. rész
- A Linux Shell programozás matematikai vonatkozása – IV. rész
- Matematikai kifejezések kiszámítása Shell Scripting nyelven – V. rész
A következő részben visszatérek a funkcionális funkciókhoz, például a helyi változók használatához, a rekurzióhoz stb. Legyen naprakész a megjegyzésekkel.