Professional Documents
Culture Documents
________________________________________________________________________
UNIX/Linux
LP TRNH TRONG MI TRNG SHELL
1. Shell
ca UNIX/LINUX
3
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
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.
4
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
C shell (csh)
Cac ung
dung
Nhan
HDH
Bourne
Again shell
(bash)
X-Wimdows
shell
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 )
Csh, tcsh v zsh
5
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
rc
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.
khong
u ra hng ti
Ni vo ni dung ca
Ly u vo t <
u vo l y
u ra bo li s hng vo
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.
11
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
$myvar
"message : $myvar"
'message : $myvar'
"messgae :\$myvar"
14
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
$0
$#
$$
ngha
Cha ni dung ca th mc ch. (Th mc u tin khi ngi
dng ng nhp)
Cha danh shell cc ng dn (phn cch bng dn hai chm :).
Linux thng tm cc trnh cn thi hnh trong bin $PATH.
Du nhc (prompt) hin th trn dng lnh. Thng thng l $
user khng phi root.
Du nhc th cp, thng bo ngi dng nhp thm thng tin trc
khi lnh thc hin.Thng l du >.
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.
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_$$.
15
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
ngha
V tr v ni dung ca cc tham s trn dng lnh theo th t t
tri sang phi.
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.
16
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
"The
"The
"The
"The
Kt qu
true nu 2 chui bng nhau (chnh xc tng k t)
true nu 2 chui khng bng nhau
true nu string1 khng rng
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
18
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
true nu file l th mc
true nu file tn ti trn a
true nu file l tp tin thng thng
true nu set-group-id c thit lp trn file
true nu file cho php c
true nu kch thc file khc 0
true nu set-ser-id c p t trn file
true nu file cho php ghi
true nu file c php thc thi
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
20
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
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.
"
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
22
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
V du 3-7: for_loop2.sh
#!/bin/sh
for file in $(ls f*.sh); do
lpr $file
done
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
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:
25
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
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
26
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
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
27
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
;;
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
28
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
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:
30
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
31
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
32
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
is
global
outside
the
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
33
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
36
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
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
37
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
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.
38
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
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
ngha
Tr
Nhn
Chia
Modulo (ly s d)
ngha
Cho php hin th k t \ trong chui
Pht ling chung (beep)
Xa backspace
y dng
Sang dng mi
V u dng
Cn tab ngang
cn tab dc
K t n vi m l ooo
ngha
S nguyn
K t
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".
41
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
$(date)
Kt qu kt xut
$./set_use.sh
Current date Fri March 13
The month is March
The year is 2001
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
43
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
ngha
HUP (1)
INT ( 2 )
#t by
#gii tr by
44
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
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
47
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
ngha
${param:-default}
${#param}
${param%word}
Nu gi tr ca param=null th gn tr mi l default
Tr v chiu i ca param.
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 .
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.
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.
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.
${param%%wrd}
$({param#word}
${param##word}
Kt xut s l
$./param_expansion.sh
bar
fud
usr/bin/X11/startx
startx
/usr/local/etc
48
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
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>
sh -v <script>
sh x
set o noexec
set -n
set -o verbose
s -v
set -o xtrace
set -x
set -o nounset
set u
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
51
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
32
Xanh l cy
33
Nu
34
Xanh nc bin
52
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
Hng
Xanh da tri
Xm
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"
53
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
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.
bash,
vi tham s l tn ca
. 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
55
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
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.
56
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
Cch dng
$#
$?
$0
$*
"$@"
hoc :
set loichao = 'Xin chao'
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"
hoc :
set giatien = \$5
58
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
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
int1 eq int2
int1 ge int2
int1 gt int2
int1 le int2
int1 lt int2
int1 ne int2
ngha
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
ngha
Ton t
str1 = str2
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
ngha
Ton t
-d
-f
-r
-s
-w
-e
tpname
tpname
tpname
tpname
tpname
tpname
Tr v ng nu tpname l mt th mc
Tr v ng nu tpname l mt tp thng thng
Tr v ng nu tpname c th c c
Tr v ng nu tpname c di ln hn 0
Tr v ng nu tpname c th ghi c
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
ngha
Ton t
! expr1
expr1 a
expr2
expr1 o
expr2
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
60
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
61
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
62
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
tcsh
if [bieu_thuc]
then
cau_lenh
...
fi
if (bieu_thuc) then
cau_lenh
...
endif
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
bieu_thuc
l Sai th (cc)
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
63
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
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
tcsh
case mau in
mau1)
cau_lenh
...
;;
switch (mau)
case mau1:
cau_lenh
...
breaksw
64
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
case mau2:
cau_lenh
...
breaksw
...
default:
cau_lenh
...
breaksw
endsw
tcsh
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
66
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
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
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
67
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
1
!= "")
la tham so thu $count: $1"
= `expr $count + 1`
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
68
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
Cataloe
CD123
CD234
Trc
Love Music
classic vioin
Type
Romantic
Classic
Composer
Mozard
Batch
CD345
Pop
Jackson
Varios
catalog
CD123
Cd123
CD345
CD234
TrackNo
1
2
1
1
Title
Some song
Other song
Rose
Sonate
72
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
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
73
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
;;
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
74
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
return
75
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
cdcatnum=$(cut -f 1 -d , $temp_file)
IFS=","
read cdcatnum cdtitle cdtype cdac < $temp_file
IFS=" "
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
76
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
77
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
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;;
78
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
________________________________________________________________________
TI LIU THAM KHO
Ray Swat
79
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son
V mt s ti liu khc.
80
________________________________________________________________________
Hunh Thc Cc, Vin CNTT tp hp v bin son