You are on page 1of 80

LINUX, Lp trnh shell

________________________________________________________________________

1
UNIX/Linux
LP TRNH TRONG MI TRNG SHELL

1. Shell ca UNIX/LINUX

2. S DNG SHELL NH NGN NG LP TRNH
2.1. iu khin shell t dng lnh
2.2. iu khin shell bng tp tin kch bn (script file)
2.3. Thc thi script

3. C PHP NGN NG SHELL
3.1. S dng bin
3.1.1. Cc k t c bit (Metalcharacters ca Shell)
3.1.1.1 Chuyn hng vo/ra
3.1.1.2 Cc k t c bit kim sot tin trnh
1.& (Ampersand)
2.Ngoc n ( ; )
3. Du nhy ` ` (backquotes)
4.ng dn (Pipelines)
3.1.1.3 Du bc chui (quoting)
1.Backslash (\)
3.1.2. Bin mi trng (environment variable)
3.1.3. Bin tham s (parameter variable)
3.2. iu kin
3.2.1. Lnh test hoc [ ]
3.3. Cu trc iu khin
3.3.1. Lnh if
3.3.2. Lnh elif
3.3.3. Vn pht sinh vi cc bin
3.3.4. Lnh for
3.3.5. Lnh while
3.3.6. Lnh intil
3.3.7. Lnh case
3.4. Danh shell thc thi lnh (Lists)
3.4.1. Danh sch AND (&&)
3.4.2 Danh schl OR ( || )
3.4.3. Khi lnh
3.5. Hm (function)
3.5.1 Bin cc b v bn ton cc
3.5.2. Hm v cch truyn tham s
3.6. Cc lnh ni ti ca shell
3.6.1. break
3.6.2 continue
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

2
3.6.3. Lnh : (lnh rng)
3.6.4. Lnh . (thc thi)
3.6.5. eval
3.6.6. exec
3.6.7. exit n
3.6.8. export
3.6.9 Lnh expr
3.6.10. printf
3.6.11 return
3.6.12 set
3.6.13. shift
3.6.14. trap
3.6.15. unset
3.7. Ly v kt qu ca mt lnh
3.7.1. c lng ton hc
3.7.2. M rng tham s
3.8. Ti liu Here

4. D LI (DEBUG) CA SCRIPT

5. HIN TH MU SC (COLOR)
5.1. Mu ch
5.2. Thuc tnh vn bn
5.3. Mu nn

6. XY DNG NG DNG BNG NGN NG SCRIPT
6.1. Phn tch yu cu
6.2. Thit k ng dng

7. KT CHNG
8. MT S TM TT
8.1 To v chy cc chng trnh shell
8.1.1 To mt chng trnh shell
8.1.2 Chy chng trnh shell
8.2 S dng bin
8.2.1 Gn mt gi tr cho bin
8.2.2 Truy nhp gi tr ca mt bin
8.2.3 Tham s v tr v bin xy dng sn trong shell
8.2.4 K t c bit v cch thot khi k t c bit
8.2.5 Lnh test
8.3 Cc hm shell
8.3.2 Cc v d to hm
8.4 Cc mnh iu kin
8.4.1 Mnh if
8.4.2 Mnh case
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

3
8.5 Cc mnh vng lp
8.5.1 Mnh for
8.5.2 Mnh while
8.5.3 Mnh until
8.5.4 Cu lnh shift

TI LIU THAM KHO







































________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

4

Trc khi bt tay vo vit nhng ng dng khng cn ti cc ngn ng lp trnh
phc tp khc, chng ny s cp cch tip cn vi ngn ng kch bn (script) ca h
v (shell, t y s gi l shell script), dng iu khin v tng tc vi Linux. Khi tip
cn vi DOS, DOS cung cp mt shell to cc x l theo l trn nhng tp tin *.bat,
tng i r rng, n gin. Tuy nhin shell ca DOS khng mnh v hu dng bng
shell script trn Linux. Ti liu ny s cung cp nhng kin thc va ngi dng
UNIX/LINUX c th dng shell to ra cc chng trnh thc thi hu hiu, thm ch cn
c th dng shell thc hin c mi thao tc kim sot h iu hnh (nh cc nh
chuyn nghip vn ni). Nhng ch chnh cn t c nh sau:
1.Shell v mc ch s dng
2.C php v cch iu khin cc lnh ca ngn ng shell
3.Hin th v th hin mu sc
4.cc v d thc hnh

1. Shell ca UNIX/Linux

Mi th c thc hin trn Unix u bi tin trnh. Vy to ra tin trnh nh th no ?
Cch th nht l vit ra cc chng trnh m cc chng trnh ny bit cch to ra tin
trnh (C/C++). Tuy nhin cch ny i hi nhiu hiu bit v n lc. Cng nh cc h
iu hnh lm vic kiu o khc, Unix h tr mt phng tin x l lnh lm giao din
gia lnh my (m ngi dng a vo) v vic thc thi ca lnh (bi Unix). Phng
tin gi l shell. T khi ra i Unix c vi kiu shell, l Bourne, C, Korn shell.
Thc ra shell lm g ? Tan b mc ch ca shell l khi ng cc tin trnh x l
lnh a vo: yu cu a (dng) lnh vo, c u vo, thng dch dng lnh , v to
ra tin trnh thc hin lnh . Ni cch khc shell qut dng lnh a vo my tnh,
cu hnh mi trng thc thi v to tin trnh thc hin lnh.


Hnh 2: V tr ca shell khi thc hin lnh ca ngi dng Shell dch cc
lnh nhp vo thnh li gi h thng, chuyn cc k hiu dn hng >, >>
hay | thnh d liu di chuyn gia cc lnh. c cc bin mi trng
tm ra thng tin thc thi lnh.
Nh vy tm hiu shell thc t l hc mt ngn ng lp trnh, cho d khng phc
tp nh C, hay cc ngn ng khc, nhng cng phi qua nhng i hi cn thit. Trong
Unix/Linux c cc lai shell khc nhau v c th la chn dng theo nhu cu m
ngi dng thy ph hp. Hnh 2 l m hnh tng tc gia cc shell, chng trnh ng
dng, h X-Window v ht nhn.
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

5


Cac ung
dung
C shell (csh)
Bourne
Again shell
(bash)
X-Wimdows
shell
Nhan
HDH


Hnh 2

Linux/Unix tch bit cc ng dng, lnh gi cc hm chc nng ca nhn thnh
nhng n th rt nh (tin trnh). Tuy nhin, nhiu lnh ca Linux c th kt hp li vi
nhau to nn chc nng tng hp rt mnh m. V d:
$ ls -al | more
lnh trn c kt hp bng hai lnh, ls lit k ton b danh sch tp v th mc trn a
ra mn hnh, nu danh sch qu di, ls chuyn d liu kt xut cho lnh more x l hin
th kt qu thnh tng trang mn hnh. Linux c cch kt hp d liu kt xut ca cc
lnh vi nhau thng qua c ch chuyn tip (redirect), ng dn (pipe).
Kt hp cc lnh vi nhau ch bng dng lnh khng cha . Nu mun t hp
nhiu lnh ng thi vi nhau v ty vo tng iu kin, kt xut ca lnh, m c nhng
ng x thch hp th sao? Lc s dng n cc cu trc lp trnh r nhnh nh if, case.
Trng hp bn mun thc hin cc thao tc vng lp, phi dng cc lnh nh for, while
... Shell chnh l trnh din dch cung cp cho ngi dng kh nng ny. Hu ht cc
Shell trong Unix/Linux s dng mt ngn ng gn ging vi C (iu ny cng d hiu
bi trong th gii Unix/Linux, C l ngn ng lp trnh thng tr). Ngn ng Shell cng
ging C th lp trnh vin hay ngi iu khin Linux cng cm thy thn thin vi HH.

H thng cung cp cho ngi dng rt nhiu chng trnh shell. Mi shell c mt
s tin ch nh h tr ch g phm, ghi nh lnh. Kt hp cc tin ch ca shell to
ra mt chng trnh chy c, th mt chng trnh nh vy c lu di dng mt
tp, gi l tp kch bn (script, hy th m mt tp nh vy v quan st cu trc ca tp).
Vit c mt tp script, thc cht l lp trnh theo shell. Mt khi quen thuc vi
mt shell v cch hot ng ca shell , ngi dng c th lm ch c cc shell khc
mt cch dng.

Cc shell trn Unix/Linux:

sh ( Bourne ) shell nguyn thy p dng cho Unix
Csh, tcsh v zsh dng shell s dng cu trc lnh ca C lm ngn ng kch bn.
c to ra u tin bi Bia Joy. L shell thng dng th hai sau
bash shell.
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

6
bash shell ch yu ca Linux. Ra i t d n GNU. bash (Vit tt ca
Bourne Again Shell c li im l m ngun c cng b rng
ri. Nu bash cha c sn trong h thng Unix hay Linux, hy ti
v, bin dch v s dng min ph ti a ch www.gnu.org
rc shell m rng ca csh vi nhiu tng thch vi ngn ng C hn.
rc cng ra i t d n GNU.

Shell chun thng c cc nh phn phi Linux s dng hin nay l bash shell. Khi ci
t Linux, trnh ci t thng mc nh bash l shell khi ng. C th tm thy chng
trnh shell ny trong th mc /bin vi tn chng trnh l bash. bash i khi l mt
chng trnh nh phn i khi l mt script gi n lin kt nh phn khc. C th dng
lnh file xem bash l mt tp tin nh phn hay script nh sau:
$ file /bin/bash
/bin/bash: ELF 32-bit LSB executable. Intel 80386
nu kt qu kt xut l dng ELF th c ngha l bash l chng trnh nh phn.
Tuy bash l shell s dng ph bin trong Linux, nhng cc v d v lp trnh s s
dng ngn ng v lnh ca shell sh bi v sh l shell nguyn thy, c th chy trn c
Unix. Bng lnh file ta s thy trong hu ht cc bn Linux hin nay sh ch l lin kt n
bash m thi. V d:
$ file /bin/sh
/bin/sh: symbolic link to bash
iu ny c ngha l bash hon ton c th din dch v iu khin cc lnh ca shell sh.

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.
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

7
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) 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
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

8
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 tp 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 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.

________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

9
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 ca 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,
UNTX 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
Danh shell
Hm
Cc hnh ni ti ca shell
Ly v kt qu ca mt lnh
Ti liu Here

3.1. S dng bin
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

10

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:
$ xinahao=hello
$ echo $xinchao
Hello
$ xin chao= "I am here"
$echo $xin chao
I am here
$ xinchao=12+l
$echo $xin chao
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
XYZ
$echo "Hello " $yourname
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 hbg)
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

11
> 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.
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

12

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 g) 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, phai 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 hai vng nhn nhiu (thng tin) u
vo.
Hy th vi v d sau:
$ cat << EOF
> Logged in
> EOF > login.time
$ date >> login.time
$cat login.time
Login in
Fri May 19 12:40:15 PDT 2004

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 &
$
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 s ID ca tin trnh sort
quay li ch tng tc:
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

13
$ 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 ~)

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 `date` > 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

1.Hy th vi lnh:
$echo Logged in Fri May 12:52:25 UTC 2004
Kt qu ?
2. Kt hp:
$cat << EOF
> Logged in `date`
> EOF > Login.time (ENTER)
Sau thc hin:
$ cat login.time
Kt qu ?

4. ng dn (Pipelines)
Shll 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), sl i vo (stdin) ca ls l.
V d:
$ (date ; who) | ls -

________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

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

________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

15
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 shell 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
$HOME Cha ni dung ca th mc ch. (Th mc u tin khi ngi
dng ng nhp)
$PATH Cha danh shell 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 user khng phi root.
$SP2 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 shell chui. Bin ny cha
danh shell 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_$$.
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

16
Mi mi trng m uer ng nhp cha mt s danh shell bin mi trng dng cho mc
ch ring. C th xem anh shell 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 shell 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 shell 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 "$*
foo^ bar^bam
$unset IFS
$echo "$*"
foo bar bam
Ta nhn thy, lnh set tip nhnn 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 ^ , $* cha danh
shell cc tham s phn cch bng k t ^ . 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"
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

17
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 scnpt 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 i 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 nhng tp tin lnh script khc. l l do ti sao
chng ta thng s dng lnh exit cui mi scipt 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
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

18
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 th
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
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

19
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 f ile 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.

1 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
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

20
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

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. 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 ca c th 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

________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

21
#!/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:

________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

22
V du: 3-5: elif_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
(s cp phn sau) 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
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

23

$./ 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 barr 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 shell 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) (s c chng
ta tm hiu chi tit hn trong phn sau). Danh shell ca 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.
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

24
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 xut ca scnpt
$./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. H 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 xng. C php ny dng nh gi v
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

25
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 intil

C php ca lnh until nh sau:
until condition
do
statements
done

Lnh until tng t lnh while nhng iu kin kim tra bi 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:1

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:
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

