Vezérlési szerkezetek

A C shell beépített vezérlési szerkezetei teszik lehetővé, hogy shell-programokat futtatva (illetve korlátozott mértékben a parancssorból végrehajtva is) a megfelelő feltételek teljesülésekor eltérő parancságak hajtódjanak végre, vagy ciklikusan ismétlődjön egyes kódrészletek végrehajtása. A C shell által biztosított vezérlési szerkezetek funkcionálisan igen hasonlóak a Bourne (és a Korn) shell megfelelő mechanizmusaihoz, az első látásra szembetűnő különbség a szintaxisban mutatkozik: a C shell vezérlési szerkezetei lehetőség szerint a C nyelv megfelelő parancsainak megadási módját követik.

if-then-endif

Ez a szerkezet a feltételes elágazások kialakítására jó. Szintaxisa a következő:

 

if (expr1) then

cmdlist1

else if (expr2) then

cmdlist2

else

cmdlist3

endif

A fenti leírásban expr1 tetszőleges kifejezés lehet (beleértve parancsok visszatérési értékének kielemzését is), a cmdlistn megadás pedig tetszőleges számú parancsból álló sorozatokat jelöl. Ha expr1 igaz, az első else ágig terjedő programrészt (cmdlist1) hajtja végre a shell; máskülönben, ha expr2 igaz, akkor a cmdlist2 parancslistát, egyébként pedig a cmdlist3 parancsait. Mind az else if, mind az else ágak opcionálisak, else if pedig tetszőleges számban szerepelhet. A legtöbb csh implementációnál vigyázni kell arra, hogy az if ... then, illetve az else if, else és endif szintaktikai elemek külön sorban szerepeljenek, a köztük lévő programrészekkel ne keveredjenek.

A fenti parancs leegyszerűsített változata az

 

if (expr) cmd

megadási mód, ahol egyetlen parancs, cmd hajtódik végre expr igaz volta esetén (sem pipe, sem parancssorozat, sem zárójelezett parancsok nem megengedettek ez esetben, s az egész parancsnak egy sorban kell szerepelnie).

switch

A switch vezérlési szerkezet a többirányú elágaztatás céljait szolgálja. Szintaxisa a következő:

 

switch (word)

case pattern1)

        cmdlist1

        ...

        breaksw

...

case patternm)

        cmdlistm

        ...

        breaksw

default:

        cmdlistn

        ...

        breaksw

endsw

A switch szerkezet végrehajtásakor a shell sorra összehasonlítja a word argumentumot a case sorokban szereplő pattern mintákkal, s amelyikre illeszkedik, az ahhoz tartozó cmdlist parancsot vagy parancssorozatot végrehajtja. A word szócskán parancs- és változó-behelyettesítést végez a shell, a pattern mintákon fájlnév- és változó-behelyettesítéseket, ezért megadhatunk a mintában *, ? és [..] metakaraktereket is. Ha egyik minta se illeszkedik a word argumentumra, a default: ághoz tartozó parancs(ok) hajtódnak végre.

Ha az egyes ágak végén a breaksw kulcsszó szerepel, akkor a vezérlés a teljes switch szerkezetet lezáró endsw kulcsszó utánra kerül, ellenkező esetben a soronkövetkező mintára adódik át. Formai megkötés, hogy a case és a default utasítások a sor elején kell hogy kezdődjenek.

foreach

E parancs ciklusszervezésre alkalmas, szintaxisa az alábbi:

 

foreach var (wordlist)

...

end

A parancs működése, a formai eltérésektől eltekintve azonos a Bourne shell for parancsával: a var változó értéke sorra felveszi a wordlist többelemű lista egyes elemeinek értékét, és a lezáró end kulcsszóig terjedő részt ezzel az értékkel hajtja végre. Az előzőekhez hasonlóan, a foreach és az end elemeknek külön sorban kell szerepelniük.

Ha a ciklustörzsön belül arra van szükség, hogy idő előtt lépjünk ki, a break utasítással tehetjük meg, mely az őt tartalmazó legbelső ciklusból léptet ki. A kilépés után a break parancsot tartalmazó sor többi részét hajtja végre a shell, így lehetőség van arra, hogy több break kulcsszó egymás után írásával egymásba ágyazott ciklusokból lépjünk ki.

Ha nem a ciklusból való kilépésre, hanem a következő ciklus idő előtti kezdésére van szükség, azt a continue paranccsal érhetjük el. Ennek hatására az őt körülvevő legbelső ciklusfej újra kiértékelődik, és az új értékkel folytatódik a végrehajtás.

E vezérlési szerkezet a parancssorból is kiadható, ilyenkor a for ... sor után az újsor karakter begépelésekor kérdőjel jelenik meg (másodlagos prompt), jelezvén, hogy a shell további bevitelre vár.

while

Szintén ciklusszervező utasítás, az alábbi szintaxissal:

 

while (expr)

...

end

Mindaddig, amíg az expr kifejezés kiértékelésekor igaz logikai értéket kapunk, az end kulcsszóig terjedő ciklustörzs végrehajtódik. A foreach parancshoz hasonlóan használható itt is a break és a continue parancs a ciklus idő előtti megszakítására, illetve továbbléptetésére. A while és az end elemeknek itt is külön sorban kell szerepelniük. E vezérlési szerkezet is használható interaktív módon, a parancssorból.

goto

A goto label parancs használható feltétel nélküli elágazások megvalósítására. Hatására a vezérlés a label: mintát tartalmazó sor utáni sorra kerül.

 

Tartalomjegyzék