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 >> 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 $<< ispol'zuetsya dlya chteniya stroki s klavia-
tury displeya. Esli v spiske peremennyh ukazana konstrukciya
$<<, to interpretator zhdet vvoda s klaviatury displeya i zame-
nyaet $<< na napechatannuyu stroku
- 25 -
% set cveta = $<<
krasnyj sinij zelenyj
% echo $cveta
krasnyj sinij zelenyj
% @ aaa = 1 + $<< + 3
2
% echo $aaa
6
% echo $<<
krasnyj sinij zelenyj
krasnyj sinij zelenyj
% set cveta = ( krasnyj sinij zelenyj $<< seryj )
belyj
% echo cveta: $cveta
cveta: krasnyj sinij zelenyj belyj seryj
% echo $cveta[4]
belyj
% set cveta[4] = $<<
goluboj
% echo $cveta[4]
goluboj
V nekotoryh versiyah interpretatora csh konstrukciya $<< 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
<<= men'she ili ravno?
>>= bol'she ili ravno?
>> bol'she?
<< men'she?
+ slozhit'
- vychest'
* umnozhit'
/ delit'
% ostatok deleniya
(odin operand):
++ inkrement,
(postfiksnaya)
-- dekrement,
(postfiksnaya)
porazryadnye_logicheskie:
& umnozhenie
| slozhenie
^ isklyuchayushchee ili
~ dopolnenie
(unarnaya)
! otricanie
(unarnaya)
>>>> sdvig vpravo
<<<< 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:
||, &&, | , ^ , & , ==, !=,
<<=, >>=, << , >> , <<<<, >>>>, + ,
- , * , / , % , ! , ~ , ( )
Vnutri ukazannyh nizhe grupp operacii imeyut odinakovyj prio-
ritet:
[ =~, !~, ==, != ]
[ <<, >>, <<=, >>= ]
[ <<<<, >>>> ]
[ +, - ]
[ *, /, % ]
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 >> 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 = $<<
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 = $<<
continue
case '[BbBb]':
glob 'Zavodskoj nomer |VM: '
set NOM = $<<
continue
case '[VvWw]':
glob 'Organizaciya: '
set ORG = $<<
continue
case '[GgGg]':
glob 'Podrazdelenie: '
set POD = $<<
continue
case '[1-9]':
case "1[012]":
glob $imya[$otvet]': '
- 41 -
set mes[$otvet] = $<<
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 = "$<<"
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