Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 57

TRNG I HC CNG NGH THNG TIN

KHOA K THUT MY TNH

TI LIU:

HNG DN THC HNH


H 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 2015

MC LC
Chng 1.

Lp Trnh Trong Mi Trng Shell...........................4

1. Shell ca Unix/Linux..............................................................4
2. S Dng SHELL Nh Ngn Ng Lp Trnh..........................4
2.1. iu khin shell t dng lnh

2.2 iu khin shell bng tp tin kch bn (script file) 5


2.3. Thc thi script 7
3. C Php Ngn Ng SHELL...................................................9
3.1. S dng bin

3.1.1.. Cc k t c bit (Metalcharacters ca Shell) 11


3.1.2. Bin mi trng (environment variable
3.1.3. Bin tham s (parameter variable

18

19

3.2. iu kin...........................................................................21
3.2.1. Lnh test hoc [ ] 22
3.3 Cu trc iu khin.............................................................25
3.3.1. Lnh if 25
3.3.2 Lnh elif 27
3.3.3. Vn pht sinh vi cc bi
3.3.4. Lnh for 29
3.3.5 Lnh while

31

3.3.6 Lnh until

33

3.3.7 Lnh case

34

28

4. Bi Tp38

Chng 1.

Lp Trnh Trong Mi Trng Shell

1. Shell ca Unix/Linux
Shell 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 script


Chng 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 bin


Thng 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

<

Ly u vo t <

<< word

u vo l y

2>

u ra bo li s hng vo

2>>

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 > file2
Lnh 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 (<<) v du hiu nh du (l bt k k t
no) ca dng d liu vo.

V d:
$cat << EOF

# du hiu nh du chn y l EOF

> Xin chao


>
> 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 thc


2. 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

ngha

trng
$HOME

Cha ni dung ca th mc ch. (Th mc u tin khi


ngi dng ng nhp)

$PATH

Cha danh sch cc ng dn (phn cch bng dn hai


chm :). Linux thng tm cc trnh cn thi hnh trong bin
$PATH.

$PS1

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


$

cho
$SP2

user khng phi root.


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

$IFS

Du 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.

$0

Cha 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 <mename> , 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 snh

Kt qu

expression1 eq expression2

true nu hai biu thc bng nhau

expression1 -ne expression2

true nu hai biu thc khng bng


nhau

expression1 -gt expression2

true nu biu thc expression1 ln


hn expression2

expreesion1 -ge expression2

true nu biu thc expression1 ln


hn hay bng expression2

expression1 -lt expression2

true nu biu thc expression1 nh


hn expression2

expression1 -le exprebbion2

true nu biu thc expression1 nh


hn hay bng expression2

!expression

true 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 khin


Shell 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
do
statements
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 Tp
1. 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 Kho
Gio trnh lp trnh Linux Shell Script
Linux Shell Scripting- A Beginner's handbook
Standard Wildcards and Relugar Expressions

You might also like