ye kavychki. Primer: pust' imeetsya komandnyj fajl f.csh: # !/bin/csh set a = 1 b = '`echo $v`' c = 3 echo a = $a b = $b c = $c set v = 100 @ b++ echo b = $b @ d = ( $a + $b + $c ) echo d = $d Pervaya stroka nachinaetsya simvolom # - tak v C-shell- programme oboznachaetsya stroka-kommentarij. Zapis' !/bin/csh ukazyvaet, chto komandnyj fajl dolzhen vypolnyat'sya interpreta- torom csh. V rezul'tate vypolneniya poluchim: % f.csh a = 1 b = `echo $v` c = 3 b = 101 d = 105 Zdes' peremennym a, b, c i v prisvaivayutsya razlichnye znache- niya, kotorye zatem ispol'zuyutsya v vychisleniyah v strokah, - 21 - pomechennyh simvolom @. Vse dejstviya soprovozhdayutsya vyvodom znachenij peremennyh. V stroke set b = '`echo $v`' peremen- noj b prisvaivaetsya stroka simvolov. Odinochnye pravye kavychki zapreshchayut podstanovku komande set i pri vyvode zna- cheniya b imeem: b = `echo $v`. V stroke @ b++ vypolnyaetsya komanda `echo $v` (eto znachenie peremennoj b k etomu momentu), posle chego znachenie peremennoj b uvelichivaetsya na 1. Velichina b ravna teper' 101 i ispol'zuetsya dalee. Pri vypolnenii podstanovok osobuyu rol' vypolnyayut figur- nye skobki. Dopustim, imeetsya neobhodimost' osushchestvit' konkatenaciyu znacheniya peremennoj s nekotoroj posledovatel'- nost'yu simvolov. Togda, ispol'zuya figurnye skobki, poluchim: % set a = 'Oper' % echo ${a}cionnaya sistema Operacionnaya sistema % echo ${a}ciya Operaciya % echo Issledovanie ${a}acij Issledovanie Operacij Nizhe perechisleny vse formy podstanovok v razlichnyh rezhimah: $peremennaya ili ${peremennaya} podstavlyaetsya znachenie peremennoj; {} vydelyayut peremen- nuyu ot drugih simvolov, idushchih sledom bez razdelitelya; $peremennaya[nomer] ili ${peremennaya[nomer]} podstavlyaetsya slovo nomer iz massiva slov; $?peremennaya ili ${?peremennaya} podstavlyaetsya 1, esli peremennaya opredelena, inache 0; $$ podstavlyaetsya desyatichnyj nomer processa csh; $#peremennaya ili ${#peremennaya} podstavlyaetsya kolichestvo slov, hranyashchihsya v massive; $?0 ili ${?0} podstavlyaetsya 1, esli vhodnoj fajl opredelen, inache 0; $0 podstavlyaetsya imya fajla, kotoryj v dannyj moment vre- meni vypolnyaet interpretator; $chislo ili ${chislo} ekvivalentno $argv[chislo]; $* ekvivalentno $argv[*], t.e. eto stroka parametrov komandy, kotoroj byl zapushchen csh. - 22 - Nizhe privedeny primery razlichnyh variantov ispol'zova- niya podstanovok v komandnom fajle f.csh. Pokazany 23 raz- lichnyh sluchaya ispol'zovaniya podstanovok, kazhdyj sluchaj vyde- len strokoj kommentariev. Za simvolom # v kommentariyah uka- zany nomera variantov. CHtoby legche bylo orientirovat'sya v vyvode rezul'tatov, on organizovan takim obrazom, chto sna- chala vyvoditsya nomer varianta, potom rezul'tat ego vypolne- niya: - 23 - # !/bin/csh set m = ( w1 w2 w3 w4 w5 ) # 1 - 2 if( $?m ) then echo 1 $m else echo 2 0 endif # 3 - 4 if( ${?m} ) then echo 3 $m else echo 4 0 endif # 5 - 6 if( $?0 ) then echo 5 1 else echo 6 0 endif # 7 - 8 if( ${?0} ) then echo 7 1 else echo 8 0 endif # 9 echo 9 $$ @ p = ( $$ + 10 ) # 10 echo 10 $p date >&gt; ofile$$ # 11 echo "11 `ls ofile$$`" cat ofile$$ set p = 2 @ p++ # 12 - 17 echo 12 p = $p echo 13 ${p}aaa echo 14 $m[1] echo 15 $m[5] echo 16 $m[2-4] echo 17 ${m[3]}aaa # 18 - 23 set p = $#m echo 18 $p echo 19 ${#m}aaa echo 20 $0 echo 21 $3 echo 22 ${3}ddd echo 23 $* - 24 - Zapustim na vypolnenie etot komandnyj fajl so sleduyushchim spiskom argumentov: 11 22 33 44 55 66. Posle vypolneniya poluchim: % f.csh 11 22 33 44 55 66 1 w1 w2 w3 w4 w5 3 w1 w2 w3 w4 w5 5 1 7 1 9 525 10 535 11 ofile525 Vos Iyul 10 22:57:20 MSK 1988 12 p = 3 13 3aaa 14 w1 15 w5 16 w2 w3 w4 17 w3aaa 18 5 19 5aaa 20 f.csh 21 33 22 33ddd 23 11 22 33 44 55 66 Rezul'taty vseh variantov, krome 11, legko ob®yasnimy. Zdes' nomer processa ispol'zuetsya dlya sozdaniya fajla s unikal'nym imenem. |tot priem chasto ispol'zuyut, kogda neobhodimo polu- chit' takoj fajl. Varianty 20 - 23 demonstriruyut ispol'zova- nie peremennoj argv. |ta peremennaya poluchaet svoe znachenie iz komandnoj stroki f.csh 11 22 33 44 55 66, kotoruyu my vveli pri zapuske komandnogo fajla. Konstrukciya $<&lt; ispol'zuetsya dlya chteniya stroki s klavia- tury displeya. Esli v spiske peremennyh ukazana konstrukciya $<&lt;, to interpretator zhdet vvoda s klaviatury displeya i zame- nyaet $<&lt; na napechatannuyu stroku - 25 - % set cveta = $<&lt; krasnyj sinij zelenyj % echo $cveta krasnyj sinij zelenyj % @ aaa = 1 + $<&lt; + 3 2 % echo $aaa 6 % echo $<&lt; krasnyj sinij zelenyj krasnyj sinij zelenyj % set cveta = ( krasnyj sinij zelenyj $<&lt; seryj ) belyj % echo cveta: $cveta cveta: krasnyj sinij zelenyj belyj seryj % echo $cveta[4] belyj % set cveta[4] = $<&lt; goluboj % echo $cveta[4] goluboj V nekotoryh versiyah interpretatora csh konstrukciya $<&lt; ne ispol'zuetsya. V etom sluchae mozhno vospol'zovat'sya komandoj sistemy rline, naprimer: % set a = `rline` DEMOS % echo $a DEMOS 1.7. Modifikatory peremennyh CHasto byvaet neobhodimo izmenit' znachenie peremennoj i ispol'zovat' v podstanovke izmenennoe znachenie. Dlya izmene- niya znachenij peremennyh ispol'zuyutsya tak nazyvaemye modifi- katory, kotorye prednaznacheny v osnovnom dlya manipulyacij imenami fajlov i katalogov. Kak pravilo, modifikatory zapi- syvayutsya v vide modificiruemoe_slovo:modifikator Nizhe perechisleny vse formy ispol'zovaniya modifikatorov: h udalit' imya fajla, sohraniv komponenty puti (to est' udalit' v slove tekst sprava do blizhajshego simvola /); gh primenit' modifikator h global'no, ko vsem slovam; r udalit' rasshirenie imeni fajla, ukazannoe cherez tochku, i samu tochku; - 26 - gr vypolnit' modifikator r global'no, ko vsem slovam; e udalit' imya fajla vmeste s tochkoj, sohraniv rasshirenie imeni; ge vypolnit' modifikator e global'no, ko vsem slovam; t sohranit' imya fajla, udaliv komponenty puti (to est' udalit' tekst sleva ot samogo pravogo simvola / i sam etot simvol); gt primenit' modifikator t global'no, ko vsem slovam; q zapretit' dal'nejshuyu modifikaciyu slova. Slovo zaklyucha- etsya v kavychki; x razbit' na slova po razdelitelyam i zapretit' dal'nejshuyu modifikaciyu. Rezul'tat zaklyuchaetsya v kavychki. Bessmyslenno primenyat' modifikatory k sleduyushchim sintak- sicheskim formam podstanovok: $?peremennaya ${?peremennaya} $?0 $$ V kazhdoj podstanovke mozhno ispol'zovat' tol'ko odin modifikator. Pered modifikatorom dolzhen stoyat' simvol dvoe- tochie. Esli v podstanovke ispol'zuyutsya simvoly {}, modifi- kator dolzhen nahodit'sya vnutri figurnyh skobok. V komandnom fajle f.csh pokazany primery ispol'zovaniya modifikatorov: - 27 - #!/bin/csh set a = /usr/bin/pr1 set b = /dir1/dir11/dir111/file.c set c = (/d/d1/d2/f.c /d/d1/c.c /d5/f.s ) # Variant 1 echo 'Variant 1' echo $a:h echo $b:h echo $c[1]:h echo ${c[2]:h} echo $c[3]:h # Variant 2 echo 'Variant 2' echo $a:t echo $b:t echo $c[1]:t echo ${c[2]:t} echo $c[3]:t # Variant 3 echo 'Variant 3' echo $a:r echo $a:e echo $b:r echo $b:e echo $c[1]:r echo $c[1]:e echo ${c[2]:r} echo ${c[2]:e} echo $c[3]:r echo $c[3]:e # Variant 4 echo 'Variant 4' echo $c:gh echo $c:gt echo $c:gr # Variant 5 echo 'Variant 5' set m = "$c:x" echo $m echo $m[1]:t echo $m[1]:r # Variant 6 echo 'Variant 6' set m = "$c:q" echo $m echo $m[1]:h echo $m[1]:r - 28 - Posle vypolneniya komandnogo fajla poluchim: % f.csh Variant 1 /usr/bin /dir1/dir11/dir111 /d/d1/d2 /d/d1 /d5 Variant 2 pr1 file.c f.c c.c f.s Variant 3 /usr/bin/pr1 pustaya stroka net rasshireniya imeni u fajla pr1 /dir1/dir11/dir111/file c /d/d1/d2/f c /d/d1/c c /d5/f s Variant 4 /d/d1/d2 /d/d1 /d5 f.c c.c f.s /d/d1/d2/f /d/d1/c /d5/f Variant 5 /d/d1/d2/f.c /d/d1/c.c /d5/f.s f.s /d/d1/d2/f.c /d/d1/c.c /d5/f Variant 6 /d/d1/d2/f.c /d/d1/c.c /d5/f.s /d/d1/d2/f.c /d/d1/c.c /d5 /d/d1/d2/f.c /d/d1/c.c /d5/f Vyvod rezul'tatov organizovan takim obrazom, chtoby mozhno bylo otlichit' dejstviya kazhdogo varianta ispol'zovaniya modifikatorov. Varianty 5 i 6 demonstriruyut dejstviya modi- fikatorov x i q . Peremennaya c soderzhit spisok slov. |tot spisok prisvaivaetsya peremennoj m i k nemu poocheredno prime- nyayutsya modifikatory x i q. Iz primera vidno, chto etot spi- sok prevrashchaetsya v odno slovo, i modifikatory h, t i r rabo- tayut s etim spiskom kak s odnim slovom. - 29 - 1.8. Vyrazheniya Simvol @ v nachale stroki oznachaet, chto vse ukazannye dalee slova obrazuyut vyrazhenie, naprimer: % set a = 5 b = 7 % @ c = ( $a + $b ) % echo $c 12 V yazyke C-shell chislom schitaetsya lyubaya simvol'naya stroka, kotoraya mozhet interpretirovat'sya kak celoe desyatich- noe chislo. Esli v vyrazhenii primenyaetsya stroka, kotoraya ne mozhet interpretirovat'sya kak chislo, porozhdaetsya sostoyanie oshibki. V kachestve logicheskih znachenij ispol'zuyutsya chisla (0 - lozh' i 1 - istina). Kak istina vosprinimaetsya lyuboe chislo, otlichnoe ot nulya. Vyrazheniya i operacii v C-shell v osnovnom analogichny operaciyam v yazyke Si. Vyrazheniya mozhno ispol'zovat' takzhe v operatorah if_then_else, while, exit. V vyrazhenie v kachestve prostogo operanda mozhno vklyuchat' komandu sistemy, vzyatuyu v figurnye skobki. V processe vychis- lenij eta komanda budet vypolnena, i rezul'tat budet pods- tavlen v vyrazhenie. V vyrazheniyah ispol'zuyutsya sleduyushchie operacii: operacii sravneniya strok == ili =~ ravno? != ili !~ ne ravno? V kachestve operandov v etih operaciyah primenyayutsya stroki. V formah s simvolom ~ razreshaetsya ispol'zovat' v pravoj chasti shablony *, ? i [...]. |ta forma sravne- niya strok sokrashchaet kolichestvo konstrukcij switch v komandnyh fajlah. operacii nad chislami - 30 - operand_celoe_chislo: (dva operanda): || ili && i <&lt;= men'she ili ravno? >&gt;= bol'she ili ravno? >&gt; bol'she? <&lt; men'she? + slozhit' - vychest' * umnozhit' / delit' % ostatok deleniya (odin operand): ++ inkrement, (postfiksnaya) -- dekrement, (postfiksnaya) porazryadnye_logicheskie: & umnozhenie | slozhenie ^ isklyuchayushchee ili ~ dopolnenie (unarnaya) ! otricanie (unarnaya) >&gt;>&gt; sdvig vpravo <&lt;<&lt; sdvig vlevo operacii oprosa svojstv fajla: oni zapisyvayutsya v vide -kod imya_fajla, gde kod - odna iz sleduyushchih bukv, oboznachayushchih operaciyu: r (mozhno li chitat'?) w (mozhno li pisat'?) x (mozhno li vypolnyat'?) e (fajl sushchestvuet?) o (vypolnyayushchij vladelec fajla?) z (razmer fajla = 0 ?) f (fajl zashifrovan?) d (fajl - eto katalog?) Esli fajl obladaet trebuemym svojstvom, to vozvrashchaetsya znachenie istina, inache lozh'. Stroka s vyrazheniem mozhet imet' sleduyushchie formaty: simvol @ raspechatat' znacheniya vseh peremennyh; @ imya operaciya_prisvaivaniya vyrazhenie prisvoenie peremennoj imya znacheniya vyrazheniya; - 31 - @ imya[celoe] operaciya_prisvaivaniya vyrazhenie prisvoenie znacheniya vyrazheniya elementu massiva. Operacii prisvaivaniya analogichny podobnym operaciyam yazyka Si: = += -= *= /= %= Poryadok vypolneniya operacij opredelyaetsya libo po umolchaniyu, s uchetom starshinstva, libo yavnym ukazaniem kruglyh skobok. V pokazannom nizhe ryadu operacij starshinstvo operacij rastet sleva napravo: ||, &&, | , ^ , & , ==, !=, <&lt;=, >&gt;=, <&lt; , >&gt; , <&lt;<&lt;, >&gt;>&gt;, + , - , * , / , % , ! , ~ , ( ) Vnutri ukazannyh nizhe grupp operacii imeyut odinakovyj prio- ritet: [ =~, !~, ==, != ] [ <&lt;, >&gt;, <&lt;=, >&gt;= ] [ <&lt;<&lt;, >&gt;>&gt; ] [ +, - ] [ *, /, % ] Vse znaki operacij i znak prisvaivaniya dolzhny otde- lyat'sya ot operandov probelami. CHasti vyrazhenij, soderzhashchie znaki operacij, neobhodimo brat' v kruglye skobki. Pered kruglymi skobkami i za nimi dolzhen idti probel. Kolichestvo probelov, znakov tabulyacii ne ogranichivaetsya, eti simvoly yavlyayutsya tol'ko razdelitelyami. Nizhe priveden primer komandnogo fajla, soderzhashchego stroki s vyrazheniyami: - 32 - # !/bin/csh # variant 1 set a = 5 @ a++ echo $a # rezul'tat: 6 # variant 2 @ a = 7 echo $a # rezul'tat: 7 # variant 3 set a = 10 b = 15 @ c = ( $a + $b ) echo $c # rezul'tat: 25 # variant 4 @ c += 5 echo $c # rezul'tat: 30 # variant 5 @ c = ( $c * 5 ) echo $c # rezul'tat: 150 # variant 6 @ c *= 5 echo $c # rezul'tat: 750 # variant 7 @ c *= $c echo $c # rezul'tat: -27324 # variant 8 set a = 5 b = 7 c = 9 @ a = ( $a << 2 ) @ b = ( $b >> 2 ) @ c = ( $c + $a + $b ) echo $a $b $c # rezul'tat: 20 1 30 # variant 9 set a = 5 b = 3 @ c = ( $a | $b ) echo $c # rezul'tat: 7 # variant 10 - 33 - set a = 5 b = 3 c = 2 @ d = ( ( $a + $b ) + ( $a + $b + $c ) ) echo $d # rezul'tat: 18 # variant 11 set a = 5 if( "$a" == "5" ) echo 'Stroki identichny' if( "$a" != "5" ) echo 'Stroki razlichny ' # rezul'tat: Stroki identichny # variant 12 date >&gt; file chmod 755 file if( -x file ) echo 'Vypolnyaemyj' # rezul'tat: Vypolnyaemyj Varianty 1 - 6 samoob®yasnimy. V variante 7 poluchilos' otri- catel'noe chislo, tak kak C-shell operiruet peremennymi tipa integer (dva bajta na 16-razryadnoj |VM). V vyrazheniyah mozhno ispol'zovat' operacii zaprosa svojstv fajla: % set c = 0 % @ c = -x a.out + 100 % echo $c 101 % @ c = 100 - -x a.out % echo $c 99 Mozhno ukazat' v figurnyh skobkah prostuyu komandu. V kachestve znacheniya budet ispol'zovan kod vozvrata vypolnennoj komandy % @ c = 100 - { date } sre fev 3 14:48:37 MSK 1988 % echo $c 99 % @ c = { date rrrjjj } - 100 Data: plohoj format % echo $c -100 Imeyutsya poleznye razlichiya v operaciyah sravneniya strok: - 34 - == != ili =~ !~ V pervom sluchae v pravyh chastyah sravneniya ne interpretiru- yutsya shablony ? . * [...] vo vtorom - interpretiruyutsya. Pust' v rabochem kataloge ime- yutsya fajly i katalogi, togda % set c = "*" % if( "$c" == "*" ) _____ ili % if( "$c" =~ "*" ) _____ V pervom sluchae vyrazhenie vsegda lozhno - levaya stroka zame- nyaetsya spiskom imen fajlov i katalogov, a pravaya ostaetsya bez izmenenij (simvol *). Vo vtorom sluchae stroki vsegda identichny - oni odinakovo interpretiruyutsya. 1.9. Operatory yazyka C-shell YAzyk C-shell vklyuchaet sleduyushchie operatory: foreach, switch, while, if_then_else, goto, continue, break, shift, exit. Operatory mozhno ispol'zovat' v interaktivnom rezhime raboty interpretatora csh i v komandnom fajle. Principial'- nyh razlichij vypolneniya operatorov v interaktivnom rezhime i v komandnom fajle net. Rassmotrim rabotu operatorov v inte- raktivnom rezhime. V processe vvoda operatora interpretator priglashaet simvolom ? prodolzhat' nabor, poka ne vstretit klyuchevoe slovo, oznachayushchee konec vvoda. Vvedennyj tekst mozhno rassmatrivat' kak vremennyj komandnyj fajl, kotoryj interpretiruetsya i posle vypolneniya unichtozhaetsya. Odno iz klyuchevyh slov foreach, switch, while, if_then_else ili goto dolzhno byt' pervym slovom v stroke. Operator cikla foreach foreach imya (spisok slov) ... end Peremennoj imya posledovatel'no prisvaivayutsya znacheniya kazhdogo chlena spiska slov i vypolnyaetsya posledovatel'- nost' komand tela cikla foreach. foreach i end dolzhny nahodit'sya v otdel'nyh strokah - 35 - % foreach i ( a b c d e f g h ) ? if( "$i" == "c" ) continue ? glob "$i " ? if( "$i" == "f" ) break ? end a b d e f % Peremennaya cikla i posledovatel'no prinimaet znacheniya iz spiska, ob®yavlennogo v predlozhenii foreach. Vnutri cikla stoyat dve proverki. Esli znachenie i ravno c, to perejti k sleduyushchemu shagu cikla, esli znachenie i ravno f, to prekratit' vypolnenie cikla. V pervom sluchae operator continue trebuet perehoda k novoj iteracii cikla, vo vtorom - operator break osushchestvlyaet vyhod za predely cikla, i ego dejstvie prekrashchaetsya. Komanda glob rabotaet analogichno komande echo, no posle vyvoda kursor ostaetsya v toj zhe stroke, a ne v nachale sleduyu- shchej. Operator vybora switch imeet vid: switch(vhodnaya_stroka) case obrazec: ... breaksw ... default: ... ... endsw Obrazcy variantov case posledovatel'no sravnivayutsya s ukazannoj v switch vhodnoj strokoj (v obrazcah mozhno ispol'zovat' shablony imen fajlov *, ? i [...]). Esli v variante case vyyavleno sovpadenie obrazca i vhodnoj stroki, vypolnyayutsya vse stroki do blizhajshego breaksw, default ili endsw. Esli sovpadenie ne obnaruzheno, vypolnenie prodolzhaetsya posle default. Esli default otsutstvuet, vypolnenie prodolzhaetsya posle endsw. Slova case i default dolzhny byt' pervymi v stroke. Vypolnenie operatora breaksw privodit k tomu, chto upravlenie peredaetsya na pervuyu stroku posle endsw - 36 - % set j = 0 % foreach i ( aaa bbb ccc ddd eee ) ? @ j++ ? switch( $i ) ? case "aaa": ? glob "$i " ? breaksw ? case "bbb": ? glob "$i " ? breaksw ? case "ccc": ? glob "$i " ? breaksw ? case "ddd": ? glob "$i " ? breaksw ? default: ? breaksw ? ? endsw ? glob "$j " ?end aaa 1 bbb 2 ccc 3 ddd 4 5 % Peremennoj cikla i prisvaivayutsya znacheniya iz spiska v predlozhenii foreach. Vnutri cikla rabotaet switch. Esli ni odno znachenie variantov case ne sovpadaet so znacheniem peremennoj i, to vypolnyaetsya variant default. V dannom sluchae eto privodit k vyhodu za predely perek- lyuchatelya switch, poetomu vyvoditsya poryadkovyj nomer iteracii cikla i foreach vypolnyaet sleduyushchuyu iteraciyu. V novoj iteracii cikla snova nachinaet dejstvovat' switch. Operator if if(vyr1) then ... else if(vyr2) then ... else ... endif Esli znachenie vyr1 istinno (otlichno ot nulya), vypolnya- yutsya komandy do pervogo else. Inache, esli znachenie vyr2 istinno, vypolnyayutsya komandy do vtorogo else i t.d. Vozmozhno lyuboe kolichestvo par else if, endif nuzhno tol'ko odno. CHast' else neobyazatel'na. Slova else i endif dolzhny byt' pervymi v strokah, gde oni ukazany. Operator if dolzhen nahodit'sya odin v stroke ili posle else - 37 - % foreach i ( a b c d e f ) ? if( "$i" == "a" ) then ? glob "a " ? else if( "$i" == "b" ) then ? glob "b " ? else if( "$i" == "c" ) then ? glob "c " ? endif ? end a b c % Na kazhdoj iteracii cikla foreach osushchestvlyaetsya pro- verka tekushchego znacheniya peremennoj cikla i s simvolami 'a', 'b' i vypolnyaetsya, to na ekran vyvoditsya soot- vetstvuyushchij simvol, inache osushchestvlyaetsya sleduyushchaya ite- raciya cikla. Operator cikla while while(vyrazhenie) ... end Cikl vypolnyaetsya, poka istinno znachenie vyrazheniya. Klyu- chevye slova while i end dolzhny nahodit'sya na otdel'nyh strokah. V cikle mozhno ispol'zovat' komandu break dlya vyhoda iz cikla i komandu continue dlya vozobnovleniya sleduyushchej iteracii cikla bez zaversheniya tekushchej (vse operatory cikla, sleduyushchie za komandoj continue, ne budut vypolnyat'sya) % set argv = ( 1 2 3 1 2 3 0 1 ) % while( $#argv > 0 ) ? if( "$argv[1]" == "3" ) then ? shift ? continue ? endif ? if( "$argv[1]" == "0" ) then ? break ? endif ? glob " $argv[1]" ? shift ? end 1 2 1 2 % Zdes' vypolnyaetsya cikl, v kotorom vyvodyatsya znacheniya argv. Esli znachenie argv[1] est' simvol "3", to ono ne vyvoditsya i idet perehod k sleduyushchej iteracii cikla, esli simvol "0", to dejstvie cikla prekrashchaetsya. Opera- tor shift osvobozhdaet (vytalkivaet) vershinu steka dlya sleduyushchego elementa. V dannom sluchae pod stekom ponima- etsya spisok slov massiva argv. Posle kazhdogo sdviga argv[1] priobretaet znachenie sleduyushchego slova. Cikl - 38 - while prekrashchaet rabotu, kogda spisok slov massiva argv stanet pustym, t.e. $#argv stanet ravnym nulyu. 1.10. Komandnye fajly Programmy, napisannye na yazyke C-shell, nazyvayut komandnymi fajlami. Kazhdaya stroka komandnogo fajla interp- retiruetsya csh, v nej osushchestvlyayutsya podstanovki, vychislya- yutsya, esli neobhodimo, vyrazheniya. Komandnyj fajl mozhet zapuskat' na vypolnenie drugie vypolnyaemye fajly, v tom chisle komandnye fajly, napisannye dlya interpretatorov csh i sh. Krome togo, v komandnom fajle dostupna dlya vypolneniya lyubaya komanda sistemy. Kazhdyj komandnyj fajl na yazyke C-shell dolzhen nachi- nat'sya simvolom # v pervoj pozicii pervoj stroki, dalee uka- zyvaetsya sistemnoe imya interpretatora. Dopuskayutsya pustye stroki. Stroka, nachinayushchayasya #, yavlyaetsya strokoj kommenta- riev. Pri sozdanii komandnyh fajlov, ispol'zuya peremennuyu argv, mozhno organizovat' vvod i obrabotku argumentov komand- noj stroki, kotorye mogut byt' kak imenami fajlov, tak i lyubymi posledovatel'nostyami simvolov. V kachestve primera rassmotrim programmu dialogovogo vvoda soderzhaniya dokumenta. Kommentarii v programme dostatochno polno raskryvayut algoritm raboty - 39 - #!/bin/csh # Programma v rezhime menyu zaprashivaet # svedeniya o zagruzke |VM. Rezul'tat # vvoda dopisyvaetsya v fajl Result. # Ispravlenie oshibok vvoda vypolnyaetsya # povtornym vvodom. Zapis' v fajl # proishodit po komande Zapomnit'. # Peremennaya out ispol'zuetsya dlya # ukazaniya napravleniya vyvoda. Kogda # out = /dev/tty vyvod dopisyvaetsya na # ekran displeya, kogda out = Result # vyvod dopisyvaetsya v fajl ./Result. set |VM NOM ORG POD set out = /dev/tty set mes = ( 0 0 0 0 0 0 0 0 0 0 0 0 ) set sum = ( 0 0 0 0 0 ) # Imena mesyacev dlya podtverzhdeniya # rezhima vvoda set imya = ( YAnvar' Fevral' Mart \ Aprel' Maj Iyun' \ Iyul' Avgust Sentyabr' \ Oktyabr' Noyabr' Dekabr' ) # Rabota programmy vypolnyaetsya v # beskonechnom cikle while(1) while ( 1 ) glob ' Ukazhite rezhim raboty > ' set otvet = $<&lt; switch( "$otvet" ) case '[KkKk]': exit( 0 ) case '[ZzZz]': set out = Result case '[DdDd]': # Vychislenie pokazatelej po kvartalam # i za god @ sum[1] = $mes[1] + $mes[2] + $mes[3] @ sum[2] = $mes[4] + $mes[5] + $mes[6] @ sum[3] = $mes[7] + $mes[8] + $mes[9] @ sum[4] = $mes[10] + $mes[11] + $mes[12] @ sum[5] = $sum[1] + $sum[2] + $sum[3] + $sum[4] # Ochishchat' ekran, esli vyvod ne v fajl - 40 - if( "$out" != "Result" ) clear # Komanda echo vyvodit v fajl out # znacheniya peremennyh echo " \ Otchet o zagruzke |VM.\ |VM $|VM \ Zavodskoj nomer $NOM \ Organizaciya $ORG \ Podrazdelenie $POD \ YAnvar' $mes[1] \ Fevral' $mes[2] \ Mart $mes[3] \ Pervyj kvartal $sum[1] \ Aprel' $mes[4] \ Maj $mes[5] \ Iyun' $mes[6] \ Vtoroj kvartal $sum[2] \ Iyul' $mes[7] \ Avgust $mes[8] \ Sentyabr' $mes[9] \ Tretij kvartal $sum[3] \ Oktyabr' $mes[10] \ Noyabr' $mes[11] \ Dekabr' $mes[12] \ CHetvertyj kvartal $sum[4] \ Itogo $sum[5] " >> $out continue case '[AaAa]': glob 'Tip |VM: ' set |VM = $<&lt; continue case '[BbBb]': glob 'Zavodskoj nomer |VM: ' set NOM = $<&lt; continue case '[VvWw]': glob 'Organizaciya: ' set ORG = $<&lt; continue case '[GgGg]': glob 'Podrazdelenie: ' set POD = $<&lt; continue case '[1-9]': case "1[012]": glob $imya[$otvet]': ' - 41 - set mes[$otvet] = $<&lt; continue default: # Vyvod menyu, esli rezhim ukazan nepravil'no. echo 'Takogo rezhima net.' clear echo ' \ \ \ \ \ \ Rezhimy raboty: \ \ a Vvod naimenovaniya |VM. \ b Vvod zavodskogo nomera |VM. \ v Vvod naimenovaniya organizacii. \ g Vvod naimenovaniya podrazdeleniya. \ d Vyvod dannyh na ekran. \ z Zapomnit'. \ k Konec raboty. \ Vyvod zagruzki v chasah po mesyacam: \ 1 YAnvar' 2 Fevral' 3 Mart \ 4 Aprel' 5 Maj 6 Iyun' \ 7 Iyul' 8 Avgust 9 Sentyabr' \ 10 Oktyabr' 11 Noyabr' 12 Dekabr' \ \ ' endsw end Nizhe pokazano soderzhimoe fajla Result, kotoryj formiruet programma. |ta zhe informaciya vyvoditsya na ekran, esli ukazan rezhim Vyvod dannyh - 42 - Otchet o zagruzke |VM. |VM SM 1420 Zavodskoj nomer 1673 Organizaciya Poliklinika 124 Podrazdelenie IVC YAnvar' 300 Fevral' 350 Mart 350 Pervyj kvartal 1000 Aprel' 520 Maj 330 Iyun' 700 Vtoroj kvartal 1550 Iyul' 200 Avgust 150 Sentyabr' 250 Tretij kvartal 600 Oktyabr' 300 Noyabr' 310 Dekabr' 280 CHetvertyj kvartal 890 Itogo 4040 CHasto voznikaet neobhodimost' prinyat' s klaviatury otvet v vide metasimvola, kotoryj ne dolzhen interpretiro- vat'sya. |togo mozhno dostignut' otmenoj special'nogo znache- niya simvola. V otdel'nyh sluchayah takaya otmena zatrudni- tel'na. Nizhe priveden primer programmy, v kotoroj so stan- dartnogo vvoda chitayutsya metasimvoly shablonov imen fajlov, no ih special'noe znachenie ignoriruetsya. - 43 - # !/bin/csh # programma demonstriruet sposob chteniya # so standartnogo vvoda simvolov ? i *, # kotorye obychno rassmatrivayutsya kak # shablony imen fajlov i interpretiruyutsya # while( 1 ) glob '=> ' set otvet = "$<&lt;" switch( "$otvet" ) case [?] : echo 'Voprositel'nyj znak' breaksw case [*] : echo 'Zvezdochka' breaksw case '{' : case '}' : echo 'Figurnaya skobka' breaksw default : echo 'Drugoj simvol' endsw end 1.11. Protokolirovanie, sredstva raboty s protokolom Interpretator zapisyvaet vo vremennyj fajl protokol raboty pol'zovatelya v vide spiska vypolnennyh komandnyh strok. Kolichestvo zapominaemyh komandnyh strok opredelyaetsya peremennoj history, kotoraya obychno opredelyaetsya v fajle ~/.cshrc (o nem budet skazano nizhe). Esli ustanovlena pre- dopredelennaya peremennaya savehist, to po zaversheniyu seansa raboty pol'zovatelya ukazannoe kolichestvo strok history budet sohraneno v fajle ~/.history. Pri sleduyushchem vhode v sistemu soderzhimoe etogo fajla ispol'zuetsya dlya zaneseniya v proto- kol. Naprimer, esli vypolnena komanda set savehist = 22 to poslednie 22 stroki protokola budut sohraneny v fajle ~/.history i vosstanovleny v nachale sleduyushchego seansa raboty. CHtoby napechatat' protokol, neobhodimo vypolnit' komandu history. Kazhd