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.
Ez a szerkezet a feltételes elágazások kialakítására jó. Szintaxisa a következő:
if
(expr1) thencmdlist1
else if
(expr2) thencmdlist2
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) cmdmegadá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).
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.
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.
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.
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.