26
Lnh who lc danh shell cc user ng nhp vo h thng, chuyn danh shell 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
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

27
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
bintrong 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
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

28
;;
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 ng
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]*.

3.4. Danh shell thc thi lnh (Lists)

i lc cn kt ni cc lnh li vi nhau thc hin theo th t kim tra trc khi
ra mt quyt nh no , v d, cn kim tra hng lot iu kin phi ng bng if trc
khi in ra thng bo nh sau:
if [-f this_file] ; then
if [- f that_file ] ; then
if [-f other_file ] ; then
echo "All files present, and correct"
fi
fi
fi

Hoc gi mun thc hin lnh khi mt trong cc iu kin l ng
if [-f this_filel]; then
foo="true"
elif [ -f that_file 1 ; then
foo="true"
elif [-f other_file ] ; then
foo="true"
echo some condition are checked"
else
foo="false"
fi
if [ $foo=true ] ; then
echo One of the files exists"
fi

________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

29
Hon ton c th dng if thc hin cc yu cu trn, nhng chng khng thun tin
lm. Shell cung cp mt c php danh shell AND v OR gn hn. Chng thng s dng
chung vi nhau, nhng ta hy tm thi xt chng tch bit d hnh dung.


3.4.1. Danh sch AND (&&)

Danh shell AND cho php thc thi mt chui lnh k nhau, lnh sau ch thc hin
khi lnh trc thc thi v tr v m li thnh cng. C php s dng nh sau:
Statement1 && statement2 && statement3 && . . .
Bt u t bn tri statement1 s thc hin trc, nu tr v true th statement2 tip tc
c gi. Nu statement2 tr v false th shell chm dt danh shell AND ngc li
statement3 s c gi ... Ton t && dng kim tra kt qa tr v ca statement
trc .
Kt qu tr v ca AND s l true nu tt c cc lnh statement u c gi thc
thi. Ngc li l false.
Hy xt v d sau, dng lnh touch file_one ( kim tra file_one tn ti hay cha,
nu cha th to mi) tip n rm file_two. Sau cng danh shell AND s kim tra xem
cc file c ng thi tn ti hay khng a ra thng bo thch hp.

V d 3-14 and_list.sh

#!/bin/sh

touch file_one
rm -f file_two

if [ -f file_one ] && echo "hello" && [ -f file_two ] && echo
"there"
then
echo -e "in if"
else
echo -e "in else"
fi

exit 0

Clhy th script trn bn s nhn c kt qa kt xut nh sau:
$./and_list.sh
hello
in else
Cch chng trnh lm vic: Lnh touch v rm m bo rng file_one tn ti v file_two
khng c. Trong danh shell biu thc if, && s gi lnh [-f file_one ] trc. Lnh ny
thnh cng v touch to sn file_one. Lnh echo tip tc c gi echo lun tr v tr
true nn lnh tip theo
[-f file_two] thi hnh. Do file_two khng tn ti nn echo "there" khng c gi. Ton
b biu thc tr v tr false (v cc lnh trong danh shell khng c thc thi ht). Do if
nhn tr false nn echo trong mnh else ca lnh if c gi.
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

30

3.4.2 Danh schl OR ( || )

Danh shell OR cng tng t vi AND l thc thi mt dy cc lnh, nhng nu
c mt lnh tr v true th vic thc thi ngng li. C php nh sau:
statementl || statement2 || statement3 && . . .
Bt u t bn tri, statementl c gi thc hin, nu statement1 tr v false th
statement2 c gi, nu statement2 tr v true thi biu thc lnh chm t, ngc li
statement3 c gi. Kt qa sau cng ca danh shell OR ch ng (true) khi c mt
trong cc statement tr v true. Nu && gi lnh tip theo khi cc lnh trc true, th
ngc li || gi lnh tip theo khi lnh trc false.

V d 3-14 ca danh shell AND c th sa li thnh OR nh sau:
V du 3-15 or_list.sh

#!/bin/sh

rm -f file_one

if [ -f file_one ] || echo "hello" || echo "there"
then
echo "in if"
else
echo "in else"
fi

exit 0

Kt qa kt xut s l.
$./and_list.sh
hello
in if
Cch chng trnh lm vic: file_one u tin c loi b bo m lnh if tip theo
khng tm thy n. Lnh [ -f file_one ] tr v false v file_one khng tn ti. Lnh echo
tip theo trong chui danh shell OR s c gi in ra hello. Do echo lun tr v true nn
echo tip theo khng c gi. Bi v trong danh shell OR c mt lnh tr v true nn
ton b biu thc s l true. Kt qu cui cng l echo trong if c gi in ra chui in
if.

Lu , danh shell AND v OR s dng thut ton thm nh tt 1 biu thc, c
ngha l ch cn mt lnh sai hoc ng th coi nh ton b biu thc s c cng
chn tr iu ny cho thy khng phi mi biu thc hay lnh ca trong danh
shell AND / OR u c c lng. Hy t cc biu thc hay lnh c u
tin cao v bn tri. Xc sut c lng chng s cao hn cc biu thc hay lnh
nm bn phi.

Kt hp c AND v OR s x l c hu nh mi trng hp logic trong lp trnh. V
d:
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

31

[ -f flle_one] && command_for_true || command_for_false

C php trn bo m rng nu [ -f file_one ] tr v true th command_for_true s c
gi. Ngc li command_for_false s thc thi (mt cch vit ngn gn khc ca if else)

3.4.3. Khi lnh

Trng hp bn mun thc thi mt khi hnh ti ni ch cho php t mt lnh
(nh trong danh shell AND hay OR chng hn) bn c th s dng cp { } bc khi
lnh nh sau:

if [ -f file_one ] && {
ls -l
echo complex block execute"
}
then
echo "command complete"
fi

3.5. Hm (function)

Tng t cc ng trnh khc, shell cho php bn t to hm hay th tc triu
gi bn trong script. Mc d bn c th gi cc script con khc bn trong script chnh,
chng tng t nh vic gi hm. Tuy nhin triu gi cc script con thng tiu tn ti
nguyn v khng hiu qu bng triu gi hm.
nh ngha hm, bn khai bo tn hm tip theo l cp ngoc n ( ) , lnh ca
hm nm trong ngoc nhn { } . C php nh sau:

function_name ( ) {
Statements
}

Hy lm quen vi cch s dng hm bng v d n gin sau:

V d 3-16 my_function.sh

#!/bin/sh

foo() {
echo "Function foo is executing"
}

echo "script starting"
foo
echo "script ended"

exit 0
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

32

Kt qu kt xut khi bn chy script hin th nh sau
$./my_function.sh
script starting
Function foo is executing
script ending

Cch chng trnh lm vic: Shell s bt u thc thi lnh trong script t u n cui,
khi gp foo() ln u, shell s hnh dung foo l mt hm. Shellghi nh ni dung hm v
khng thc thi hm. Shell tip tc b qua ni dung hm cho n cui k t } v thc hin
lnh echo "script starting". Khi gp li foo ln th hai, shell bit l ta mun triu gi hm,
shell quay li thc hin ni dung ca hm foo(). Mt khi chm dt li gi hm, dng lnh
tip theo sau hm s c thc thi. Nh ta thy, cn phi khai bo v nh ngha hm
trc khi s dng v gi n bn trong script. iu ny tng t cch qui nh ca Pascal
v C, tuy nhin shell khng cho php bn khai bo hm kiu ch nu nguyn mu ca
hm (forward), m cha cn inh ngha ni dung chi tit hm.

3.5.1 Bin cc b v bn ton cc

khai bo bin cc b ch c hiu lc bn trong hm, hy dng t kha local.
Nu khng c t kha local, cc bin s c xem l ton cc (global), chng c th tn
ti v lu gi kt qu ngay sau khi hm chm dt. Bin ton cc c nhn thy v c
th thay i bi tt c cc hm trong cng script. Trng hp c bin ton cc nhng
li khai bo bin cc b cng tn, bin cc b s c gi tr u tin v hiu lc cho n khi
hm chm dt.

V d 3-17 function2.sh

#!/bin/sh

sample_text="global variable"

foo() {
local sample_text="local variable"

echo "Function foo is executing"
echo $sample_text
}

echo "script starting"
echo $sample_text

foo

echo "script ended"
echo $sample_text

exit 0

________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

33
Kt qa kt xut
$./function2.sh
script starting
global variable
Function foo is executing
local variable #sample_text is local in function
script ended
global variable #sample_text is global outside the
function

Hm c th tr v mt gi tr. tr v gi tr s, bn c th dng lnh return. V d:

foo( ) {

return 0
}

tr v gi tr chui, bn c th dng lnh echo v chuyn hng ni ung kt xut ca
hm khi gi nh sau:
foo() {
echo "string value"
}
. . .

x= $ ( foo )

Bin x s nhn tr tr v ca hm foo() l "string value". $() l cch ly v ni dung ca
mt lnh. C mt cch khc ly tr tr v ca hm, l s ng bin ton cc (do
bin ton cc vn lu li tr ngay c khi hm chm dt). Cc script trong chng trnh
ng dng cui chng s s dng n k thut ny.

3.6.2. Hm v cch truyn tham s

Shell khng c cch khai bo tham s cho hm nh cch ca C, Pascal hay cc
ngn ng lp trnh thng thng khc. Vic truyn tham s cho hm tng t nh truyn
tham s trn dng lnh. V d truyn tham s cho foo(), ta gi hm nh sau

foo "paraml", "param2", param3 . . .

Vy lm cch no hm nhn v ly v c ni dung i s truyn cho n? Bn trong
hm, ta gi cc bin mi trng $*, $1, $2 ... chng chnh l cc i s truyn vo khi
hm c gi. Lu , ni dung ca $*, $1, $2 do bin mi trng nm gi s c shell
tm thi ct i. Mt khi hm chm dt, cc gi tr c s c khi phc li.

Mc d vy, c mt s shell c trn UNIX khng phc hi tham s mi trng v
gi tr ban u khi hm kt thc. Nu mun bo m, hy nn t lu tr cc bin tham s
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

34
mi trng trc triu gi hm. Tuy nhin cc shell mi v nht l nu ch mun hng
v Linux, th khng cn lo lng iu ny.

Di y l mt v d cho thy cch gi v nhn tr tr v ca hm ng thi x
l i s truyn cho hm c gi.

V d 3-18 get_name.sh

#!/bin/sh

yes_or_no() {
echo "In function parameters are $*"
echo "Param 1 $1 and Param2 $2"
while true
do
echo -n "Enter yes or no"
read x
case "$x" in
y | yes ) return 0;;
n | no ) return 1;;
* ) echo "Answer yes or no"
esac
done
}

echo "Original parameters are $*"

if yes_or_no "Is your name $1?"
then
echo "Hi $1"
elif
echo "Never mind"
fi

exit 0

Kt qu kt xut khi gi lnh nh sau:
$,/get_name.sh HoaBinh SV
Original parameters are HoaBinh SV
In function parameters are Is your name HoaBinh
Param 1 Is your name param 2 HoaBinh
Is your name HoaBinh ?
Enter yes or no : yes
Hi HoaBinh, nice name
Cch lm lm vic: Hm yes_or_no( ) c nh ngha khi script thc thi nhng cha
c gi. Trong mnh if, hm yes_or_no c s dng vi tham s truyn cho ham l
ni dung ca bin mi trng th nht ( v d trn $1 c thay th bng HoaBinh) v
chui Is your name. Bn trong hm ni dung ca $1 v $2 c in ra (Hy l
chng khc vi gi tr $1, $2 ca mi trng shell ban u). Hm yes_or_no xy dng
cu trc case ty theo la chn ca ngi dng m tr v tr 0 hay 1. Khi ngi dng
chn yes, hm tr v gi tr 0 (true). Lnh bn trong if c gi in ra chui "nice
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

35
name".

3.6. Cc lnh ni ti ca shell

Ngoi cc lnh iu khin, shell cn cung cp cho cc lnh ni ti (build-in) khc
rt hu ch. Chng c gi l lnh ni ti bi v khng th thy chng hin hu nh
nhng tp tin thc thi trong mt th mc no trn h thng tp. (C th xem nhng
lnh ny tng t khi nim lnh ni tr ca DOS). Trong qu trnh lp trnh shell, chng
s thng xuyn c s dng.

3.6.1. break

Tng t ngn ng C, shell cung cp lnh break thot khi vng lp for,
while hoc until bt k iu kin thot ca cc lnh ny c din ra hay khng.

V d 3-19: break.sh
#!/bin/sh

rm -rf fred*
echo > fred1
echo > fred2
mkdir fred3
echo > fred4

for file in fred*
do
if [ -d "$file" ]; then
break;
fi
done

echo first directory fred was $file

exit 0

