Uit Ce Lab Hdh-lab2_final

64
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN KHOA KỸ THUẬT MÁY TÍNH TÀI LIỆU: HƯỚNG DẪN THỰC HÀNH HỆ ĐIỀU HÀNH Nhóm biên soạn: - ThS. Phan Đình Duy - ThS. Phạm Văn Phước

description

hd Thuc hanh

Transcript of Uit Ce Lab Hdh-lab2_final

Verilog Hardware Description Language

TRNG I HC CNG NGH THNG TINKHOA K THUT MY TNH

TI LIU:

HNG DN THC HNHH IU HNH

Nhm bin son: - ThS. Phan nh Duy- ThS. Phm Vn Phc- ThS. Nguyn Vit Quc- KS. Nguyn Hu Nhn - KS. L Vn La - KS. Trn Vn Quang

Thng 2 nm 2015MC LC

Chng 1.Lp Trnh Trong Mi Trng Shell41. Shell ca Unix/Linux42. S Dng SHELL Nh Ngn Ng Lp Trnh42.1. iu khin shell t dng lnh42.2 iu khin shell bng tp tin kch bn (script file)52.3. Thc thi script73. C Php Ngn Ng SHELL93.1. S dng bin93.1.1.. Cc k t c bit (Metalcharacters ca Shell)113.1.2. Bin mi trng (environment variable183.1.3. Bin tham s (parameter variable193.2. iu kin213.2.1. Lnh test hoc [ ]223.3 Cu trc iu khin253.3.1. Lnh if253.3.2 Lnh elif273.3.3. Vn pht sinh vi cc bi283.3.4. Lnh for293.3.5 Lnh while313.3.6 Lnh until333.3.7 Lnh case344. Bi Tp38

Lp Trnh Trong Mi Trng Shell1. Shell ca Unix/LinuxShell l chng trnh giao tip vi ngi dung, chp nhn cc ch dn hoc cc lnh bng ting Anh v chuyn cc lnh ti kernel.2. S Dng SHELL Nh Ngn Ng Lp Trnh C hai cch vit chng trnh iu khin shell: g chng trnh ngay t dng lnh l cch n gin nht. Tuy nhin mt khi thnh tho c th gp cc lnh vo mt tp chy (chng tng ng vi cch DOS gi tp *.bat), iu ny hiu qu v tn dng trit tnh nng t ng ha ca shell. 2.1. iu khin shell t dng lnh Chng ta hy bt u, gi s trn a cng c rt nhiu file ngun .c, bn mun truy tm v hin th ni dung ca cc tp ngun cha chui main(). Thay v dng lnh grep tm ra tng file sau quay li dng lnh more hin th file, ta c th dng lnh iu khin shell t ng nh sau: $ for file in * do if grep -l 'main( ) ' $file then more $fle fi done Khi g mt lnh cha hon chnh t du nhc ca shell, shell s chuyn du nhc thnh >, shell ch nhp y cc lnh trc khi thc hin tip. Shell t trng hiu c khi no th lnh bt u v kt thc. Trong v d trn lnh for . . . do s kt thc bng done. Khi g xong done, shell s bt u thc thi tt c nhng g g vo bt u t for. y, file l mt bin ca shell, trong khi * l mt tp hp i din cho cc tn tp tm thy trong th mc hin hnh. Bt tin ca vic iu khin ngn ng shell t dng lnh l kh ly li khi lnh trc sa i v thc thi mt ln na. Nu ta nhn phm Up/Down th shell c th tr li khi lnh nh sau: $ for file in * ; do ; if grep -1 'main( ) $file; then ; more $file; fi; done y l cch cc shell Linux vn thng lm cho php thc thi nhiu lnh cng lc ngay trn dng lnh. Cc lnh c th cch nhau bng du (;). V d: $ mkdir myfoler; cd myfolder; s to th mc myfolder bng lnh mkdir sau chuyn vo th mc ny bng lnh cd. Ch cn g Enter mt ln duy nht thc thi hai lnh cng lc. Tuy nhin sa cha cc khi lnh nh vy khng d dng v rt d gy li. Chng ch thun tin cho kt hp khong vi ba lnh. d bo tr bn c th a cc lnh vo mt tp tin v yu cu shell c ni dung tp tin thc thi lnh. Nhng tp tin nh vy gi l tp tin kch bn (shell script). 2.2 iu khin shell bng tp tin kch bn (script file) Trc ht bn dng lnh $cat > first.sh hay cc trnh son tho nh vi hay emacs (hoc mc) hay gedit son ni dung tp tin first.sh nh sau: # ! /bin/ sh # first.sh # Script nay se tm trong th mc hin hnh cc chui mang ni dung # main( ) , ni dung ca fle s c hin th ra mn hnh nu tm thy. for file in * do if grep -l 'main( ) ' $file then more $fle fi done exit 0 Khng nh ch thch ca C, mt dng ch thch (comment) trong ngn ng shell bt u bng k t #. Tuy nhin y c mt ch thch hi c bit l #!/bin/sh. y thc s khng phi l ch thch. Cp k t #! l ch th yu cu shell hin ti triu gi shell sh nm trong th mc /bin. Shell sh s chu trch nhim thng dch cc lnh nm trong tp tin script c to. C th ch nh #!/bin/bash lm shell thng dch thay cho sh, v trong Linux tht ra sh v bash l mt. Tuy nhin nh nu, trn cc h Unix vn s dng shell sh lm chun, v vy vn l mt thi quen tt cho lp trnh vin nu s dng shell sh. Khi tip cn vi UNIX, ta s cm thy quen v thn thuc vi shell ny hn. Nn chy script trong mt shell ph (nh gi sh chng hn), khi mi thay i v mi trng m script gy ra khng nh hng n mi trng lm vic chnh. Ch th #! Cn c dng gi bt k chng trnh no ta mun chy trc khi script tip theo c dch. Lnh exit bo m rng script sau khi thc thi s tr v m li, y l cch m hu ht cc chng trnh nn lm, mc d m li tr v t khi c dng n trong trng hp thc hin tng tc trc tip t dng lnh. Tuy nhin, nhn bit m tr v ca mt on script sau khi thc thi, li thng rt c ch nu bn triu gi script t trong mt script khc. Trong on chng trnh trn, lnh exit s tr v 0, cho bit script thc thi thnh cng v thot khi shell gi n. Mc d khi lu tp tin script vi tn .sh, nhng UNIX v Linux khng bt buc iu ny. Him khi Linux s dng phn ui m rng ca tp tin lm du hiu nhn dng, do tn tp script c th l ty . Tuy vy .sh vn l cch chng ta nhn ngay ra mt tp tin c th l script ca shell mt cch nhanh chng. 2.3. Thc thi scriptChng ta va to ra tp tin script first.sh, n c th c gi thc thi theo 2 cch. Cch n gin nht l triu gi trnh shell vi tn tp tin script lm i s. V d: $ /bin/ sh first.sh Cch gi trn l bnh thng, nhng vn quen thuc hn nu ta c th gi first.sh ngay t dng lnh, tng t cc lnh Linux thng thng. lm c iu ny, trc ht cn chuyn thuc tnh thc thi (x) cho tp tin script bng lnh chmod nh sau: $ chmod +x first.sh Sau c th triu gi script theo cch th hai tin li hn: $ first.sh C th lnh trn khng thc hin thnh cng v ta s nhn c thng bo li 'command not found' (khng tm thy lnh). iu ny xy ra bi v bin mi trng PATH ca bn thng khng cha ng dn hay v tr th mc hin hnh. khc phc, ta c th thm vo bin mi trng PATH ch nh th mc hin hnh nh sau: $ PATH=$PATH: . Nu mun Linux t ng nh th mc hin hnh mi khi ng nhp bn c th thm lnh PATH=$PATH : . vo cui tp .bash_profile (file c triu gi lc h thng ang nhp - tng t autoexec.bat ca DOS). Tuy nhin cch ngn gn v n gin nht m ta vn thng lm l nh r du th mc hin hnh ./ ngay trn lnh. V d: $ . / first.sh Lu : i vi ti khon root, khng nn thay i bin mi trng PATH (bng cch thm du ch nh . ) cho php truy tm th mc hin hnh. iu ny khng an ton v d to ra l hng bo mt. V d, mt qun tr h ng nhp di quyn root, triu gi chng trnh ca Linux m h tng th mc qui nh nh /bin, nu bin PATH cho php tm th mc hin hnh th rt c th nh qun tr thc thi chng trnh ca ai thay v chng trnh Linux /bin. Vy nn to thi quen t du ./ trc mt tp tin m ch truy xut th mc hin hnh. Mt khi bn tin rng first.sh chy tt, c th di chuyn n n th mc khc thch hp hn th mc hin hnh. Nu lnh script ch dnh cho mc ch ring ca bn, bn c th to ra th mc /bin trong th mc ch (home) m nh qun tr qui nh cho ngi dng, sau thm ng dn ny vo bin mi trng PATH. Nu mun script c gi bi ngi dng khc, hy t n vo th mc /usr/1ocal/bin. Thng thng, cho php mt script hay chng trnh thc thi, cn c ngi qun tr cho php. Nu bn l nh qun tr, cng cn cn thn xem xt cc script do cc ngi dng khc (hacker chng hn) t vo h thng. Ngn ng script rt mnh, n c th lm c hu nh l mi chuyn k c hy dit h thng! ngn script b sa i bi ngi dng khc, c th s dng cc lnh thit lp quyn (thng phi ng nhp vi t cch root lm cng vic ny): #cp first.sh /usr/1ocal/bin #chown root /usr/local/bin/first.sh #chgrp root /usr/1ocal/bin/first.sh #chmod u=rwx go=rx /usr/1ocal/bin/firsc.sh on lnh trn mang ngha: chuyn quyn s hu tp tin cho root, root c ton quyn c sa ni dung v thc thi tp tin, trong khi nhm v nhng ngi dng khc root ch c php c v thc thi. Nn nh mc d bn loi b quyn ghi w trn tp tin, UNIX v Linux vn cho php bn xo tp tin ny nu th mc cha n c quyn ghi w. an ton, vi t cch l nh qun tr, nn kim tra li th mc cha script v bo m rng ch c root mi c quyn w trn th mc cha cc tp .sh 3. C Php Ngn Ng SHELL Chng ta thy cch vit lnh v gi thc thi tp tin scirpt. Phn tip theo nay dnh cho bn khm ph sc mnh ca ngn ng lp trnh shell. Tri vi lp trnh bng trnh bin dch kh kim li v nng cp, lp trnh script cho php bn d dng sa i lnh bng ngn ng vn bn. Nhiu on script nh c th kt hp li thnh mt script ln mnh m v rt hu ch. Trong th gii UNIX v Linux i lc gi thc thi mt chng trnh, bn kh m bit c chng trnh c vit bng script hay thc thi theo m ca chng trnh nh phn, bi v tc thc thi v s uyn chuyn ca chng gn nh ngang nhau. Phn ny chng ta s hc v: Bin: kiu chui, kiu s, tham s v bin mi trng iu kin: kim tra lun l Boolean bng shell iu khin chng trnh: if, elif, for , while, until, case 3.1. S dng binThng bn khng cn phi khai bo bin trc khi s dng. Thay vo bin s c t ng to v khai bo khi ln u tin tn bin xut hin, chng hn nh trong php gn. Mc nh, tt c cc bin u c khi to v cha tr kiu chui (string). Ngay c khi d liu m bn a vo bin l mt con s th n cng c xem l nh dng chui. Shell v mt vi lnh tin ch s t ng chuyn chui thnh s thc hin php tnh khi c yu cu. Tng t nh bn thn h iu hnh v ngn ng C, c php ca shell phn bit ch hoa ch thng, bin mang tn foo, Foo, v FOO l ba bin khc nhau. Bn trong cc script ca shell, bn c th ly v ni dung ca bin bng cch dng du $ t trc tn bin. hin th ni dung bin, bn c th dng lnh echo. Khi gn ni dung cho bin, bn khng cn phi s dng k t $. V d trn dng lnh, bn c th gn ni dung v hin th bin nh sau: xinchao=Hello echo $xinchao Kt qu in ra mn hnh: Hello

xinchao="I am here" echo $xinchao Kt qu in ra mn hnh: I am here

xinchao=12+l echo $xinchao Kt qu in ra mn hnh: 12+1 Lu , sau du = khng c c khong trng. Nu gn ni dung chui c khong trng cho bin, cn bao bc chui bng du . C th s dng lnh read c nhp liu do ngi dng a vo v gi li trong bin s dng. V d: read yourname # nhp vo: XYZ echo "Hello " $yourname Kt qu in ra mn hnh: Hello XYZ Lnh read kt thc khi bn nhn phm Enter (tng t scanf ca C hay readln ca Pascal). 3.1.1.. Cc k t c bit (Metalcharacters ca Shell) 3.1.1.1. Chuyn hng vo/ra Mt tin trnh Unix/Linux bao gi cng gn lin vi cc u x l cc dng (stream) d liu: u vo chun (stdin hay 0), thng l t bn phm qua chc nng getty(); u ra chun (stdout, hay 1), thng l mn hnh, v c s d liu li h thng (stderr, hay 2). Tuy nhin cc hng vo/ra c th thay i c bi cc thng bo c bit: K hiu ngha ( tng trng cho ch i hng)

>u ra hng ti

>>Ni vo ni dung ca

>u ra bo li hng v ghi thm vo

V d: $date > login.time Lnh date khng kt xut ra u ra chun (stdout) m ghi vo tp login.time. >login.time khng phi l thnh phn ca lnh date, m n gin m t tin trnh to v gi kt xut u (bnh thng l mn hnh). Nhn theo cch x l th nh sau: c cm lnh trn cha hai phn: lnh date, tc chng trnh thc thi, v thng ip (>login.time) thng bo cho shell bit kt xut lnh s c x l nh th no (khc vi mc nh. Bn thn date cng khng bit chuyn kt xut i u, shell chn mc nh). V d: $cat < file1 Bnh thng cat nhn v hin th ni dung tp c tn (l i u vo). Vi lnh trn cat nhn ni dung t file1 v kt xut ra mn hnh. Thc cht khng khc g khi g: $cat file1. Hy xem: $cat < file1 > file2Lnh ny thc hin nh th no ? Theo trnh t s nh sau: cat nhn ni dung ca file1 sau ghi vo tp c tn file2, khng a ra stdout nh mc nh. Lnh cho thy ta c th thay i u v u ra cho lnh nh th no. Nhng lnh cho php i u ra/vo gi chung l qa trnh lc (filter). V d: $cat file1 < file2 Lnh ny ch hin th ni dung ca file1, khng g hn. Ti sao ? cat nhn i u vo l tn tp. Nu khng c i n nhn t stdin (bn phm). C i th chnh l file1 v u ra l stdout. Trng hp ny gi l b qua i hng. Ci g y l quan trng ? u ra/vo ca lnh i hng cng khng c ngha l s bo m rng s i hng s c s dng. Mt ln na cho thy lnh bn thn n khng hiu rng c s i hng v c lnh chp nhn i hng vo/ra, nhng khng phi tt c. V d $date < login.time date khc cat, n khng kim tra u vo, n bit phi tm u vo u. i hng y khng c tc dng. V d $cat < badfile 2> errfile Thng thng cc li h thng qun l u stderr v s in ra mn hnh. Tuy nhin c th chuyn hng bo li, v d vo mt tp (chng hn logfile) m khng a ra mahn hnh. V d trn l nh vy. Ta bit stderr l tp c m t tp = 2, do vy 2>errfile c ngha i u ra ca stderr vo mt tp, tc ghi bo li vo tp xc nh. Nhng g va cp tc ng trn tp vo/ra. Ta cng c cch x l ngay trong mt dng ca tp, ci gi l i hng trong dng (in-line Redirection). Lai ny bao gm hai phn: i hng ( EOF (v g ENTER) Ngay lp tc trn mn hnh s l: Xin chao y EOF l du hiu nh du, hay cn gi l th bi (token). iu ng lu l: 1. Cng mt dng d liu, phi c kt thc2. Token phi ng ngay u dng. V d trn c mt ch : du > gi l du nhc th cp, n cho bit dng lnh a vo di hn l 1 dng v cng l du hiu shell thng bo n nhn nhiu (thng tin) u vo.

3.1.1.2. Cc k t c bit kim sot tin trnh 1. & (Ampersand): t mt tin trnh (chng trnh) vo ch chy nn (background process). Bn thn Unix khng c khi nim g v tin trnh chy nn hay tin trnh tng tc (foreground), m shell iu khin vic chy cc tin trnh. Vi & chng trnh s t chy v shell quay ngay v tng tc vi ngi dng, tr li du nhc ngay. Tin trnh nn c nhiu cch kim sot. V d: $sort huge.file > sorted.file & // huge.file l mt file tht ln$ Bng lnh ps s thy lnh sort ang chy km vi s ID ca tin tnh . Bng lnh $ jobs [1] s thy s hiu ca lnh ang chy ngm. kt thc thc thi, dng $ kill 1234 #1234 l ID ca tin trnh sort quay li ch tng tc: $ fg 1 2. Ngoc n ( ; ) Dng nhm mt s lnh li, phn cch bi ; V d: $ (date ; who) > system.status $ cat system.status (Hy xem kt xut trn mn hnh) 3. Du nhy ` ` (backquotes) (l du phm i cng vi du ~) Hay cn gi l du thay th. Bt k lnh no xut hin bn trong du nhy s c thc hin trc v kt qu ca lnh s thay th u ra chun (stdout) trc khi lnh trong dng lnh thc hin. V d: $ echo Logged in `dat > login.time s ni cho shell i thc hin date trc tin, trc khi thc hin cc phn khc cn li ca dng lnh, tc sau mi thc hin lnh echo. Vy cch din t dng lnh trn nh sau: echo Logged in Fri May 12:52:25 UTC 2004 > login.time Tc l: 1. thc hin date vi kt qu Fri May 12:52:25 UTC 2004 khng hin ra stdout (mn hnh), nhng s l u vo ca echo; 2. sau lnh echo s echo Logged in Fri May 12:52:25 UTC 2004, nhng khng a ra mn hnh (stdout) m i hng vo tp login.time. Nu g $ cat login.time, ta c kt xut t tp ny ra mn hnh: Logged in Fri May 12:52:25 UTC 2004 4. ng dn (Pipelines) Shell cho php kt qu thc thi mt lnh (u ra ca lnh), kt hp trc tip (ni vo) u vo ca mt lnh khc, m khng cn x l trung gian (lu li trc ti tp trung gian). V d: $who | ls l u ra (stdout) ca who (ng l s ra mn hnh), s l u vo (stdin) ca ls l. V d: $ (date ; who) | ls -l Tm tt: cmd & t lnh cmd chy nn (background) cmd1 ; cmd2 chy cmd1 trc, sau chy cmd2 (cmd) thc hin cmd trong mt shell con (subshell) `cmd` u ra ca cmd s thay cho u ra ca lnh trong dng lnh cmd1 | cmd2 ni u ra ca cmd1 vo u vo ca cmd2 3.1.1.3 Du bc chui (quoting) Shell c mt tp cc k t c bit m hiu lc ca chng l v hiu ha ngha ca cc k t c bit khc. Khi mt k t c bit b gii tr hiu lc, ta gi k t l b quoted. Trc khi tip tc chng ta cn hiu mt s tnh cht ca du bc chui m shell quy nh. Thng thng, tham s dng lnh thng cch nhau bng khong trng. Khong trng c th l k t spacebar, tab hoc k t xung dng. Trng hp mun tham s ca mnh cha c c khong trng, cn phi bc chui bng du nhy n ' hoc nhy kp " . Du nhy kp c dng trong trng hp bin chui ca bn c khong trng. Tuy nhin vi du nhy kp, k hiu bin $ vn c hiu lc. Ni dung ca bin s c thay th trong chui. Du nhy n s c hiu lc mnh hn. Nu tn bin c k t $ t trong chui c du nhy n, n s b v hiu ha. C th dng du \ hin th k t t bit $ trong chui. 1. Backslash ( \ ) V d: $cat file1&2 lnh ny gy ra nhiu li, bi c s hiu nhm & trong khi n n gin l thnh phn ca tn tp (file1&2). c nh : $cat file1\&2 s cho kt qu nh momg mun: a ni dung ca tp c tn file1&2 ra mn hnh. Du gii tr ngha c bit ca &. Cc v d khc v hay : V d 3-1: variables.sh #!/bin/sh myvar="Hi there" echo $myvar echo "message : $myvar" echo 'message : $myvar' echo "messgae : \$myvar" echo Enter some text read myvar echo '$myvar' now equals $myvar exit 0 Kt xut khi thc thi script: Hi there message : Hi there message : $myvar message : $myvar Enter some text Hello World $myvar now equals Hello World Cch chng trnh lm vic: Bin myvar c to ra v khi gn gi tr chui Hi there. Ni dung ca bin sau c hin th bng lnh echo trong cc trng hp bc chui bng nhy kp, nhy n v du hin th k t c bit. Tm li nu mun thay th ni dung bin trong mt chui, cn bc chui bng nhy kp. Nu mun hin th ton b ni dung chui, hy dng nhy n. 3.1.2. Bin mi trng (environment variable) Khi trnh shell khi ng n cung cp sn mt s bin c khai bo v gn tr mc nh. Chng c gi l cc bin mi trng. Cc bin ny thng c vit hoa phn bit vi bin do ngi dng t nh ngha (thng l k t khng hoa). Ni dung cc bin ny thng ty vo thit lp ca h thng v ngi qun tr cho php ngi dng h thng s dng. Danh sch ca cc bin mi trng l kh nhiu, nhng nhn chung nn nh mt s bin mi trng ch yu sau: Bin mi trng ngha

$HOMECha ni dung ca th mc ch. (Th mc u tin khi ngi dng ng nhp)

$PATHCha danh sch cc ng dn (phn cch bng dn hai chm :). Linux thng tm cc trnh cn thi hnh trong bin $PATH.

$PS1Du nhc (prompt) hin th trn dng lnh. Thng thng l $

chouser khng phi root.

$SP2Du nhc th cp, thng bo ngi dng nhp thm thng tin trc khi lnh thc hin.Thng l du >.

$IFSDu phn cch cc trng trong danh sch chui. Bin ny cha danh sch cc k t m shell dng tch chui (thng l tham s trn dng lnh). V d $IFS thng cha k t Tab, k t trng hoc k t xung hng.

$0Cha tn chng trnh gi trn dng lnh.

$#S tham s truyn trn dng lnh

$$M tin trnh (process id) ca shell script thc thi. Bi s process id ca tin trnh l duy nht trn ton h thng vo lc script thc thi nn thng cc lnh trong script dng con s ny to cc tn file tm. V d /tmp/tmpfile_$$.

Mi mi trng m user ng nhp cha mt s danh sch bin mi trng dng cho mc ch ring. C th xem danh sch ny bng lnh env. to mt bin mi trng mi, c th dng lnh export ca shell (mt s shell s dng lnh setenv). 3.1.3. Bin tham s (parameter variable) Nu cn tip nhn tham s trn dng lnh x l, c th dng thm cc bin mi trng sau: Bin tham s ngha

$1, $2, $3 . . .V tr v ni dung ca cc tham s trn dng lnh theo th t t tri sang phi.

S*Danh sch ca tt c cc tham s trn dng lnh. Chng c lu trong mt chui duy nht phn cch bng k t u tin quy nh trong bin $IFS.

$@Danh sch cc tham s c chuyn thnh chui. Khng s dng du phn cch ca bin IFS.

hiu r s khc bit ca bin $ * v $@, hy xem v d sau: $IFS= "A $set foo bar bam $echo $@ foo bar bam $echo "$* fooAbarAbam $unset IFS $echo "$*" foo bar bam Ta nhn thy, lnh set tip nhn 3 tham s trn dng lnh l foo bar bam. Chng nh hng n bin mi trng $* v $@. Khi IFS c qui inh l k t A , $* cha danh shell cc tham s phn cch bng k t A . Khi t IFS v NULL bng lnh unset, bin $* tr v danh shell thun tu ca cc tham s tng t bin $@. Bin $# s cha s tham s ca lnh, trong trng hp trn ta c: $echo " $# " 3 Khi lnh khng c tham s th $0 chnh l tn lnh cn $# tr v gi tr 0. on trnh mu sau s minh ha mt s cch n gin x l v truy xut bin mi trng. V d3-2: try_variables.sh #!/bin/sh salutation="Hello" echo $salutation echo "The program $0 is now running" echo "The second parameter was $2" echo "The first parameter was $1" echo "The parameter list was $*" echo "The user's home directory is $HOME"

echo "Please enter a new greeting" read salutation echo $salutation echo "The script is now complete" exit 0 Lu tn tp l try-variables.sh, i thuc tnh thc thi x cho tp tin bng lnh: $chmod +x try_variablebles.sh Khi chy try-variables.sh t dng lnh, bn s nhn c kt qa kt xut nh sau: $./try_variables.sh foo bar baz Hello The program . /try_vanables.sh is now running The second parameter was bar The first parameter was foo The parameter list was foo bar baz The user's home directory is /home/xyz #tn ngi dng login l xyz please enter a new greeting Xin chao! Xin chao! The script is now complete 3.2. iu kin Nn tng c bn trong tt c ngn ng lp trnh, l kh nng kim tra iu kin v a ra quyt nh r nhnh thch hp ty theo iu kin ng hay sai. Trc khi tm hiu cu trc iu khin ca ngn ng script, ta hy xem qua cch kim tra iu kin. Mt script ca shell c th kim tra m li tr v ca bt k lnh no c kh nng triu gi t dng lnh, bao gm c nhng tp tin lnh script khc. l l do ti sao chng ta thng s dng lnh exit cui mi script khi kt thc. 3.2.1. Lnh test hoc [ ] Thc t, cc script s dng lnh [] hoc test kim tra iu kin boolean rt thng xuyn. Trong hu ht cc h thng UNIX v Linux th [ ] v test c ngha tng t nhau, thng lnh [ ] c dng nhiu hn. Lnh [ ] trng n gin, d hiu v rt gn vi cc ng lp trnh khc. Trong mt s shell ca Unix, lnh test c kh nng l mt li triu gi n chng trnh bn ngoi ch khng phi lnh ni ti ca ngn ng script. Bi v test t khi c dng v hu ht cc lp trnh vin c thi quen thng to cc chng trnh vi tn test, cho nn khi th lnh test khng thnh cng bn trong script, th hy xem li y bn trong h thng c mt chng trnh tn l test khc bit no ang tn ti. Hy th dng lnh which test, lnh ny s tr v cho bn ng dn n th mc test c triu gi. Chng hn /bin/test hay /usr/bin/test. Dc y l cch s dng lnh test n gin nht. Dng lnh test kim tra xem file mang tn hello.c c tn ti trong h thng hay khng. Lnh test trong trng hp ny c c php nh sau: test -f , trong script ta c th vit lnh theo cch sau:if test -f hello.c then fi Cng c th s dng [ ] thay th test if [ -f hello.c ] then fi M li v gi tr tr v ca lnh m test kim tra s quyt nh iu kin kim tra l ng hay sai. Lu , phi t khong trng gia lnh [ ] v biu thc kim tra. d nh, xem [ ] tng ng vi lnh test, v d nhin gia mt lnh v tham s truyn cho lnh phi phn cch nhau bng khong trng trnh bin dch c th hiu. Nu thch t t kha then chung mt dng vi lnh if, bn phi phn cch then bng du chm phy (;) nh sau: if [ -f hello.c ] ; then . . . fi iu kin m lnh test cho php kim tra c th ri vo mt trong 3 kiu sau: So snh chui So snh Kt qu stringl = string2 true nu 2 chui bng nhau (chnh xc tng k t) tring1 != string2 true nu 2 chui khng bng nhau -n string1 true nu string1 khng rng -z stringl true nu string1 rng (chui null) So snh ton hc So snhKt qu

expression1 eq expression2true nu hai biu thc bng nhau

expression1 -ne expression2true nu hai biu thc khng bng nhau

expression1 -gt expression2true nu biu thc expression1 ln hn expression2

expreesion1 -ge expression2true nu biu thc expression1 ln hn hay bng expression2

expression1 -lt expression2true nu biu thc expression1 nh hn expression2

expression1 -le exprebbion2true nu biu thc expression1 nh hn hay bng expression2

!expressiontrue nu biu thc expression l false (ton t not)

Kim tra iu kin trn tp tin -d file true nu file l th mc -e file true nu file tn ti trn a -f file true nu file l tp tin thng thng -g file true nu set-group-id c thit lp trn file -r file true nu file cho php c -s file true nu kch thc file khc 0 -u file true nu set-ser-id c p t trn file -w file true nu file cho php ghi -x file true nu file c php thc thi Lu v mt lch s th ty chn -e khng kh chuyn (portable) v -f thng c s dng thay th. Cu hi c th t ra l set-group-id v set-ser-id (cn c gi l set-gid v set-uid) mang ngha g. Set-uid cho php chng trnh quyn ca ch th s hu (owner) thay v quyn ca user thng thng. Tng t set-gid cho php chng trnh quyn ca nhm. Tt c cc iu kin kim tra tp tin u yu cu file phi tn ti trc (c ngha l lnh test -f filename phi c gi trc). Lnh test hay [ ] cn c thm nhiu iu kin kim tra khc na, nhng hin thi ta cha dng n. C th tham kho chi tit test bng lnh help test t du nhc ca h thng. 3.3 Cu trc iu khinShell cung cp cu trc lnh iu khin rt ging vi cc ngn ng lp trnh khc l if, elif, for, while, until, case. i vi mt vi cu trc lnh (v d nh case), shell a ra cch x l uyn chuyn v mnh m hn. Nhng cu trc iu khin khc nu c thay i ch l nhng thay i nh khng ng k. Trong cc phn sau statements c hiu l biu thc lnh (c th bao gm mt tp hp cc lnh) s c thc thi khi iu kin kim tra condition c tho mn. 3.3.1. Lnh if Lnh if tuy n gin nhng c s dng nhiu nht. if kim tra iu kin ng hoc sai thc thi biu thc thch hp if condition then statements else statements V d, on script sau s ng if ty vo cu tr li ca bn m a ra li cho thch hp V du 3-3 if_control.sh #!/bin/sh echo "Is it morning? Please answer yes or no" read timeofday #ch khong trng trc sau [ v trc ] if [ $timeofday = "yes" ]; then echo "Good morning" else echo "Good afternoon" fi exit 0 Kt qu kt xut ca script $./ if_control.sh Is it mornining ? Please answer yes or no yes Good morning $ v d trn chng ta s dng c php [ ] kim tra iu kin thay cho lnh test. Biu thc kim tra xem ni dung ca bin $timeofday c khp vi chui "yes" hay khng. Nu c th lnh echo cho in ra chui Good morningg, nu khng (mnh else) in ra chui Goo afternoon". Shell khng i hi phi canh l hay tht u dng cho tng lnh. Chng ta canh l c php c r rng, d c. Mc d vy sau ny bn s thy ngn ng ca chng trnh make s yu cu canh l v xem l yu cu nhn dng lnh. 3.3.2 Lnh elif Tht khng may, c rt nhiu vn pht sinh vi on trnh script trn. Tt c tr li khc vi yes u c ngha l no. Chng ta c th khc phc iu ny bng cch dng cu trc iu khin elif. Mnh ny cho php kim tra iu kin ln th hai bn trong else. Script di y c sa i hon chnh hn, bao gm c in ra thng bo li nu ngi dng khng nhp ng cu tr li yes hoc no. V du 3-4: elif_control.sh #!/bin/sh echo "Is it morning? Please answer yes or no" read timeofday if [ $timeofday = "yes" ]; then echo "Good morning" elif [ $timeofday = "no" ]; then echo "Good afternoon" else echo "Sorry, $timeofday not recognized. Enter yes or no" exit 1 fi exit 0 Cng n gin nh v d 3-3, nhng chng ta s dng thm elif kim tra trng hp ngi dng khng nhp no". Thng bo li c in ra v m li tr v bng lnh exit l 1. Trng hp hoc yes hoc no c nhp vo, m li tr v s l 0. 3.3.3. Vn pht sinh vi cc bin elif trong v d trn khc phc c hu ht cc iu kin nhp liu v yu cu ngi dng nhp ng trc khi ra quyt nh thc thi tip theo. Mc d vy, c mt vn kh tinh t cn li, nu chy li elif_control.sh ni trn, nhng thay v nhp vo mt chui no , hy g Enter (to chui rng cho bin $timeofday), s nhn c thng bo li ca shell nh sau: [ : = : unary operator expected iu g xy ra ? Li pht sinh ngay mnh if u tin. Khi bin timeofday c kim tra n cho tr l rng v do lnh if s c shell din dch thnh: if [= yes " ] v d nhin shell khng hiu phi so snh chui yes" vi ci g. trnh li ny cn bc ni dung bin bng du bao chui nh sau: if [ $timeofdayl ="yes] Trong trng hp ny nu chui nhp vo l rng, shell s din dch biu thc thnh: if [ =yes] v script s chy tt. Elif_control.sh c th sa li hon chnh hn nh sau: V du: 3-5: e lif_control2.sh #!/bin/sh echo -n "Is it morning? Please answer yes or no: " read timeofday if [ "$timeofday" = "yes" ]; then echo "Good morning" elif [ "$timeofday" = "no" ]; then echo "Good afternoon" else echo "Sorry, $timeofday not recognized. Enter yes or no" exit 1 fi exit 0 Hy kim tra li elif_controi2.sh bng cch chi nhn Enter khi shell a ra cu hi. Script gi y chy rt bo m v chun. Lnh echo thng xung hng sau khi a ra thng bo. C th ng lnh printf thay cho echo. Mt vi shell cho php lnh echo -e trn mt dng, nhng chng khng phi l ph bin bn s dng. 3.3.4. Lnh for S dng for lp li mt s ln vi cc gi tr xc nh. Phm vi lp c th nm trong mt tp hp chui ch nh tng minh bi chng trnh hay l kt qa tr v t mt bin hoc biu thc khc. C php: for variable in values do statemens done V d sau s in ra cc gi tr chui trong tp hp: V du 3-6: for_loop.sh #!/bin/sh for foo in bar fud 13 do echo $foo done exit 0 Kt qu kt xut s l $./ for_loop.sh bar fud 13 foo l mt bin dng trong vng lp for duyt tp hp gm 3 phn t (cch nhau bng khong trng). Mc nh shell xem tt c cc gi tr gn cho bin l kiu chui cho nn 13 y c xem l chui tng t nh chui bar v fud. iu g s xy ra nu bn thay th lnh for foo in bar fud 13 thnh for foo in bar fud 13. Hy nh li, du nhy kp cho php coi tt c ni dung bn trong nhy kp l mt bin chui duy nht. Kt qu kt xut nu s dng du nhy kp, lnh echo ch c gi mt ln in ra chui "bar fud 13 ". for thng dng duyt qua danh sch tn cc tp tin. Bng cch dng k t i din * (wildcard) v d first.sh, ta thy cch for tm kim tp tin kt hp vi lnh grep. V d sau y cho thy vic m rng bin thnh tp hp s dng trong lnh for. Gi s bn mun in ra tt c cc tp *.sh c k t u tin l f V du 3-7: for_loop2.sh #!/bin/sh for file in $(ls f*.sh); do lpr $file done V d trn y cng cho thy cch s dng c php $(command). Danh sch cc phn t trong lnh for c cung cp bi kt qu tr v ca lnh ls f* v c bc trong cp lnh m rng bin $ ( ) . Bin m rng nm trong du bao $ (command) ch c xc inh khi lnh command thc thi xong. 3.3.5 Lnh while Mc d lnh for cho php lp trong mt tp hp gi tr bit trc, nhng trong trng hp mt tp hp ln hoc s ln lp khng bit trc, th for khng thch hp. V d . for foo in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 do echo $foo done Lnh while cho php thc hin lp v hn khi iu kin kim tra vn cn ng. C php ca while nh sau: while condition do statements done V d sau s cho thy cch while lin tc kim tra mt khu (password) ca ngi dng cho n khi ng bng chui secret, mi chp nhn. V du: 3-8: password.sh #!/bin/sh echo "Enter password" read trythis while [ "$trythis" != "secret" ]; do echo "Sorry, try again" read trythis done exit 0 Kt qu ca script $./password.sh Enter password: abc Sorry, try again secret #g ng $ Mc d password hin th khi nhp liu r rng l khng thch hp, nhng y ta ch yu minh ha lnh while. Lnh while lin tc kim tra ni dung bin $trythis, yu cu nhp li d liu bng lnh read mt khi $trythis vn cha bng vi chui "secret". Bng cch s dng bin m v biu thc so snh ton hc, while hon tan c th thay th for trong trng hp tp d liu ln. Hy theo di v d sau: V d: 3-9 while_for.sh #!/bin/sh foo=1 while [ "$foo" -le 16 ] do echo "Here $foo" foo=$(($foo+1)) done exit 0 Lu , c php $( ( ) ) do shell ksh khi xng. C php ny dng nh gi v c lng mt biu thc. Vi cc shell c khc c th thay th c php ny bng lnh expr. Tuy nhin expr khng hiu qu. Bt c khi no, nu c th hy nn dng $ ( ( ) ) thay cho expr. script while_for.sh s dng lnh [ ] kim tra gi tr ca bin $foo vn cn nh hn hay bng 16 hay khng. Nu cn, lnh lp while s in ra tng cng dn ca bin $foo. 3.3.6 Lnh until C php ca lnh until nh sau: until condition dostatements done Lnh until tng t lnh while nhng iu kin kim tra b o ngc li. Vng lp s b dng nu iu kin kim tra l ng. V d sau s s dng lnh until ch mt user no ng nhp: V d 3-10: until_user.sh #!/bin/sh echo "Locate for user ..." until who | grep "$1" > /dev/null do sleep 60 done echo -e \\a echo "***** $1 has just logged in *****" exit 0 th lnh ny, nu chy ngoi mn hnh console, hy dng hai mn hnh o (Alt+F1 v Alt+F2), mt mn hnh dng chy script until_user.sh, mn hnh kia dng ng nhp vi tn user mun kim tra. Nu trong ch ha, bn c th m hai ca s terminal v s d hnh dung hn. Hy chy until_user.sh t mt mn hnh nh sau: $./until_user.sh xyz Locate for user . . . Script s ri vo vng lp ch user tn l xyz dng nhp. Hy nhp t mt mn hnh khc (vi user tn l xyz), ta s thy mn hnh u tin a ra thng bo cho thy vng lp until chm dt * * * * * xyz has just logged in * * * * * Cch chng trnh lm vic:Lnh who lc danh sch cc user ng nhp vo h thng, chuyn danh sch ny cho grep bng c ch ng ng ( | ). Lnh grep lc ra tn user theo bin mi trng $1 hin c ni dung l chui xyz. Mt khi lnh grep lc ra c d liu, n s chuyn ra vng tp tin rng /dev/null v tr li gi tr null, lnh until kt thc.

3.3.7 Lnh case Lnh case c cch s dng hi phc tp hn cc lnh hc. C php ca lnh case nh sau: case variable in pattern [ | partten] . . . ) statements;; pattern [ | partten] . . . ) statements;; . . . esac Mc d mi nhn hi kh hiu, nhng lnh case rt linh ng. case cho php thc hin so khp ni dung ca bin vi mt chui mu pattern no . Khi mt mu c so khp, th (lnh) statement tng ng s c thc hin. Hy lu t hai du chm nhy ;; pha sau mi mnh so khp pattern, shell dng du hiu ny nhn dng mu pattern so khp tip theo m bin cn thc hin. Vic cho php so khp nhiu mu khc nhau lm case tr nn thch hp cho vic kim tra nhp liu ca ngi dng. Chng ta hy xem li v d 3-4 vi phin bn vit bng case nh sau: V d 3-11 case1.sh #!/bin/sh echo "Is it morning? Please answer yes or no" read timeofday case "$timeofday" in "yes") echo "Good Morning";; "no" ) echo "Good Afternoon";; "y" ) echo "Good Morning";; "n" ) echo "Good Afternoon";; * )echo "Sorry, answer not recognised";; esac exit 0 Cch thc hin: Sau khi ngi dng nhp vo cu tr li, lnh case s ly ni dung ca bin $timeofday so snh vi tng chui. Khi gp chui thch hp n s thc thi lnh ng sau du ) v kt thc (khng tip tc so khp vi cc mu khc). K t i din * cho php so khp vi mi loi chui. * thng c xem nh trng hp so snh ng cui cng nu cc mu so snh trc tht bi. Bn c th xem * l mnh default trong lnh switch ca C hay case else ca Pascal. Vic so snh thng thc hin t mu th nht tr xung cho nn bn ng bao gi t * u tin, bi v nh th bt k chui no cng u tha mn case. Hy t nhng mu d xy ra nht trn u, tip theo l cc mu c tn s xut hin thp. Sau cng mi t mu * x l mi trng hp cn li. Nu mun c th dng mu * t xen gia cc mu khc theo di (debug) li ca chng trnh (nh in ra ni dung ca bin trong lnh case chng hn). Lnh case trong v d trn r rng l sng sa hn chng trnh s dng if. Tuy nhin c th kt hp chung cc mu so khp vi nhau khin cho case ngn gn hn nh sau: V du 3-12 case2.sh #!/bin/sh echo "Is it morning? Please answer yes or no" read timeofday case "$timeofday" in "yes" | "y" | "Yes" | "YES" ) echo "Good Morning";; "n*" | "N*" ) echo "Good Afternoon";; * ) echo "Sorry, answer not recognised";; esac exit 0 script trn s dng nhiu mu so khp trn mt dng so snh ca lnh case. Cc mu ny c ngha tng t nhau v yu cu thc thi cng mt lnh nu iu kin ng xy ra. Cch vit ny thc t thng dng v d c hn cch vit th nht. Mc d vy, hy th tm hiu case mt v d sau cng ny. case s dng lnh exit tr v m li cho tng trng hp so snh mu ng thi case s dng cch so snh tt bng k t i din. V du 3-13 case3.sh #!/bin/sh echo "Is it morning? Please answer yes or no" read timeofday

case "$timeofday" in "yes" | "y" | "Yes" | "YES" ) echo "Good Morning" echo "Up bright and early this morning?" ;; [nN]* ) echo "Good Afternoon" ;; * ) echo "Sorry, answer not recognised" echo "Please answer yes or no" exit 1 ;; esac exit 0 Cnh thc hin: Trong trng hp 'no' ta dng k t i din * thay th cho tt c k t sau n v N. iu ny c ngha l nx hay Nu ... u c ngha l 'no'. v d trn ta thy cch t nhiu lnh trong cng mt trng hp so khp. exit 1 cho bit ngi dng khng chn yes v no. exit 0 cho bit ngi dng chn yes, no theo yu cu. : C th khng cn t ;; mu so khp cui cng trong lnh case (pha trc esac), v khng cn mu so khp no cn thc hin na. Khng nh C yu cu phi t lnh break mi mnh case, shell khng i hi iu ny, n bit t ng chm dt khi lnh case tng ng tm c mu tho mn. lm case tr nn thnh m v so snh c nhiu trng hp hn, c th gii hn cc k t so snh theo cch sau: [yy] | [Yy] [Ee] [Ss], Khi y,Y hay YES, YeS, ... u c xem l yes. Cch ny ng hn l dng k t thay th ton b * trong trng hp [nN]*.

4. Bi Tp1. Bi 1: chy tt cc on lnh v d trong file hng dn phn 3. Chp hnh chy cc file script v kt qu vo bo co.2. Bi 2: vit chng trnh cho php nhp vo tn v mssv. Kim tra nu mssv khng trng vi mnh th bt nhp li. In ra mn hnh kt qu.3. Bi 3: vit chng trnh cho php nhp vo mt s n. Kim tra nu n < 10 th bt nhp li. Tnh tng cc s t 1-> n. In kt qu ra mn hnh.4. Bi 4: vit trnh cho php nhp vo mt chui. Kim tra chui c tn ti trong mt file text (v d test.txt) cng th mc hay khng.5. Tham KhoGio trnh lp trnh Linux Shell ScriptLinux Shell Scripting- A Beginner's handbookStandard Wildcards and Relugar Expressions