A Bash programozási nyelv

Alprogramok

Eljárások, függvények

A Bash világában az eljárások és függvények kissé idegen módon viselkednek. Jobban meggondolva az eljárások még annyira nem is, de a függvények eltérőek a „megszokottól”.
Mindkét esetben a definíció hasonló:

function függvénynév() { függvénytörzs }

vagy csak simán

függvénynév() { függvénytörzs }

Ez igaz akkor is, ha eljárást írunk, és akkor is, ha függvényt. Az eljárás az egyszerűbb eset, mert akkor akkor csak annyit írunk a főprogramban, hogy eljárásnév és meghívódik az eljárás. Pl.

hello() { echo Hello! } echo program hello #Hello!

Ha paramétereket is kezelni szeretnénk az alprogramokban, akkor ugyanúgy át lehet adni, mint a parancssori paramétereket ($1, $2, …). Ezt úgy lehet megtenni, hogy az eljárás törzsén belül adom meg ezeket.

hello() { nev=$1 echo „Hello $nev!” } hello Zsolt # Hello Zsolt! /a hello az eljárásnév, a Zsolt a paraméter

A nehezebb helyzet ott kezdődik, ha ténylegesen függvényeket akarunk kezelni, esetleg visszatérési értékekkel. Ez sem olyan bonyolult, de trükközni kell vele.
Ha számot szeretnék visszaadni, akkor a return kifejezéssel játszhatok, amely esetben a függvény lefutása után a $?-ben megtalálható a visszakapott érték. Ez viszont csak 0-255 között lehetséges.
Másik lehetőség, hogy a függvényen belüli echo-t átirányítjuk egy változóba, így nem fog kiírni semmit a kimenetre, hanem egy változónak adjuk át, és ennek a tartalmát íratjuk ki. Pl.

function fakt() { f=1 for i in `seq 4` do f=$((f*i)) done echo $f } result=$(fakt) echo $result

Harmadik esetben viszont, ha paramétert is akarunk átadni a függvénynek, akkor érdemes parancs kiértékelésként használni. Pl.

fakt() { f=1 n=$1 for i in `seq $n` do f=$((f*i)) done echo $f } result=`fakt 10` # fakt meghívása a 10 paraméterrel echo $result

Utolsó esetben pedig, ha nem konstans értéket adok paraméternek, hanem változót, akkor azt ugyanúgy (parancs kiértékelésként) kell használni, csak a meghívás fog változni. Pl.

function multiple() { a=$1 b=$2 result=$((a*b)) echo $result } f=`multiple ${x} ${y}` #változó kiértékelés

Egy buktatóra fel kell hívni a figyelmet: alprogramon belül, ha echo-t akarunk használni, akkor önmagában a parancs megfogja a folyamatot, és a felhasználó nem tudja, miért üres sorban villogó kurzorral. Ezt megakadályozandó, az echo parancsot át kell irányítani a standard outputra. Pl. echo "A megadott adat nem fajl!" >&2 (a &2 a standard output).