on script trn dng lnh for duyt ton b tn ca tp tin v th mc hin
hnh bt u bng chui fred. Khi pht hin th mc u tin trong danh shell cc tp tin,
s in ra tn th mc v dng break r thot khi vng lp (khng cn duyt tip cc tp
tin khc).
Lnh break thng ngt ngang logic ca chng trnh , v vy nn hn ch dng
break. Lnh break khng c tham s cho php thot kh vng lp hin hnh. Nu t
tham s cho lnh v d, break 2, break 3 chng hn, c th thot khi nhiu vng lp cng
mt lc. Tuy nhin chng s lm cho chng trnh kh theo di. Tt nht ta.nn
dng.break khng tham s.
3.6.2 continue

Lnh continue thng c dng bn trong vng lp, continue yu cu quay li
thc hin bc lp k tip m khng cn thc thi cc khi lnh cn li.

________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

36
V d 3-20 continue.sh

#!/bin/sh

rm -rf fred*
echo > fred1
echo > fred2
mkdir fred3
echo > fred4

for file in fred*
do
if [ -d "$file" ]; then
continue
fi
echo file is $file
done

exit 0

on script trn dng lnh for duyt ton b tn ca tp tin v th mc hin
hnh bt u bng chui fred. Nu kim tra tn tp tin l mt th mc, th continue yu
cu quay li duyt tip file khc. Ngc li lnh echo s in ra tn tp.
continue cn cho php truyn tham s xc nh s ln lp cn quay li.
V d:
for x in 1 2 3 4 5
do
echo before $x
if [ $x = =2 ] ; then
continue 2
fi
echo after $x
done

Kt qu
before 1
after 1
before 2
before 5
after 5

3.6.3. Lnh : (lnh rng)

Lnh : c gi l lnh rng (null command). i lc lnh ny c ng vi
ngha logic l true. Khi dng lnh : thc thi nhanh hn vic so snh true.
Mt s shell c cn s dng lnh : vi ngha ch thch mt dng lnh. Tuy
nhin bt k khi no c th, hy nn dng # thay cho ch thch bng :.
V d: 3-21 colon.sh
#!/bin/sh
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

37

rm -f fred
if [ -f fred ]; then
:
else
echo file fred does not exist
fi

exit 0

Trong on script trn, nu kim tra fred tn ti th khng lm g c, nu khng ta s in ra
thng bo li.

3.6.4. Lnh . (thc thi)

Lnh . dng gi thc thi mt script trong shell hin hnh. iu ny c v hi
l, v ch cn g tn script l script c th t thc thi m khng cn ti . , tuy vy n c
mt ngha c bit: thi hnh v gi nguyn nhng thay i v mi trng m script tc
ng (xem li fork() v exec()).
Thng thng, khi thc thi mt script, shell s bo lu li ton b bin mi trng
hin hnh v to ra mt mi trng mi (hay shell ph - sub shel1) script hot ng.
Mt khi script chm dt bng lnh exit, th ton b thng s mi trng ca shell hin
hnh s c khi phc li.
C php s dng nh sau: . ./shell-script

V d sau s cho thy cch tc ng vo bin mi trng hin hnh bng lnh . .

V du 3-22: dot_command.sh

#!/bin/sh
echo Inside script
PATH=/mypath/bin: /usr/local
echo $PATH
echo Script end

Trc khi chy, hy in ra ni dung ca bin PATH trong shell hin hnh. Tip n chy
do_command.sh bng lnh . v in li kt qu ca PATH nh sau:
$echo $PATH
/usr/bin: usr/lib

$. /dot_command.sh #Khng dng .
Inside script
/mypath/bin : /usr/local
Script end

$echo $PATH
/usr/bin: usr/11b #shell khi phc li mi trng gc

________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

38
By gi chy lnh vi .
$ . ./dot_command.sh
Inside script
/mypath/bin: /usr/local
Script end

$echo $PATH
/mypath/bin: /usr/1ocal #Bo lu thay i do script thc hin

3.6.5. eval

Lnh eval cho php c lng mt biu thc cha bin. Cch d hiu nht l xem
eval lm vic trong v d sau:
foo=10
x=foo
y= $ $x
echo $y
on lnh trn in ra kt qu l chui $foo.
By gi nu bn s dng eval
foo=10
x=foo
eval y= $ $x
echo $y
Kt qu in ra s l 10. L do y = '$' $x s c din dch thnh chui y=$x Lnh eval tip
n s c lng y=$x nh l biu thc gn. Kt qu l y mang gi tr ca ni dung bin
x (10). eval rt hu dng, cho php sinh ra cc on lnh thc thi ng ngay trong qu
trnh script thi hnh.

3.6.6. exec

Lnh exec dng gi mt lnh bn ngoi khc. Thng exec gi mt shell ph
khc vi shell m script ang thc thi.

V d 3-23: exec_demo.sh

#! /bin/sh
echo "Try to execute mc program"
exec mc
echo "you can not see this message !"

on script in ra chui thng bo sau triu gi mc. exec s ch cho chng trnh gi
thc thi xong mi chm dt script hin hnh.
Mc inh exec s triu gi exit khi kt thc lnh. Chnh v vy, nu gi exec ngay t
dng lnh, sau khi lnh thc hin xong, iu khin s thot ra khi shell ph, quay tr v
shell gc, l mn hnh ng nhp.

________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

39
3.6.7. exit n

Lnh exit s thot khi shell no gi n v tr v m trng thi li n. Trc gi ta
vn gi exit 0 bn trong shell ph. Nu gi exit ngay t dng lnh, n s khin thot khi
shell chnh tr v mn hnh ng nhp lun (y cng l cch thng dng thot khi
user hin hnh, ng nhp lm vic di tn user khc).
exit rt hu dng trong cc script, n tr v m li cho bit script c thc thi
thnh cng hay khng. M li 0 c ngha l thnh cng. Cc gi tr t 1-125 script ty
nghi s dng cho nhiu mc ch khc nhau. Cc gi tr cn li c dnh cho mc ch
ring. C th l:
126 file khng th thc thi
127 Lnh khng tm thy
Ln hn 128 nhn c tn hiu (signal) pht sinh
S dng 0 l gi tr thnh cng c th gy lm ln cho mt s lp trnh vin C ( 0
c coi l false cn khc 0 l true). Tuy nhin bng cch ny, u im l c th tn
dng cc gi tr khc 0 lm m qui nh li, khng cn phi dng thm bin ton cc
lu gi m li tr v.
V d n gin v exit di ay kim tra xem tp .profile c tn ti hay khng,
nu c tr li 0, cn khng tr v 1.

V d 3-24 test_exits.sh

#!/bin/sh
if [ -f .profile ] ; then
exit 0
fi
exit 1

Nu mun, c th i lnh if sang cu trc danh sch lnh && hay || nh sau:
[ -f .profile ] && exit 0 || exit 1

3.6.8. export

Khi bt u thc thi mt shell, cc bin mi trng u c lu li. Khi c khai
bo v s dng bin trong mt script, n ch c gi tr i vi shell ph gi script .
bin c th thy c tt c cc script trong shelll ph hay cc script gi t shell khc,
hy dng lnh export. Lnh export c tc dng nh khai bo bin ton cc. V d sau s
cho thy cch s dng export.

V d 3-25 export2.sh

#! /bin/sh
echo "Value : $foo
echo "Value : $bar"


V d 3-26 export1.sh #xut bin ra ton cc
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

40

#! /bin/sh
foo="This is foo"
export bar = This is bar"

Chy lnh, xut bin bar ra
$./export2.sh
Kt qu khi gi export1.sh l
$./export1.sh
Value :
Value: This is bar

Dng u cho kt qu bin $foo rng v foo khng c khai bo ton cc t export1.sh,
nn export2.sh khng thy c bin. Dng th 2 cho kt qu l ni dung ca bin $bar
do bt c khai bo bng export. Bin bar tr nn ton cc v cc script khc nhn thy
bar.

Nu mun tt c cc bin mc nh l ton cc trong tt c cc script, c th gi
lnh set a hay set-allexport trc khi thit lp ni dung cho bin.

3.6.9 Lnh expr

Lnh expr tnh cc i u vo nh mt biu thc. Thng expr c dng trng
vic tnh ton cc kt qa ton hc khi i gi tr t chui sang s. V d :
x= 12"
x= `expr $x + 1`

Kt qu x=13. Lu , cp du bc biu thc expr khng phi l du nhy n (K t
ny l phm nm di phm ESC v bn tri phm 1, chung vi phm ~. Cc ton hng v
ton t phi cch nhau bng khong trng. y $x v 1 cch k t + khong trng. Nu
chng st nhau, khi din dch shell s bo li biu thc.
Di y l mt s biu thc c lng m expr cho php:

Biu thc ngha

axprl | expr2 Kt qu l expr1 nu expr1 khc 0 ngc li l
expr2
axprl & expr2 0 nu mt trong hai biu thc l zero ngc li kt
qu l expr1
exprl = expr2 Bng
exprl >expr2 Ln hn
exprl >= expr2 Ln hn hay bng
exprl < expr2 B hn
exprl <= expr2 B hn hay bng
exprl != expr2 khng bng
exprl + expr2 Cng
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

41
exprl - expr2 Tr
exprl * expr2 Nhn
exprl / expr2 Chia
exprl % expr2 Modulo (ly s d)

Trong cc shell mi sau ny lnh expr c thay th bng c php $ ( (. . . ) )
hiu qu hn, v s cp c php ny phn sau.

3.6.10. printf

Lnh printf ca shell tng t printf ca th vin C. Mc d vy, c bn printf
ca shell c mt s hn ch sau: khng h tr nh dng s c du chm ng (float) bi
v tt c cc tnh ton ca shell u da trn s nguyn. Du s \ dng ch nh cc hin
th c bit trong chui (xem bng di). Du % dng nh dng s v kt xut chui.
Di y l danh sch cc k t c bit c th dng vi du \, chng c l chui
thot.

Chui thot (escape sequence) ngha
\\ Cho php hin th k t \ trong chui
\a Pht ling chung (beep)
\b Xa backspace
\f y dng
\n Sang dng mi
\r V u dng
\t Cn tab ngang
\v cn tab dc
\ooo K t n vi m l ooo

nh dng s v chui bng k t % bao gm

K t nh dng ngha
d S nguyn
c K t
s chui
% hin th k hiu %

Di y l mt s v d v printf
$ printf "Your name %s. It is nice to meet you \n" NV An
Your name NV An. It's nice to meet you .

$ printf %s %d\t %s Hi There" 15 "people"
Hi There 15 people
Cc tham s ca lnh printf cch nhau bng khong trng. Chnh v vy nn dng du
bc cc tham s chui. Lnh printf thng c dng thay th echo, mc ch in
chui khng sang dng mi. printf ch sang dng mi khi thm vo chui thot "\n".

________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

42
3.6.11 return

Lnh return dng tr v gi tr ca hm. Lnh return khng tham s s tr v
m li ca lnh va thc hin sau cng.

3.6.12 set

Trc ht, lnh set dng p t gi tr cho cc tham s mi trng nh $1, $2,
$3 ... Lnh set s loi b nhng khong trng khng cn thit v t ni dung ca chui
truyn cho n vo cc bin tham s. V d:
$ set This is parameter
$echo $ 1
This
$echo $3
parameter

Thot nhn lnh set khng my ch li nhng n s v cng mnh m nu bn bit cch
s dng.

V d lnh date ca linux pht sinh chui sau:
$da te
Fri March 13 16:06: 6 EST 2001

Nu ch mun ly v ngy, thng hoc nm th sao? set s thc hin iu ny theo v d
sau:


V du 3-27 set_use.sh

#!bin/sh
echo Current date is $(date)
set $(date)
echo The month is $2
echo The year is $6
exit 0

Kt qu kt xut
$./set_use.sh
Current date Fri March 13 16:06:16 EST 2001
The month is March
The year is 2001

Lnh set cn c dng t cc thng s thit lp cho shell. V d nh khi ni
v lnh export, ta lm quen vi set -a hoc set allexport, cho php shell khai bo
bin ton cc cho mt bin trong script. Khi tm hiu v cch d li ca shell phn sau,
s c thng s y hn v cc thit lp ca set.
Trong v d trn hy lm quen vi c php lnh $( ) . Lnh ny nhn kt qu tr
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

43
v ca mt lnh dng lm danh sch bin. Chng s c nu chi tit hn mc sau.

3.6.13. shift

Lnh shift di chuyn ni dung tt c cc tham s mi trng $1, $2 ... xung mt
v tr. Bi v hu nh ta ch c ti a 9 tham s t $1. $2. $9, cho nn nu cc shell cn
nhn t 10 tham s tr ln th sao? Lnh shift dng gii quyt vn ny.

Nu gi $10 shell thng hiu l $1 v '0'.

V d di y s in ra ni dung ca tt c cc tham s truyn cho script. S tham s c
th ln hn 10.

V d 3-28 using_shift.sh

#!/bin/sh

while [ "$1" != "" ]; do
echo "$1"
shift
done
exit 0

Kt qu kt xut
$./using_shift.sh here is a long parameter with 1 2 3 4 5

here
is
a
long
parameter
. . .
5
6
Cch chng trnh lm vic:.
Chng trnh tip nhn v in ra tham s dng lnh ch bng bin $1. Mi ln nhn
c ni dung ca bin, ta dch chuyn cc tham s v tri mt v tr, bng cch ny bin
$2 chuyn cho $1, $3 chuyn cho $2 ... vng lp while kim tra cho n khi no $1 bng
rng, c ngha l khng cn tham s no nhn na th dng li.

3.6.14. trap

Lnh trap dng by mt tn hiu (signal) do h thng gi n cho shell trong
qu trnh thc thi script. Tn hiu thng l mt thng ip ca h thng gi n chng
trnh yu cu hay thng bo v cng vic no m h thng s thc hin. V d INT
thng c gi khi ngi dng nhn Ctrl-C ngt chng trnh. TERM l tn hiu khi
h thng shutdown ... Chng ta s i su vo c ch ca vic gi/nhn v x l tn hiu
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

44
gia chng trnh v h thng trong phn sau.
Vi trap trong script, ta n v x l mt s tn hiu thng xy ra sau y:

Tn hiu (signal) ngha

HUP (1) Hang-up. nhn c khi ngi dng logout.
INT ( 2 ) Interrupt. Tn hiu ngt c gi khi ngi dng
nhn Ctrl-C.
QUIT ( 3 ) Tn hiu thot, nhn khi ngi dng nhn Ctrl-C
ABRT ( 6 ) Abort - Tn hiu chm dt, nhn khi t thi gian
qu hn (Timeout)
ALRM (14) Alarm -Tn hiu thng bo c ng x l cho
tnh hung timeout
TERM (15) Terminate - Tn hiu nhn c khi h thng yu
cu shutdown.
Tn hiu l cc hng c nh ngha trong tp tin signal.h. s dng cc hng ny
trong cc chng trnh C, bn c th dng #include <signal.h>. Mun bit chi tit hn,
bn c th dng ngay lnh trap -l nh sau
$ trap -l
1) SIGHUP 2) SIGIN 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE
Bn trong script trap c s ng theo c php sau:
trap command signal
Khi tn hiu signal xy ra th command s c gi thc thi bt k chng trnh ang
dng lnh no. Do script thng c din dch lnh theo th t t trn xung di nn
by trap thng t ngay u script.
gii tr hoc v hiu ho lnh trap trc , hy thay command bng - .
Mun t trap nhng khng cn x l tn hiu nhn c, t command bng chui .
Lnh trap khng tham s s hin th danh sch cc tn hiu do script t by nu c.
Di y l mt v d minh ha v cch s dng trap trong script

V d 3-29 use_trap.sh

#!/bin/sh

trap 'rm -f /tmp/my_tmp_file_$$' INT #t by
echo creating file /tmp/my_tmp_file_$$
date > /tmp/my_tmp_file_$$

echo "Press interrupt (Ctrl-C) to interrupt...."
while [ -f /tmp/my_tmp_file_$$ ]; do
echo File exists
sleep 1
done
echo The file no longer exists

# B trap i vi INT
trap INT #gii tr by
echo creating file /tmp/my_tmp_file_$$
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

45
date > /tmp/my_tmp_file_$$

echo "Press interrupt (Ctrl-C) to interrupt...."
while [ -f /tmp/my_tmp_file_$$ ]; do
echo File exists
sleep 1
done

echo We never get here
exit 0


Kt xut ca chng trnh :
$./use_trap.sh
Creating file /tmp/my_tmp_file_131
Press interrupt (Ctrl-c) to interrupt. . . .
File exists
File exists
File exists
The file no longer exists
creating file /tmp/my_tmp_file_131
File exists
File exists
File exists
Cch chng trnh lm vic
Vo u script ta t by trap, yu cu khi nhn c tn hiu INT (ngi dng nhn
Ctrl-c) th thc hin: xa tp tm bng lnh rm f /mp/my_tmp_file_$$ , lu lnh
yu cu trap thc hin lnh, nn t lnh o trong du nhy n. $$ chnh l bin mi
trng tr v s id ca tin trnh shell. S ny l s duy nht c dng ghp lm tn
tp tm. Lnh date > /tmp/my_tmp_file_$$ s a ni dung ngy gi hin hnh vo tp
tm. Tip theo, vng lp while c gi v lp lin tc kim tra s tn ti ca tp tm.
Mi ln lp, chng trnh in ra chui thng bo File exists. By gi nu ta nhn Ctrl-c,
iu g s xy ra ? Thng thng chng trnh s chm dt, tuy nhin do lnh by trap
INT c t, cho nn khi Ctrl-C c nhn, tn hiu INT c gi n shell
ang chy script. Lnh rm c gi xa file tm. Chng trnh trong trng hp ny
vn tip tc hot ng. Tuy nhin khi vng lp while khng tm thy file tm na, n s
thot ra ngoi. Lnh k tip l trap -INT c dng xa by trc . Chng ta to li
flle tm v bc vo vng lp kim tra s tn ti ca tp ny. Trong lc ny nu nhn
Ctrl-C, chng trnh s ngt ngang, v by INT khng cn hiu lc na, ngha cu Ctrl-
C s l x l mc nh ca H iu hnh, tc chm dt shell khi ngi dng nhn Ctrl-C,
do vy lnh echo v exit sau cng s khng bao gi c gi n.

3.6.15. unset

Lnh unset dng loi b bin khi mi trng shell. V d:
#!/bin/sh
foo="Hello World"
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

46
echo $foo
unset foo
echo $foo
u tin e cho s in ra chui Hello World, sau lnh unset echo s in ra chui rng. L do,
bin foo khng cn tn ti na.
C th gn chui rng cho foo theo cch foo = . Tuy nhin foo bng rng v foo b loi
khi mi trng l khc nhau. i vi DOS, bin mi trng bng rng cng ng ngha
vi vic lai bin ra khi mi trng, cn Linux th khng. (unset khng thng c
s dng lm).

3.7. Ly v kt qu ca mt lnh

Khi vit lnh cho script chng ta thng c nhu cu ly v kt xut hay kt qu
ca mt lnh dng cho lnh tip theo. V d, ta gi thc thi mt lnh v mun ly kt
qu tr v ca lnh lm ni ung lu tr vo bin. Ta c th lm iu ny da vo lnh c
c php $(command) (chng ta gp v d khi minh ha lnh set). C php ny cn
c th dng dng khc l `command (lu v du nhy ` l phm nm chung vi k t
~ ch khng phi l nhy n thng thng, du ny c gi l du bao ngc -
backquote).
Kt qa ca $(command) n gin ch l kt xut ca command. N khng phi
l m li tr v ca lnh.

V d 3-30 use_command.sh

#!/bin/sh
echo Current directory is $PWD
echo It contents $(ls a) files
exit 0

Nu ang th mc /root v th mc ny c cc the .bash_profile, use_command.sh, th
kt qu kt xut s nh sau:
$./use_command.sh
Current directory is /root
It contents $ (ls -a) .bash_profile use_command.sh files.
Cch chng trnh lm vic
Lnh ls -a dng lit k ni dung th mc /root. Kt qu tr v c t trong $ ( )
s c din dch thnh ni dung:
$ (ls -a), ch kt qu: $ ( .bash_profile use_conunand.sh)
Ni dung bn trong $ ( ) c xem l mt chui bin thng thng sau khi lnh ls
-a thc thi. Thc t lnh $ ( ) rt mnh v s dng kh ph bin trong lp trnh shel1 cho
Linux. Ta c th ly kt qu ca $ ( ) lm i s truyn tip cho cc lnh khc. Hy xem
li v d v set phn trn.

3.7.1. c lng ton hc

Trc y thy cch c lng biu thc bng lnh expr (xem mc 3-6.9) tuy
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

47
nhin expr thng thc thi chm v khng hiu qu. Cc shell mi cung cp c php
$((...)) dng c lng biu thc bn trong (...) thay cho lnh expr. V d n gin cho
thy cch s dng c php ny nh sau:

V d: 3-31 evaluate.sh

#!/bin/sh
x=0
while [ $x ne 10 ] ; do
echo $x
x=$(($x + 1))
done
exit 0

on lnh trn s lin tc in ra 10 s nguyn. Chng ta tng gi tr x bng php tnh cng
thng qua lnh c lng $ ( ( . . . ) ) .

3.7.2. M rng tham s

Hnh nh shel1 khng cung cp cu trc mng ? ng vy, nhng c mt cch
khc cng tng t c th s dng, l vic thay th tn bin, cn gi l m rng tham
s.
Hy xt v d sau:
#!/bin/sh
l_tmp ="Hello"
2_tmp="There"
3_tmp=:"World"
for i in 1 2 3
do
echo $i_tmp
done

Ta c 3 bin 1_tmp, 2_tmp, 3_tmp, vng lp for trong script d nh ch dng mt lnh
echo in ra ni dung ca c 3 bin mt cch tun t. Th nhng kt qu kt xut tri li,
s nhn c 3 chui rng. Hin nhin ! bi v lnh echo $i_tmp in ra ni dung ca bin
mang tn i_tmp ch khng phi 1_tmp hay 2_tmp nh ta mong mun. Do i_tmp cha c,
nn kt qa l nhng dng trng c in ra.
Shell cung cp c php { } bc cc phn ca bin m ta mun thay th. Lnh
for gi y c th hiu chnh li chy nh mong mun theo cch sau:
for i in 1 2 3
do
echo ${i}_tmp
done
Kt qa khi duyt for lnh echo s thay th ${i} bng 1, 2 v 3 , kt qa echo cho in ra
ni dung ca 3 bin 1_tmp, 2_tmp v 3_tmp.
Shell cho rt nhiu cch thay th tham s khc nhau. Thc s th thay th tham s
l cng c rt mnh v dng rt nhiu trong cc script chuyn nghip. Di y l bng
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

48
trnh by mt s phng php m rng v thay th tham s rt hu ch.

M rng ngha

${param:-default} Nu gi tr ca param=null th gn tr mi l default
${#param} Tr v chiu i ca param.
${param%word} Bt u t cui chui param loi b chui con ngn
nht ca param so khp vi chui word. Tr v kt
qu l chui cn li .
${param%%wrd} Bt u t cui chui param loi b chui con di
nht ca param so khp vi chui word. Tr v kt
qu l chui cn li.
$({param#word} Bt u t u chui param loi b chui con nn
nht ca param so khp vi chui word. Tr v kt
qu l chui cn li.
${param##word} Bt u t u chui param loi b chui con di
nht ca param so khp vi chui word. Tr v kt
qu l chui cn li.

Vic thay th chui trong tham s c bit hu dng trong trng hp x l tn ng
dn, tp tin, th mc nh trong v d sau:

V du 3-32 param_expansion.sh

#!/bin/sh

unset foo
echo ${foo:-bar}

foo=fud
echo ${foo:-bar}

foo=/usr/bin/X11/startx
echo ${foo#*/}
echo ${foo##*/}

bar=/usr/local/etc/local/networks
echo ${bar%local*}
echo ${bar%%local*}

exit 0

Kt xut s l
$./param_expansion.sh
bar
fud
usr/bin/X11/startx
startx
/usr/local/etc
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

49
/usr
Cch chng trnh lm vic:
Lnh u tin ${foo:-bar} gn tr bar cho bin foo bi hin ti foo ang l rng
vo lc thc thi lnh. Tuy nhin sau khi gn foo=fud th lnh ${foo:-bar} khng lm thay
i tr ca foo.

Ta c th c mt vi cch m rng sau:
${foo:=bar} s tr v tr bar nu foo tn ti trc v foo ang cha tr khc
rng. Ngc li tr tr v s l bar v ni dung bar cng s c gn cho foo.
${foo:?bar} s in ra foo: bar v chm dt lnh thc thi nu bin foo cha tn ti
hoc foo ang l rng.
Cui cng, ${foo:+barr} tr v tr bar nu foo tn ti v khc rng.

Lnh {foo#*/ } so khp v ch loi b k t / bn tri ca bin chui (* mang
ngha i din, n c th dng so khp mt hoc nhiu k t).
Lnh {foo##* /} so khp v loi b cng nhiu k t cng tt, vic loi b bt u
t bn phi i vi tt c k t ng trc du / sau cng.
Lnh echo ${bar%local*} so khp v loi b cc k t bt u t bn phi cho
n khi gp chui local u tin xut hin.
Ngc li echo ${bar%%local*} s c gng loi b cng nhiu k t cng tt
cho n khi gp chui local sau cng.
Mt v d khc cho thy cch s dng thay th chui trong tham s rt hu dng
nh sau:
cjpeg l chng trnh chuyn nh ,gif thnh nh .jpg. cpeg c s dng nh sau:
$cjpeg image.gif > image.jpg
Nu mun chuyn ng lot tt c cc flle *.gif trong th mc thnh *.jpg th sao. Hy
dng script sau:

V du 3-33 giftojpg.sh

#!/bin/sh

for image in *.gif
do
cjpeg $image > ${image%%gif}jpg
done

3.8. Ti liu Here

UNIX v Linux cung cp c ch t ng ha m phng vic nhp liu g vo t
bn phm bng ti liu here (Here Document). Ta sn cc phm hay chui cn g trong
mt tp tin v chuyn hng tp tin ny cho lnh cn thc thi. N s tip nhn v c ni
dung tp tin nh nhng g g vo t bn phm.
V d, khi g lnh cat, n s ch nhp d liu g vo t bn phm. Nu khi script
thc thi khng c mt ngi dng th sao? Qu trnh t ng ca script s dng li
ch n khi ta xut hin g d liu vo. C ch ti liu here gip thc hin t ng
nhp liu nh sau:
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

50

V d 3-34 cat_here.sh

#! /bin/sh

cat > test.txt <<!YOURLABEL!
Hello
This is
here document
!YOURLABEL!

Kt qa khi thc thi cat_here.sh, tp test.txt c to ra. Vi ni dung l chui
Hello This is ... ta khng cn phi dng tay nhp liu cho lnh cat.
Ti liu here yu cu t c php gia nhn bt u v nhn kt thc. Trong v
d trn, nhn bt u l !YOURLABEL! (lu n k t << u dng cho bit ni
bt u ca ti liu Here), nhn kt thc l !YOURLABEL!. Du ! hai bn nhn
YOURLABEL ch d dng nhn ra nhn m thi, trong trng hp ni dung d liu
ca c chui YOURLABEL th cp ! ! cng dng phn bit ring tn nhn ca ngi
dng.
C th dng hng lot lnh echo chuyn hng kt xut ra file. Tuy nhin ti
liu here hu dng v tin li hn. Here khng n thun ch chuyn nhp liu ra file, n
cung cp kh nng tng tc vi chnh chng trnh ng dng. V d, khi cn son tho
vn bn bng lnh ed, cc thao tc cn lm l g ed t dng lnh hin ca s son
tho. Nhp vo d liu vn bn thc hin chnh sa, xa, sau chm dt, ng mn
hnh son tho tr v du nhc. Thc hin vi ti liu here ta s lm nh sau:
Hy to tp tin a_text_flle.txt c ni dung
This is line 1
This is line 2
This is line 3
This is line 4
script auto_edit.sh di y s m trnh ed v loi b dng 3 trong tp vn bn va to,
thay i v chnh sa ni dung dng 4.

V d 3-35 auto_edit.sh

#!/bin/sh .

ed a_text_file << !AutoEdit!
3
d
.,\$s/is/was
w
q
!AutoEdit!

Kt qa kt xut l ni dung a_text_flle.txt s b i thnh
This s line 1
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

51
This is line 2
This was line 4

Cch chng trnh lm vic
Sau khi chuyn ni dung tp cho ed bng lnh ed a_text_file.txt ni dung nm
gia cp nhn !AutoEdit! i din cho cc k t g vo t bn phm. Hy lu \$s c
dng yu cu shell din dch y l chui $s (mt lnh tm kim ca ed) ch khng
phi bin mang tn s.

4. D LI (DEBUG) CA SCRIPT

V scipt ch l lnh vn bn c shell thng ch, cho nn vic d li khng kh
nh cc chng trnh bin dch nh phn. Mc d vy khng c cng c hay trnh tr gip
no c bit gip thc hin cng vic ny. Di y l tng hp mt s phng thc d
li ca script thng dng.
Khi mt li xut hin, shell thng in ra s th t ca dng gy li. Ta c th
thm vo lnh echo in ra ni dung ca cc bin c kh nng gy li cho chng trnh,
cng c th kim tra ngay cc on m trc tip trn dng lnh xem cch thc lnh
hot ng thc t c c shell chp nhn hay khng.
Cch ch yu v hay nht l hy cho shell t thc hin cng vic bt li bng
cch dng lnh set t mt s ty chn cho shell hoc t thm tham s khi gi shell thc
thi script nh sau:
Tham s dng Ty chn ngha
lnh cho shell

sh -n <script> set o noexec Ch kim tra c php khng thc thi
lnh
set -n
sh -v <script> set -o verbose Hin th lnh trc khi thc hin
s -v
sh x set -o xtrace Hin th lnh sau khi thc thi lnh
set -x
set -o nounset Hin th thng bo li khi mt bin
set u s dng nhng cha c nh
ngha.
Lnh set cho php dng kha chuyn -o v +o bt tt c ty chn.
Cng c th dng lnh trap by tn hiu thot EXIT v in ra ni dung ca mt bin
no . V d:
trap 'echo exiting : error variable = $problem_var' EXIT.


5. HIN TH MU SC (COLOR)

Khi bt u quen vi lp trnh trn Linux, phn tip theo s l vn v mu
sc. n gin ngn ng lp trnh script ch cung cp lnh echo hay printf in mt chui
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

52
ra mn hnh console trng en m thi. Lp trnh lin quan n mu sc phi s dng n
ngn ng bin dch nh C/c++ chng ? Khng hn th, vi script, ngi lp trnh c th
hin th mi sc mu m card mn hnh v my tnh h tr.

5.1. Mu ch

Hy n lnh ls khi s dng Linux. ls c th lit k tn th mc vi rt nhiu mu
sc bt mt, v d cc tp tin thc thi c hin th bng mu xanh l cy, tp tin nn l
mu , tp thng thng l mu trng, tn tp nh nh *.gif hay *.jpg l mu hng ...
Khng ch c lnh ls, lnh echo cng c th thc hin c iu ny. n gin ch cn
thm vo chui kt xut ca lnh echo k hiu iu khin escape cng vi s hiu ca
mu mun th hin cho chui trn mn hnh. Hy th g chui sau t dng lnh:
$echo -e " \033 [35m Hello Color ~033 [0m"
Kt qu ? Chui Hello Color xut hin vi mu hng. iu ny l do m iu khin
escape\033 thc hin. M ny tng ng vi chui ^[ hay s hexa 0x1B. Khi Linux
x l lnh v nhn c chui iu khin ny, n s xem cc k t chui theo sau l mt
dy lnh iu khin. Nhng lnh ny c th lm c rt nhiu chuyn. y ta c th
li dng, yu cu Linux x l mu sc ca chui vn bn kt xut bng lnh [m tip
theo. S 32 trc m th hin mu ch. Cc k t theo sau m l vn bn s kt xut. Nu
mun khi phc v trng thi mu ban u, dng chui [0m. Do vy trong lnh:
$echo -e \033[35mHello Color \033 [0m
Cch din gii nh sau: hy thc hin lnh (\033) in chui mu hng ([35m) ni dung
chui l Hello Color, sau hy khi phc tr li mu ban u [0m. Nu khng khi
phc v trng thi mu trc th c th mt s lnh chun sau s kt xut vi cng
mu ch m nh.
V d:
$echo -e \033 [32m This is green text"
$echo -e And this
$echo -e " \033[0m Now we are back to normal.
Nu mun, c th in cc mu phi hp vi nhau trong cng mt chui ca dng nh v
d sau:
$echo - e "\033[032m Green text \033[34m and Blue "
Chui iu khin escape khng ch gii hn dng trong script, hm printf ca C cng c
th thc hin c iu ny. Nu mun hin th mu sc ra mn hnh console n gin
khng cn dng thm th vin no c, trong C c th vit:
printf (l\033[34m This is blue . \033 [0m\n" );
Hay trong Perl:
Printf \033[34m This is blue. \033 [0m\n" ;

Mt s mu ch chun c th s dng c lit k trong bn sau:
M iu khin Mu
30 en
31
32 Xanh l cy
33 Nu
34 Xanh nc bin
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

53
35 Hng
36 Xanh da tri
37 Xm

V d sau s in ra mt lot cc mu tham kho

for color in 30 31 32 33 34 35 36 37
echo -e "\033 [$Colorm This is color text"
done
echo -e "\033 [0m"

5.2. Thuc tnh vn bn

Cn c th kt hp cc thuc tnh cho php ch m (bold) hay nhp nhy (blink)
vi nhau. Cc thuc tnh kt hp c t cch nhau bng u chm phy (;).
V d lnh sau s in ra chui m mu nu:

$echo -e "\033[33;1m This is bold ana red text \033[0m"

i vi mn hnh EG thng thuc tnh bold lm cho ch chuyn sang mu sng. V d
nh mu nu s chuyn sang mu vng, mu xm s chuyn sang sng trng. Mt vi
thuc tnh khc kh thng dng nh: 0 t v thuc tnh bnh thng, 5 t thuc tnh
nhp nhy, 7 o mu, 25 tt mu nhp nhy ...

5.3. Mu nn

C th t mu nn cho chui kt xut thay cho nn en ca mn hnh console. V d, t
ch trn nn trng nh sau:
$echo -e \033 [47 ; 31m Red on white. \033 [Om"
y t mu nn v mu ch cch nhau bng du chm phy (;). Di y l danh sch
cc mu nn s dng hu ht trn cc mn hnh console
M iu khin Mu
40 en
41
42 Xanh l cy
43 Nu
44 Xanh nc bin
45 Hng
46 Xanh da tri
47 Trng
V d

$echo -e \033 [46;37 Gray blue \033 [47;30 Black and white"


________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

54
6. KT CHNG

Chng gii thiu cc k thut c bn cch lp trnh shell, mt th mnh truyn
thng ca UNIX/Linux. Lm quen vi lp trnh shell l lm quen vi cng c qun tr h
thng, m cc nh chuyn nghip hay s dng, trong khi kt hp vi cc tin ch to ra t
C/C++ hay Perl, PHP C th ni lp trnh shell l khng th thiu c khi s dng
UNIX/Linux. Ti liu ny ch nh phn do u, c th tm hiu su cc sch chuyn
cho shell trong mi trng UNIX.


7. MT S TM TT v V D
tin thc hnh, di y ta quy c s s dng shell mc nh ca Linux l
bash (Bourne Again Shell). Nh tn ca n ni r bash rt ging Bourne shell
ca UNIX, du nhc cng l $ nn khng cn vit li y na.
7.1 To v chy cc chng trnh shell
Ni mt cch n gin nht, cc chng trnh shell ch l cc tp cha mt hoc
nhiu cu lnh ca shell hoc ca h thng, k c trnh ng dng. Cc tp ny cn
c gi l cc tp kch bn (script) v vic vit cc chng trnh shell cn c
gi l vit kch bn (scripting). Cc chng trnh shell thng c dng :
-lm n gin ho cc tc v lp i lp li
-thay th mt hoc nhiu cu lnh lun lun c thc hin cng nhau bng
mt cu lnh duy nht
-t ng ho qu trnh ci t
-vit mt ng dng tng tc n gin
7.1.1 To mt chng trnh shell
V d, c mt CD-ROM c mount trn h Linux ca ta v gi s ta ang c
d liu t mt a CD nm trong . Nu mun i a CD khc, ta phi lm cho
Linux c ni dung th mc ca a CD mi bng cch: u tin unmount CD-
ROM bng lnh umount ly a CD c ra; sau a a mi vo v mount a
bng lnh mount. Chui lnh nh sau:
umount /dev/cdrom
mount t iso1960 /dev/cdrom /cdrom
Thay v phi g c hai cu lnh ny mi khi ta mun thay i a CD, ta c th to
ra mt chng trnh shell nh sau:
-to ra mt tp text bng mt trnh son tho vn bn (vi, emacs...)
-g hai dng lnh trn vo tp
-ghi (save) v t tn tp l remount (hoc bt c tn no m ta mun)
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

55
7.1.2 Chy chng trnh shell
C mt vi cch thc hin cc lnh lin quan n tp v d trn (remount).
a. Cch th nht
Lm cho tp c thuc tnh executable (kh thi) bng cu lnh sau:
chmod +x remount
Lnh ny i thuc tnh ca tp sao cho n tr nn kh thi. V vy, sau ch cn
g vo dng lnh tn tp:
remount
chy chng trnh shell mi ny ca ta.
Lu 1:
Chng trnh shell remount phi nm trong th mc c trong ng dn
tm kim (search path), nu khng th shell khng th tm ra chng trnh
ny thc thi n.
Lu 2:
Dng u tin ca mt tp kch bn thng bt u bi hai k t #! v theo
sau l tn ca chng trnh thng dch (interpret) ni dung ca tp. V d
nu dng u tin l #!/bin/bash th ni dung ca tp kch bn c
thc hin nh mt chng trnh shell ca bash.
b. Cch th hai
Nu chng trnh ca ta c vit cho shell no th hy chy shell vi tham s
l tn tp chng trnh.
V d, chng trnh remount c vit cho shell tcsh, v vy chy n hy g :
tcsh remount
Cu lnh trn khi ng mt shell mi (tcsh) v bt n thc hin cc cu lnh c
trong tp remount.
c. Cch th ba
i vi cc shell pdksh v bash, hy thc hin cu lnh . vi tham s l tn ca
chng trnh shell:
. remount
Cu lnh . bt shell hin hnh (pdksh hoc bash) thc hin cc cu lnh c trong
remount.
Tng t, i vi shell tcsh, cu lnh . c thay th bi cu lnh source :
source remount
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

56
7.2 S dng bin
Ging nh cc ngn ng my tnh khc, vic s dng cc bin (variable) trong lp
trnh shell rt quan trng. Trong cc bi trc chng ta lm quen vi mt s
bin mi trng nh PATH v PS1.
7.2.1 Gn mt gi tr cho bin
i vi shell pdksh v bash, gn gi tr cho mt bin, ta g tn ca bin theo
sau l mt du bng (=) v gi tr m ta mun gn cho bin. V d:
bien=5
Vi shell tcsh, gn gi tr cho bin ta thm t set nh sau:
set bien = 5
Lu :
i vi bash v pdksh, c php gn khng chp nhn cc k t trng (space)
pha trc v sau du bng, cn vi tcsh th trc v sau du bng c th c
k t trng hoc khng.
Khng ging cc ngn ng lp trnh nh C hoc Pascal, ta khng phi khai bo
cc bin trong shell. V bin shell khng c kiu (type) xc nh, ta c th dng
mt bin gn mt gi tr nguyn (integer) sau li gn cho bin mt gi tr
chui (string). V d, sau khi gn bin bien bng mt gi tr s (5) nh trong v d
trn ta c th tip tc gn nh sau:
bien=Linux (pdksh hoc bash)
set bien = Linux (tcsh)
7.2.2 Truy nhp gi tr ca mt bin
Sau khi gn gi tr cho bin, truy nhp gi tr ca bin trong chng trnh
shell, hy thm du la ($) vo pha trc tn ca bin.
Tn ca bin trong cc v d trn l bien, cn gi tr m bin mang l $bien (l
chui Linux). in gi tr ra mn hnh ta c th s dng lnh echo nh sau:
echo $bien
Lu :
Nu b qua du la trong cu lnh trn (thnh echo bien), shell hiu bien
l mt chui v s in chui ra mn hnh (ch khng phi chui Linux).
7.2.3 Tham s v tr v bin xy dng sn trong shell
Ta c th truyn cc tham s cho chng trnh shell qua dng lnh. V d, dng
lnh sau:
remount thamso1 thamso2
cng thc hin chng trnh shell remount nhng c thm hai tham s dng lnh
(cn gi l tu chn dng lnh) l thamso1 v thamso2.
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

57
Khi ta chy mt chng trnh shell c h tr cc tu chn dng lnh nh trn th
mi tu chn c lu vo trong mt tham s v tr (positional parameter). Tham
s u tin c lu vo mt bin c tn l 1, tham s th hai c lu vo bin
c tn l 2... Cc shell hin thi c th h tr n 9 bin nh vy. truy nhp vo
cc bin ny ta cng thm k t la vo trc tn bin (v d $1, $2,..).
Chng trnh shell sau nhn vo hai tu chn dng lnh v in ra mn hnh tu
chn th hai trc ri mi in tham s th nht sau:
# Chuong trinh in dao nguoc
echo "$2" "$1"
Nu ta thc hin chng trnh ny ( t tn l daonguoc) trn dng lnh nh sau:
daonguoc CHAO BAN
th trn mn hnh s xut hin :
BAN CHAO
Cc bin c bit $1, $2,... cn gi l cc bin shell xy dng sn (built-in shell
variable). Cn mt s bin shell xy dng sn khc rt quan trng trong lp trnh
shell. Bng sau y lit k cc bin ny.
Bng 1. Cc bin shell xy dng sn
Bin Cch dng
$#
Lu gi s lng cc tham s dng lnh c truyn cho chng trnh
shell
$?
Lu gi gi tr tr v (exit code) ca cu lnh thc hin sau cng
$0
Lu gi t (word) u tin ca dng lnh shell (chnh l tn ca chng
trnh shell)
$*
Lu gi ton b cc tham s trn dng lnh ($1 $2...)
"$@"
Lu gi ton b cc tham s trn dng lnh nhng c bao bc trong
hai du nhy kp ("$1" "$2" ...)
7.2.4 K t c bit v cch thot khi k t c bit
Nu ta mun gn chui Xin chao vo bin loichao m lm nh sau:
loichao=Xin chao
hoc: set loichao = Xin chao
Kt qu s khng c nh mun. bash v pdksh s khng hiu dng lnh v s
bo li. tcsh ch gn chui Xin cho bin loichao. Nguyn nhn l do k t du
trng nm gia Xin v chao l k t c bit i vi shell. Trong shell, cc k t
c bit ny khng cn gi nguyn ngha "en" ca chng na. V vy, du trng
k trn khng cn gi nguyn ngha du cch trng gia hai chui Xin v chao,
m n tr thnh du hiu phn cch cc phn ca dng lnh.
tr v ngha "en" ca cc k t c bit, ta phi thot khi (escape) ngha
hin thi ca chng bng cc cch sau:
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

58
-Dng cp du nhy n (' ')
-Dng cp du nhy kp (" ")
-Dng k t thot: k t cho ngc (\)
a. Cp du nhy n
Chui k t nm gia hai du nhy n s c hiu theo ng ngha "en" ca
n. Tr v v d trn, ta c th thc hin nh sau:
loichao='Xin chao'
hoc :
set loichao = 'Xin chao'
Lc ny bin loichao c gi tr ng l chui Xin chao.
b. Cp du nhy kp
Cch s dng ca du nhy kp cng ging nh du nhy n ngoi tr mt im
l du nhy kp khng thot khi ngha c bit ca k t la. iu c ngha
l ta c th a gi tr mt bin vo trong mt chui. V d:
loichao="Xin chao $LOGNAME"
hoc :
set loichao = "Xin chao $LOGNAME"
Nhc li, LOGNAME l bin mi trng lu gi tn ngi s dng ng nhp vo
h thng. V vy nu ngi s dng l root th bin loichao s c gi tr l Xin
chao root. Nu trong cu lnh trn ta thay th du nhy kp bng du nhy n
th bin li c gi tr l Xin chao $LOGNAME.
c. K t cho ngc
K t cho ngc (backslash) i trc mt k t c bit s lm thot khi
ngha c bit ca k t . V d:
loichao=Xin\ chao
hoc:set loichao = Xin\ chao
s gn Xin chao cho loichao, cn cu lnh :
giatien=\$5
hoc :
set giatien = \$5
s gn bin giatien gi tr $5 (5 la).
d. K t nhy ngc
K t nhy ngc hay du huyn (`) l mt k t c bit trong shell. Chui k t
nm gia hai du nhy ngc s c xem l mt cu lnh, c thc hin v gi
tr tr v s c lu vo bin. V d:
noidung=`ls`
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

59
hoc: set noidung = `ls`
s thc hin lnh ls v kt qu tr v s lu trong bin noidung.
7.2.5 Lnh test
Trong bash v pkdsh, lnh test dng nh gi mt biu thc iu kin. Ngi
ta thng s dng lnh ny nh gi mt iu kin trong mt mnh iu
kin (if) hoc trong mt mnh vng lp (while). C php ca lnh test nh
sau:
test bieu_thuc
hoc: [bieu_thuc]
trong bieu_thuc l biu thc iu kin cn c nh gi.
Lnh test thng c dng vi mt s ton t c xy dng sn trong shell.
Cc ton t ny c th phn thnh 4 nhm sau:
-ton t s nguyn
-ton t chui
-ton t tp
-ton t logic
Sau khi thc hin, lnh test s tr v gi tr logic l ng (True) hoc Sai (False).
a. Ton t s nguyn
Gi s int1 v int2 l hai s nguyn. Cc ton t s nguyn v ngha ca chng
s c lit k trong bng di y.
Bng 2. Cc ton t s nguyn ca lnh test
Ton t
ngha
int1 eq int2
Tr v ng nu int1 bng int2
int1 ge int2
Tr v ng nu int1 ln hn hoc bng int2
int1 gt int2
Tr v ng nu int1 ln hn int2
int1 le int2
Tr v ng nu int1 nh hn hoc bng int2
int1 lt int2
Tr v ng nu int1 nh hn int2
int1 ne int2
Tr v ng nu int1 khng bng (khc) int2
b. Ton t chui
Ton t chui dng so snh hai chui k t. Gi s c hai chui k t str1 v
str2. Cc ton t chui c lit k trong bng sau:
Bng 3. Cc ton t chui ca lnh test
Ton t
ngha
str1 = str2
Tr v ng nu str1 ging (tng ng) vi str2
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

60
str1 != str2
Tr v ng nu str1 khc (khng tng ng) vi str2
str1
Tr v ng nu str1 khng rng
-n str1
Tr v ng nu di ca str1 ln hn 0
-z str1
Tr v ng nu di ca str1 bng 0
c. Ton t tp
Ton t tp dng kim tra cc thuc tnh ca tp. Gi s ta c mt tp c tn l
tpname th cc ton t tp c th dng s c lit k trong bng sau:
Bng 4. Cc ton t tp ca lnh test
Ton t
ngha
-d tpname
Tr v ng nu tpname l mt th mc
-f tpname
Tr v ng nu tpname l mt tp thng thng
-r tpname
Tr v ng nu tpname c th c c
-s tpname
Tr v ng nu tpname c di ln hn 0
-w tpname
Tr v ng nu tpname c th ghi c
-e tpname
Tr v ng nu tpname c th thc thi c
d. Ton t logic
Ton t logic dng kt hp mt hoc nhiu ton t s nguyn, ton t chui v
ton t tp hoc o ngc kt qu ca cc ton t trn. Gi s expr1 v expr2 l
cc biu thc logic (ly c bng cch s dng cc ton t). Cc ton t logic
c lit k trong bng sau:
Bng 5. Cc ton t logic ca lnh test
Ton t
ngha
! expr1
Tr v ng nu expr1 l khng ng (Sai)
expr1 a
expr2
Tr v ng nu c expr1 v expr2 u l ng
expr1 o
expr2
Tr v ng nu hoc expr1 hoc expr2 l ng
7.3 Cc hm shell
Ngn ng shell cho php ngi s dng t nh ngha cc hm (function). Cc
hm ny s dng gn ging nh cc hm trong C v cc ngn ng lp trnh khc.
Lu Shell tcsh khng h tr cc hm.
7.3.1 C php to hm
C php to hm ca bash v pdksh nh sau:
ten_ham () {
cau_lenh_shell
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

61
...
;
}
Ngoi ra pdksh cn cho php mt c php tng ng nh sau:
function ten_ham {
cau_lenh_shell
...
;
}
Sau khi nh ngha hm, ta c th gi n bng cch g dng lnh sau:
ten_ham [thamso1 thamso2 ...]
Lu rng ta c th truyn bao nhiu tham s cho hm cng c. Khi truyn cc
tham s cho mt hm, hm s coi cc tham s ny nh cc tham s v tr
($1=thamso1, $2=thamso2, ...) ging nh khi truyn cc tham s dng lnh cho
chng trnh shell.
7.3.2 Cc v d to hm
V d sau bao gm nhiu hm khc nhau, mi hm thc hin mt nhim v tng
ng vi mt tu chn dng lnh. Chng trnh ny s nhn cc tu chn dng
lnh:
-Tu chn th nht ch ra thao tc thc hin
-Tu chn th 2, ... l tn (cc) tp nhp vo
Da vo tu chn th nht, chng trnh thc hin cc thao tc sau:
-Tu chn -u: c (cc) tp vo, bin i ni dung ca chng thnh ch hoa, v
ghi ra (cc) tp ra. Thao tc ny do hm chu_hoa() m nhim.
-Tu chn -l: c (cc) tp vo, bin i ni dung ca chng thnh ch thng,
v ghi ra (cc) tp ra. Thao tc ny do hm chu_thuong() m nhim.
-Tu chn -p: c (cc) tp vo, v in ni dung ca chng ra. Thao tc ny do
hm in_ra() m nhim.
Nu khng phi cc tu chn trn: in ra cch s dng chng trnh. Thao tc ny
do hm in_cachsd() m nhim.
Cc tp ra c tn ging vi cc tp vo nhng c thm phn m rng .out.
chu_hoa () {
shift
for i
do
tr a-z A-Z <$1 >$1.out
rm $1
mv $1.out $1
shift
done; }
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

62

chu_thuong () {
shift
for i
do
tr A-Z a-z <$1 >$1.out
rm $1
mv $1.out $1
shift
done; }

print () {
shift
for i
do
lpr $1
shift
done; }

in_cachsd () {
echo "Cu phap cua $1 l $1 [-u|-l|-p] <tp_vao>"
echo " "
echo "u ... luu thanh cac tp chu hoa"
echo "l ... luu thanh cac tp chu thuong"
echo "p ... in cac tp ra may in"; }

case $1
in
p|-p)
in_ra $@
;;
u|-u)
chu_hoa $@
;;
l|-l)
chu_thuong $@
;;
*)
in_cachsd $0
;;
esac
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

63
7.4 Cc mnh iu kin
Cc mnh iu kin c dng thi hnh cc phn khc nhau ca chng
trnh shell tu thuc vo tng iu kin c th. C bash, pdksh v tcsh u c hai
dng mnh iu kin l mnh if v mnh case. C php ca cc mnh
ny c khc bit cht t i vi cc shell khc nhau.
7.4.1 Mnh if
C 3 loi shell ni trn u h tr mnh iu kin dng if-then-else. C php
ca mnh ny c cc dng nh sau :
a. Dng n gin
bash v pdksh
tcsh
if [bieu_thuc]
then
cau_lenh
...
fi
if (bieu_thuc) then
cau_lenh
...
endif
Nu biu thc bieu_thuc c nh gi l ng th (cc) cu lnh cau_lenh s
c thc hin, cn khng th chng trnh s b qua v thc hin ngay cu lnh
pha sau fi hoc endif.
Nu ch c mt cu lnh c thc hin trong if th tcsh cn c mt dng n
gin hn l :
if (bieu_thuc) cau_lenh
b. Dng if-else
bash v pdksh
tcsh
if [bieu_thuc]
then
cau_lenh
...
else
cau_lenh
...
fi
if (bieu_thuc) then
cau_lenh
...
else
cau_lenh
...
endif
Dng ny m rng dng n gin ni trn ch: nu bieu_thuc l Sai th (cc)
cu lnh cau_lenh sau else s c thc hin.
c. Dng else-if
Nu sau else cn tin hnh kim tra mt iu kin bieu_thuc2 na th ngi ta
phi a thm mt mnh if na vo trong khi mnh else.
bash v pdksh
tcsh
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

64
if [bieu_thuc]
then
cau_lenh
...
elsif [bieu_thuc2]
then
cau_lenh
...
else
cau_lenh
...
fi
if (bieu_thuc) then
cau_lenh
...
else if (bieu_thuc2) then
cau_lenh
...
else
caulenh
...
endif

d. V d
V d sau s thc hin kim tra tp tai_lieu c nm trong th mc hin ti khng
v in kt qu ra mn hnh.
i vi bash v pdksh:
if [ -f tai_lieu]
then
echo "Co tp tai_lieu trong thu mc hien thoi"
else
echo "Khong tim thay tp tai_lieu trong thu muc hien thoi"
fi
i vi tcsh (lu phi c k t # u chng trnh) :
#
if ( { -f tai_lieu } ) then
echo "Co tp tai_lieu trong thu muc hien thoi"
else
echo "Khong tim thay tp tai_lieu trong thu muc hien thoi"
endif
7.4.2 Mnh case
a. C php case
Mnh case cho php so mt mu (chui k t) vi nhiu mu khc nhau v
thc hin on m tng ng vi mu trng khp. C php ca n nh sau:
bash v pdksh
tcsh
case mau in
mau1)
cau_lenh
...
;;
switch (mau)
case mau1:
cau_lenh
...
breaksw
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

65
mau2)
cau_lenh
...
;;

...
*)
cau_lenh
...
;;
esac
case mau2:
cau_lenh
...
breaksw

...
default:
cau_lenh
...
breaksw
endsw
Trong , mau c so snh ln lt vi cc mu mau1, mau2... Nu c mt mu
trng khp th (cc) cu lnh tng ng s c thc hin cho n khi gp hai du
chm phy (;;) (bash v pdksh) hoc breaksw (tcsh). Nu khng c mu no trng
khp th (cc) cu lnh trong khi * (bash v pdksh) hoc default (tcsh) c
thc hin.
b. V d
on chng trnh sau c vit cho bash hoc pdksh. N kim tra xem tu chn
dng lnh u tin (lu trong bin $1) c phi l i hoc e khng. Nu l i th s
in ra s dng trong tp xc nh bi tu chn dng lnh th hai (bin $2) bt u
bng ch ci i. Cn nu l e th s in ra s dng trong tp xc nh bi tu chn
dng lnh th hai bt u bng ch ci e. Nu tu chn u tin khng phi l i
hoc e th in ra mn hnh thng bo.
case $1 in
-i)
count=`grep ^i $2 | wc l`
echo "So dong trong $2 bat dau bang chu cai i la $count"
;;
-e)
count=`grep ^e $2 | wc l`
echo "So dong trong $2 bat dau bang chu cai e la $count"
;;
*)
echo "Tuy chon khong hop le"
echo "Cach dung: $0 [-i|-e] tpname"
;;
esac
V sau y l on m tng t cho tcsh :
#
switch ($i)
case i | i:
set count=`grep ^i $2 | wc l`
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

66
echo "So dong trong $2 bat dau bang chu cai i la $count"
breaksw
case e | e:
set count=`grep ^e $2 | wc l`
echo "So dong trong $2 bat dau bang chu cai e la $count"
breaksw
default:
echo "Tuy chon khong hop le"
echo "Cach dung: $0 [-i|-e] tpname"
breaksw
endsw
7.5 Cc mnh vng lp
Ngn ng shell cng cung cp cc mnh vng lp. Vng lp hay c s dng
nht l vng lp for. Ngoi ra cn c cc loi vng lp while, until.
7.5.1 Mnh for
Mnh for thc hin cc cu lnh trong vng lp vi mt s ln nht nh. N
c cc dng sau:
a. Dng th nht
bash v pdksh
tcsh
for bien in danh_sach
do
cau_lenh
...
done

foreach bien (danh_sach)
cau_lenh
...
end
Trong dng ny, mnh for thc hin mi vng lp cho mi mc trong danh
sch danh_sach. Danh sch ny c th l mt bin cha cc t ngn cch nhau bi
mt du cch hoc cng c th c g trc tip cc t vo dng lnh. Mi
vng lp, bin bien c gn ln lt mt mc (t) trong danh sch cho n ht
danh sch.
b. Dng th hai
i vi bash v pdksh, mnh for cn c mt dng nh sau:
for bien
do
menh_de
...
done
Trong dng ny, mnh for thc hin mi vng lp cho mi mc trong bin
bien. Khi c php ny c s dng, chng trnh shell gi s rng bin bien
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

67
cha mi tham s v tr c truyn cho chng trnh thng qua dng lnh.
Thng thng, dng mnh ny tng ng vi mnh sau:
for bien in "$@"
do
menh_de
...
done
c. V d mnh for
V d sau (bash v pdksh) s ly cc tu chn dng lnh l cc tp text. i vi
mi tp, chng trnh s c v chuyn i cc ch thng thnh ch hoa v lu
vo mt tp mi c tn ging tp c nhng c thm phn m rng .caps.
for tp
do
tr a-z A-Z < $tp > $tp.caps
done
Cn y l v d tng ng vit cho tcsh
#
foreach tp ($*)
tr a-z A-Z < $tp > $tp.caps
end
7.5.2 Mnh while
a. C php ca mnh while
Mnh while thc hin on chng trnh bn trong chng no m biu thc
cho cn l ng. C php ca n nh sau:
bash v pdksh
tcsh
while bieu_thuc
do
menh_de
...
done
while (bieu_thuc)
menh_de
...
end
b. V d mnh while
V d sau (bash, pdksh) lit k cc tham s truyn cng vi s lng tham s :
count=1
while [ -n "$*" ]
do
echo "Day la tham so thu $count: $1"
shift
count=`expr $count + 1`
done
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

68
Ghi ch: Lnh shift (xem thm mc nh cui chng) s dch chuyn cc tham s
dng lnh sang mt v tr pha bn tri.
Cn y l on m tng ng dnh cho tcsh :
#
set count = 1
while ("$*" != "")
echo "Day la tham so thu $count: $1"
shift
set count = `expr $count + 1`
end
7.5.3 Mnh until
a. C php ca mnh until
C php ca mnh until ging vi mnh while. im khc bit l ch,
mnh while thc hin vng lp chng no biu thc iu kin cn ng, cn
mnh until thc hin vng lp chng no biu thc iu kin cn Sai. C php
ca n trong bash v pdksh nh sau :
until bieu_thuc
do
cau_lenh
...
done
b. V d mnh until
Ta vit li v d trn bng vng lp until nh sau:
count=1
until [ -z "$*" ]
echo "Day la tham so thu $count: $1"
shift
count=`expr $count + 1`
done
im khc bit gia 2 v d ch l biu thc iu kin -n "$*" c thay bng -z
"$*" ( ngha ngc li). l do mnh until hon ton ging vi mnh
while khi o ngc iu kin. V vy tcsh khng c mnh ny.
7.5.4 Cu lnh shift
a. Gii thiu cu lnh shift
C bash, pdksh v tcsh u h tr cu lnh shift. Cu lnh ny dch chuyn gi
tr hin thi lu trong cc tham s v tr sang mt v tr v pha bn tri. V d nu
ta c :
$1=Xin $2=chao $3=ban
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

69
th sau khi thc hin lnh shift ta c :
$1=chao $2=ban
Ta cng c th chuyn sang tri hn mt v tr bng cch thm s bc dch
chuyn vo cu lnh:
shift 2
Bng cch dng shift ta c th ln lt duyt qua cc tu chn dng lnh mt
cch d dng. V vy cu lnh ny rt hu dng trong vic phn tch cc tu chn
dng lnh.
b. V d cu lnh shift
V d sau nhn cc tp: mt tp u vo (-i tp_vao) v mt tp u ra (-o
tp_ra). Chng trnh s c tp u vo, chuyn cc k t thnh ch hoa v ghi
ra tp u ra.
while [ "$1" ]
do
if [ "$1" = "-i" ]
then
tp_vao=$2
shift 2
elif [ "$1" = "-o" ]
then
tp_ra="$2"
shift 2
else
echo "Chuong trinh $0 khong nhan ra tham so $1"
echo "Cach su dung: $0 -i tp_vao -o tp_ra"
fi
done
tr a-z A-Z $tp_vao $tp_ra


8.V D XY DNG NG DNG BNG NGN NG SCRIPT

Ngn ng script l mt ngn ng mnh, c th dng vit mt chng trnh hon
chnh. kt thc chng ny nhm gip bn hiu su hn v cc lnh v c php
hc, chng ta hy cng nhau xy dng mt ng dng rt thc t, ng dng qun l a
CD nhc, cng c th m rng thnh chng trnh qun l a CD software, album sch
... Chng ta hy bt u.

8.1. Phn tch yu cu

Chng ta d nh thit k v ci t chng trnh qun l a CD. Gi s ta c mt su
tp v rt nhiu CD nhc. iu trc l mun chng trnh lm, l phi tm cch no
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

70
lu tr c thng tin v CD nh tn CD, s bi ht, tn tng bi ht (track), sau l
ch truy tm tn ca cc bi ht c trong b su tp. to thnh mt ng dng hon
ho, chng trnh phi c kh nng chn mt tuyn tp CD mi, to mi bi ht, sa i
cp nht tn bi ht, xa cc bi ht c, lit k danh sch bi ht c trong b su tp.

8.2. Thit k ng dng

Vi 3 yu cu - cp nht, tm kim v hin th bi ht - ta nn xy dng mt trnh n vi
thc n (memu), to s la chn theo thch. Ta s lu d liu dng vn bn (text
file). Gi s tp d liu khng ln n hng triu bi ht, chng ta c th xy dng v
dng tp vn bn lm c s d liu. Lu d liu trong tp vn bn s d c v d chnh
sa bng cc chng trnh son tho thng thng.

Trong th gii UNIX v Linux, hu nh cc tp cha thng tin v d liu u
c lu dng vn bn. Chnh v vy shell cng nh cc ngn ng khc c trn
Linux (nh Perl, Python, awk ...) cung cp kh nng x l chui rt mnh.

Hy xem xt 3 cch lu d liu sau:
1. Lu tt c thng tin trong 1 tp vn bn, trong dng mt dng lu
tn CD v n dng c nh lu tn bi ht.
2. Thng tin v bi ht v tn CD c lu chung mt dng.
3. Thng tin v tn CD lu trong mt tp tin v quan h vi thng tin v tn
bi ht lu trong tp tin khc.
Ta chn cch lu tr th 3 v n tun theo m hnh quan h ca c s d liu.
Mt tp tin lu tn phn loi ca tng a CD, mt tp tin lu tn cc bi ht tng ng
vi a CD . S bi ht cha trn mt CD l khng gii hn. C th mi quan h gia
tp tin phn loi CD v tp tin cha tn bi ht c th hin nh sau:





Cataloe Trc Type Composer
CD123 Love Music Romantic Mozard
CD234 classic vioin Classic Batch
CD345 Pop Jackson Varios

catalog TrackNo Title
CD123 1 Some song
Cd123 2 Other song
CD345 1 Rose
CD234 1 Sonate


Bng phn loi CD bao gm cc trng
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

71
Catalog S CD (kho ngoi lin kt vi bng phn loi)
Tn trng ngha
Catalog S CD (dng lm kha chnh)
Title Tn CD
Type Th loi
Composer Tc gi
Bng cha tn bi ht tng ng vi CD bao gm:
Tn trng nghi
TrackNo S track (v tr) ca bi ht
Title Tn bi ht

Vn t ra l tp d liu khng phi l mt c s d liu cha cc bng v ct, chng
ta cn quy inh k t dng lm phn cch cc ct d liu vn bn vi nhau. K t thng
dng l k t tab, khong trng hay du phy. Trng hp ny ta s dng du nhy (,)
lm k t ngn cch cc ct vn bn vi nhau (tp tin vn bn dng ny cn c gi l
CSV - Common seperataad variable).
Trc khi bt tay vo ci t chng trnh, v tng th cn dng nhng hm sau y:
get_return( )
get-confirm()
set-menu-choice()
insert_title( )
insert_track()
add_record_track()
add_records()
find_cd( )
update_cd( )
count_cds( )
remove_records( )
list_track( )

Di y l m ngun c thc hin qua cc bc ci t chi tit. d hiu chng ta
to tng phn ca m lnh, sau c th kt hp chng li nh mt tng th duy nht.

V d 3-36 cd_apps.sh

Bc 1: Nh thng l phn u ca script thng l li triu gi shell thc thi sh. Bn
c th t mt s thng tin hng dn v nu bn quyn copyright theo qui nh m
ngun m GPL.

#!/bin/sh .
# V d dn gin v s dng shell script xy dng ng dng album CD
# Di y l cc iu khon tha thun v bn quyn cu m ngun min ph.
#
# This program is free software; you can redistribute it and/or modify it
# uner the terms of the GNU General Public License as publhed by the
# Free Software Foundation; either version 2 of the License, or (at your option)
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

72
# any older version.
# This program (s distributed in the hopes that it will be useful, but
# WITHOUT ANY WARRANTY, without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General
# Public Licenae for more details.
# You should have received a copy of the GNU Generl Public Licene along with this
program;
# if not, write to the Free Software Foundtion, Inc.
# 675 Mass Ave, Cambridge, MA 02139, USA.
# A few global variables we need. Put them here for clarity.

Bc 2: Khai bo mt s bin ton cc m ta s dng xuyn sut script. Chng ta khai
bo tn cc tp tin lu tr d liu, tn tp tin tm, ng thi s dng lnh trap by phm
Ctrl-C. Khi ngi dng nhn phm ny th ta xa tp tm v chm dt chng trnh.

menu_choice=""
current_cd=""
title_file="title.cdb"
tracks_file="tracks.cdb"
temp_file=/tmp/cdb.$$
trap 'rm -f $temp_file' EXIT

Bc 3: Tt c cc hm pha khai bo trc khi s dng. Hy ci t 2 hm n gin nht
get_return() yu cu ngi dng n ENTER v get_confirm() yu cu xc nhn yes hay
no.

get_return() {
echo -e "Press return \c"
read x
return 0
}

get_confirm() {
echo -e "Are you sure? \c"
while true
do
read x
case "$x" in
y | yes | Y | Yes | YES )
return 0;;
n | no | N | No | NO )
echo
echo "Cancelled"
return 1;;
*) echo "Please enter yes or no" ;;
esac
done
}

________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

73
Bc 4: ci t menu hin th danh sch cc tu chn. Menu xy dng ng d vo
bin $cdcatnum. Lnh echo e s hin th chui nhng khng xung dng. Nu shell
khng chp nhn echo e, c th thay bng printf.

set_menu_choice() {
clear
echo "Options :-"
echo
echo " a) Add new CD"
echo " f) Find CD"
echo " c) Count the CDs and tracks in the catalog"
if [ "$cdcatnum" != "" ]; then
echo " l) List tracks on $cdtitle"
echo " r) Remove $cdtitle"
echo " u) Update track information for $cdtitle"
fi
echo " q) Quit"
echo
echo -e "Please enter choice then press return \c"
read menu_choice
return
}

Bc 5: Ti y to 3 hm kh quan trng,
insert_title(): chn tn mt CD mi vo danh mc;
insert_track(): chn mt bi ht mi;
add_record_track(): thc hin nhp liu v go hm chn d liu vo tp d liu.
add_record_track()go cc hm insert_title(),insert_track() bng cch truyn tham s cho
chng. Trong cc hm, ta s ly v cc tham s bng cc bin $*.

insert_title() {
echo $* >> $title_file
return
}

insert_track() {
echo $* >> $tracks_file
return
}

add_record_tracks() {
echo "Enter track information for this CD"
echo "When no more tracks enter q"
cdtrack=1
cdttitle=""
while [ "$cdttitle" != "q" ]
do
echo -e "Track $cdtrack, track title? \c"
read tmp
# case "$tmp" in
# "") continue
# ;;
# *,*) echo "Sorry, no commas allowed"
# continue
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

74
# ;;
# esac
cdttitle=${tmp%%,*}
if [ "$tmp" != "$cdttitle" ]; then
echo "Sorry, no commas allowed"
continue
fi
if [ -n "$cdttitle" ]; then
if [ "$cdttitle" != "q" ]; then
insert_track $cdcatnum,$cdtrack,$cdttitle
fi
else
cdtrack=$((cdtrack-1))
fi
cdtrack=$((cdtrack+1))
done
}

Bc 6: add_track(0 s to mt th mc cho CD mi.

# This allows adding of a new CD

add_records() {
# Prompt for the initial information

echo -e "Enter catalog number \c"
read tmp
cdcatnum=${tmp%%,*}

echo -e "Enter title \c"
read tmp
cdtitle=${tmp%%,*}

echo -e "Enter type \c"
read tmp
cdtype=${tmp%%,*}

echo -e "Enter artist/composer \c"
read tmp
cdac=${tmp%%,*}

# Check that they want to enter the information

echo About to add new entry
echo "$cdcatnum $cdtitle $cdtype $cdac"

# If confirmed then append it to the titles file

# get_confirm && insert_title $cdcatnum,$cdtitle,$cdtype,$cdac
if get_confirm ; then
insert_title $cdcatnum,$cdtitle,$cdtype,$cdac
add_record_tracks
else
remove_records
fi

________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

75
return
}

Bc 7: find_cd() ch yu s dng lng grep tm tn mt CD mi trong tp phn loi.
grep s chuyn tt c cc dng tm thy ra tp tm, dng wc m s dng c trong tp
tm (cng l kt qu tm c). wc tr v s t, tip n dng set ly kt qu cu wc
v tr th nht (s dng) v lu v bin listfound.
Nu tm thy nhiu CD cng mt lc, hin th n dung tm c, khng lit k
danhsch cc bi ht. Nu ch c mt CD, c n dung tp tm vo cc bin ton cc
bng read. Lu IFS c t g tr , read c cc trng phn cch cch nhau bng
du phy (,). Tip theo hin th n dung CD v ton b cc bi ht bng ham list_track().

find_cd() {
if [ "$1" = "n" ]; then
asklist=n
else
asklist=y
fi
cdcatnum=""
echo -e "Enter a string to search for in the CD titles \c"
read searchstr
if [ "$searchstr" = "" ]; then
return 0
fi

grep "$searchstr" $title_file > $temp_file

# set $(wc -l $temp_file)
# linesfound=$1
linesfound=$(wc -l $temp_file)
case "$linesfound" in
0) echo "Sorry, nothing found"
get_return
return 0
;;
1) ;;
2) echo "Sorry, not unique."
echo "Found the following"
cat $temp_file
get_return
return 0
esac

# C th i case theo cch sau:
# if [ "$linesfound" = "0" ]; then
# echo "Sorry, nothing found"
# get_return && return 0
# fi
# if [ "$linesfound" != "1" ]; then
# echo "Sorry, not unique."
# echo "Found the following ..."
# cat $temp_file
# get_return && return 0
# fi
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

76

# cdcatnum=$(cut -f 1 -d , $temp_file)

IFS=","
read cdcatnum cdtitle cdtype cdac < $temp_file
IFS=" "

# if [ "$cdcatnum" = "" ]; then
if [ -z "$cdcatnum" ]; then
echo "Sorry, could not extract catalog field from $temp_file"
# cat $temp_file
get_return
return 0
fi

# cdtitle=$(cut -f 2 -d , $temp_file)
# cdtype=$(cut -f 3 -d , $temp_file)
# cdac=$(cut -f 4 -d , $temp_file)

echo

echo Catalog number $cdcatnum
echo $cdtitle
echo $cdtype
echo $cdac
echo
get_return

if [ "$asklist" = "y" ]; then
echo -e "View tracks for this CD? \c"
read x
if [ "$x" = "y" ]; then
echo
list_tracks
echo
fi
fi
return 1
}

Bc 8: update)cd() dng nhp li thng tin cu CD. Lu cch tm cu grep: tm xu
$cdcatnum km theo (,) cho chnh xc. Kt qu chi tm c c dng ${cdcatnum}},.
K hiu ^ yu cu grep tm bt u t chui c ch nh. Kho v dng xc nh tm
nghc o, ch ly cc dng khng thi mn iu kin. Kt qu a vo tp tm. Mc ch
lad xo tp CD trc , bng cch a cc dng khng xo v mt tp khc, xo tp
hin hnh sau chuyn ni dung t tp tm vo . Ch y dng && thc hin
lin tc cc lnh lin nhau (xem 3.4)

update_cd() {
if [ -z "$cdcatnum" ]; then
echo "You must select a CD first"
find_cd n
fi
if [ -n "$cdcatnum" ]; then
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

77
echo "Current tracks are :-"
list_tracks
echo
echo "This will re-enter the tracks for $cdtitle"
get_confirm && {
grep -v "^$cdcatnum" $tracks_file > $temp_file
mv $temp_file $tracks_file
# cat $temp_file > $tracks_file
echo
add_record_tracks
}
fi
return
}

Bc 9: count_cds() li dung n wc, v set c c tng s CD v bi ht c trong
hai tp d liu.

count_cds() {
num_titles=$(wc -l $title_file)
num_tracks=$(wc -l $tracks_file)
echo found $num_titles CDs, with a total of $num_tracks tracks
get_return
return
}

Bc 10: remove_records() loi khi tp d liu tn CD v cc bi ht bng grep v.
Cch lm tng t nh uapdat_cd()

remove_records() {
if [ -z "$cdcatnum" ]; then
echo You must select a CD first
find_cd n
fi
if [ -n "$cdcatnum" ]; then
echo "You are about to delete $cdtitle"
get_confirm && {
grep -v "^$cdcatnum" $title_file > $temp_file
mv $temp_file $title_file
grep -v "^$cdcatnum" $tracks_file > $temp_file
mv $temp_file $tracks_file
cdcatnum=""
echo Entry removed
}
get_return
fi
return
}

Bc 11: list_track() hin th danh sch cc bi ht cu mt CD.cut c dng ly mt
trng trong tp vn bn, d vo du phn cch (,) nh v cc trng d liu. Kt
qu gi vo more a ra mn hnh.

list_tracks() {
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

78
if [ "$cdcatnum" = "" ]; then
echo no CD selected yet
return
else
grep "$cdcatnum" $tracks_file > $temp_file
set $(wc -l $temp_file)
num_tracks=$1
if [ "$num_tracks" = "0" ]; then
echo no tracks found for $cdtitle
else {
echo
echo "$cdtitle :-"
echo
cut -f 2- -d , $temp_file
echo }| more
fi
fi
get_return
return
}

Bc 12: Chng trnh chnh bt u ti y, sau khi ci t hon tt. Khi chn mc
thot, script s cho thng bo v kt thc vng while, tr v 0 cho bit script hon tt.

# Main routine starts here
#
# get the files in a known state

rm -f $temp_file

if [ ! -f $title_file ]; then
touch $title_file
fi
if [ ! -f $tracks_file ]; then
touch $tracks_file
fi

# Now the application proper

clear
echo
echo
echo "Mini CD manager"
sleep 3

quit=n
while [ "$quit" != "y" ];
do
set_menu_choice
case "$menu_choice" in
a) add_records;;
r) remove_records;;
f) find_cd y;;
u) update_cd;;
c) count_cds;;
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

79
l) list_tracks;;
b)
echo
more $title_file
echo
get_return;;
q | Q ) quit=y;;
*) echo "Sorry, choice not recognized";;
esac
done

#Tidy up and leave

rm -f $temp_file
echo "Finished"
exit 0

Hnh sau l giao din chng trnh qun l CD:


Hnh 3-2 Mn hnh kt xut ca chng trnh script cd-app


________________________________________________________________________


TI LIU THAM KHO

Ray Swat UNIX Applications Programming: Mastering the Shell.
1990

________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
LINUX, Lp trnh shell
________________________________________________________________________

80
Tp 1 01
endel Cooper Advanced Bash-Scripting Guide, 2.8 11 July 2004
V mt s ti liu khc.
Lp trnh Linux. Nguyn Phng Lan, Hang c Hi. NXB GD, 20
M

________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son

You might also like