Professional Documents
Culture Documents
Uit Ce Lab Hdh-Lab2 - Final
Uit Ce Lab Hdh-Lab2 - Final
TI LIU:
Thng 2 nm 2015
MC LC
Chng 1.
1. Shell ca Unix/Linux..............................................................4
2. S Dng SHELL Nh Ngn Ng Lp Trnh..........................4
2.1. iu khin shell t dng lnh
18
19
3.2. iu kin...........................................................................21
3.2.1. Lnh test hoc [ ] 22
3.3 Cu trc iu khin.............................................................25
3.3.1. Lnh if 25
3.3.2 Lnh elif 27
3.3.3. Vn pht sinh vi cc bi
3.3.4. Lnh for 29
3.3.5 Lnh while
31
33
34
28
4. Bi Tp38
Chng 1.
1. Shell ca Unix/Linux
Shell l chng trnh giao tip vi ngi dung, chp nhn cc ch dn hoc
cc lnh bng ting Anh v chuyn cc lnh ti kernel.
$ . / first.sh
on lnh trn mang ngha: chuyn quyn s hu tp tin cho root, root c
ton quyn c sa ni dung v thc thi tp tin, trong khi nhm v nhng ngi
dng khc root ch c php c v thc thi. Nn nh mc d bn loi b quyn
ghi w trn tp tin, UNIX v Linux vn cho php bn xo tp tin ny nu th mc
cha n c quyn ghi w. an ton, vi t cch l nh qun tr, nn kim tra li
th mc cha script v bo m rng ch c root mi c quyn w trn th mc
cha cc tp .sh
Kt qu in ra mn hnh: I am here
xinchao=12+l
echo $xinchao
Kt qu in ra mn hnh: 12+1
readln ca Pascal).
>
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>>
V d:
$date > login.time
Lnh date khng kt xut ra u ra chun (stdout) m ghi vo tp login.time.
>login.time khng phi l thnh phn ca lnh date, m n gin m t tin trnh
to v gi kt xut u (bnh thng l mn hnh). Nhn theo cch x l th nh
sau: c cm lnh trn cha hai phn: lnh date, tc chng trnh thc thi, v
thng ip (>login.time) thng bo cho shell bit kt xut lnh s c x l nh
th no (khc vi mc nh. Bn thn date cng khng bit chuyn kt xut i
u, shell chn mc nh).
V d:
$cat < file1
Bnh thng cat nhn v hin th ni dung tp c tn (l i u vo). Vi lnh
trn cat nhn ni dung t file1 v kt xut ra mn hnh. Thc cht khng khc g
khi g:
$cat file1.
Hy xem:
$cat < file1 > file2
Lnh ny thc hin nh th no ? Theo trnh t s nh sau: cat nhn ni dung ca
file1 sau ghi vo tp c tn file2, khng a ra stdout nh mc nh. Lnh cho
thy ta c th thay i u v u ra cho lnh nh th no. Nhng lnh cho php
i u ra/vo gi chung l qa trnh lc (filter).
V d:
$cat file1 < file2
Lnh ny ch hin th ni dung ca file1, khng g hn. Ti sao ? cat nhn i
u vo l tn tp. Nu khng c i n nhn t stdin (bn phm). C i th
chnh l file1 v u ra l stdout. Trng hp ny gi l b qua i hng. Ci g
y l quan trng ? u ra/vo ca lnh i hng cng khng c ngha l
s bo m rng s i hng s c s dng. Mt ln na cho thy lnh bn
thn n khng hiu rng c s i hng v c lnh chp nhn i hng
vo/ra, nhng khng phi tt c. V d
$date < login.time
date khc cat, n khng kim tra u vo, n bit phi tm u vo u. i
hng y khng c tc dng.
V d
$cat < badfile 2> errfile
Thng thng cc li h thng qun l u stderr v s in ra mn hnh. Tuy
nhin c th chuyn hng bo li, v d vo mt tp (chng hn logfile) m
khng a ra mahn hnh. V d trn l nh vy. Ta bit stderr l tp c m t tp
= 2, do vy 2>errfile c ngha i u ra ca stderr vo mt tp, tc ghi bo li
vo tp xc nh.
Nhng g va cp tc ng trn tp vo/ra. Ta cng c cch x l ngay
trong mt dng ca tp, ci gi l i hng trong dng (in-line Redirection).
Lai ny bao gm hai phn: i hng (<<) v du hiu nh du (l bt k k t
no) ca dng d liu vo.
V d:
$cat << EOF
(v g ENTER)
(background process). Bn thn Unix khng c khi nim g v tin trnh chy
nn hay tin trnh tng tc (foreground), m shell iu khin vic chy cc tin
trnh. Vi & chng trnh s t chy v shell quay ngay v tng tc vi ngi
dng, tr li du nhc ngay. Tin trnh nn c nhiu cch kim sot.
V d:
$sort huge.file > sorted.file & // huge.file l mt file tht ln
$
Bng lnh ps s thy lnh sort ang chy km vi s ID ca tin tnh .
Bng lnh
$ jobs
[1]
s thy s hiu ca lnh ang chy ngm.
kt thc thc thi, dng
$ fg 1
2.
3.
Tc l: 1. thc hin date vi kt qu Fri May 12:52:25 UTC 2004 khng hin ra
stdout (mn hnh), nhng s l u vo ca echo;
2. sau lnh echo s echo Logged in Fri May 12:52:25 UTC 2004,
nhng khng a ra mn hnh (stdout) m i hng vo tp login.time.
Nu g $ cat login.time, ta c kt xut t tp ny ra mn hnh:
Logged in Fri May 12:52:25 UTC 2004
4.
ng dn (Pipelines)
Shell cho php kt qu thc thi mt lnh (u ra ca lnh), kt hp trc tip (ni
vo) u vo ca mt lnh khc, m khng cn x l trung gian (lu li trc ti
tp trung gian).
V d:
$who | ls l
u ra (stdout) ca who (ng l s ra mn hnh), s l u vo (stdin) ca
ls l.
V d:
$ (date ; who) | ls -l
Tm tt:
cmd &
`cmd`
1.
Backslash ( \ )
V d:
$cat file1&2 lnh ny gy ra nhiu li, bi c s hiu nhm & trong khi n
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"
exit 0
Hi there
message : Hi there
message : $myvar
message : $myvar
Enter some text
Hello World
$myvar now equals Hello World
Bin mi
ngha
trng
$HOME
$PATH
$PS1
cho
$SP2
$IFS
$0
$#
$$
ngha
$1, $2, $3 . . .
S*
$@
Ta nhn thy, lnh set tip nhn 3 tham s trn dng lnh l foo bar bam. Chng
nh hng n bin mi trng $* v $@. Khi IFS c qui inh l k t A , $*
cha danh shell cc tham s phn cch bng k t A . Khi t IFS v NULL bng
lnh unset, bin $* tr v danh shell thun tu ca cc tham s tng t bin $@.
Bin $# s cha s tham s ca lnh, trong trng hp trn ta c:
$echo " $# "
3
Khi lnh khng c tham s th $0 chnh l tn lnh cn $# tr v gi tr 0.
on trnh mu sau s minh ha mt s cch n gin x l v truy xut
bin mi trng.
V d3-2: try_variables.sh
#!/bin/sh
salutation="Hello"
echo $salutation
echo "The program $0 is now running"
echo "The second parameter was $2"
echo "The first parameter was $1"
echo "The parameter list was $*"
echo "The user's home directory is $HOME"
echo $salutation
echo "The script is now complete"
exit 0
3.2. iu kin
Nn tng c bn trong tt c ngn ng lp trnh, l kh nng kim tra
iu kin v a ra quyt nh r nhnh thch hp ty theo iu kin ng hay
sai. Trc khi tm hiu cu trc iu khin ca ngn ng script, ta hy xem qua
cch kim tra iu kin.
Mt script ca shell c th kim tra m li tr v ca bt k lnh no c
kh nng triu gi t dng lnh, bao gm c nhng tp tin lnh script khc. l
l do ti sao chng ta thng s dng lnh exit cui mi script khi kt thc.
fi
Cng c th s dng [ ] thay th test
if [ -f hello.c ]
then
fi
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
tring1 != string2
-n string1
-z stringl
So snh ton hc
So snh
Kt qu
expression1 eq expression2
!expression
true nu file l th mc
-e file
-f file
-g file
-r file
-s file
-u file
-w file
-x file
3.3.1. Lnh if
Lnh if tuy n gin nhng c s dng nhiu nht. if kim tra iu kin
ng hoc sai thc thi biu thc thch hp
if condition
then
statements
else
statements
V d, on script sau s ng if ty vo cu tr li ca bn m a ra li
cho thch hp
V du 3-3 if_control.sh
#!/bin/sh
echo "Is it morning? Please answer yes or no"
read timeofday
#ch khong trng trc sau [ v trc ]
if [ $timeofday = "yes" ]; then
echo "Good morning"
else
echo "Good afternoon"
fi
exit 0
Kt qu kt xut ca script
$./ if_control.sh
Is it mornining ? Please answer yes or no
yes
Good morning
$
Shell khng i hi phi canh l hay tht u dng cho tng lnh. Chng
ta canh l c php c r rng, d c. Mc d vy sau ny bn s
thy ngn ng ca chng trnh make s yu cu canh l v xem l yu
cu nhn dng lnh.
V du 3-4: elif_control.sh
#!/bin/sh
echo "Is it morning? Please answer yes or no"
read timeofday
if [ $timeofday = "yes" ]; then
echo "Good morning"
elif [ $timeofday = "no" ]; then
echo "Good afternoon"
else
echo "Sorry, $timeofday not recognized. Enter yes or no"
exit 1
fi
exit 0
Hy kim tra li elif_controi2.sh bng cch chi nhn Enter khi shell a ra
cu hi. Script gi y chy rt bo m v chun.
Lnh echo thng xung hng sau khi a ra thng bo. C th ng lnh
printf thay cho echo. Mt vi shell cho php lnh echo -e trn mt dng, nhng
chng khng phi l ph bin bn s dng.
Kt qu kt xut s l
$./ for_loop.sh
bar
fud
13
foo l mt bin dng trong vng lp for duyt tp hp gm 3 phn t (cch
nhau bng khong trng). Mc nh shell xem tt c cc gi tr gn cho bin l
kiu chui cho nn 13 y c xem l chui tng t nh chui bar v fud.
iu g s xy ra nu bn thay th lnh for foo in bar fud 13 thnh for
foo in bar fud 13. Hy nh li, du nhy kp cho php coi tt c ni
dung bn trong nhy kp l mt bin chui duy nht. Kt qu kt xut nu
s dng du nhy kp, lnh echo ch c gi mt ln in ra chui "bar
fud 13 ".
for thng dng duyt qua danh sch tn cc tp tin. Bng cch dng k t
i din * (wildcard) v d first.sh, ta thy cch for tm kim tp tin kt hp
vi lnh grep. V d sau y cho thy vic m rng bin thnh tp hp s dng
trong lnh for. Gi s bn mun in ra tt c cc tp *.sh c k t u tin l f
V du 3-7: for_loop2.sh
#!/bin/sh
for file in $(ls f*.sh); do
lpr $file
done
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.
#!/bin/sh
Kt qu ca script
$./password.sh
Enter password:
abc
Sorry, try again
secret #g ng
$
Mc d password hin th khi nhp liu r rng l khng thch hp,
nhng y ta ch yu minh ha lnh while. Lnh while lin tc kim tra
ni dung bin $trythis, yu cu nhp li d liu bng lnh read mt khi
$trythis vn cha bng vi chui "secret".
Bng cch s dng bin m v biu thc so snh ton hc, while
hon tan c th thay th for trong trng hp tp d liu ln. Hy theo
di v d sau:
V d: 3-9 while_for.sh
#!/bin/sh
foo=1
#!/bin/sh
echo "Is it morning? Please answer yes or no"
read timeofday
case "$timeofday" in
"yes")
"no" )
"y" )
"n" )
*)
esac
exit 0
Cch thc hin: Sau khi ngi dng nhp vo cu tr li, lnh case s ly
ni dung ca bin $timeofday so snh vi tng chui. Khi gp chui thch hp
n s thc thi lnh ng sau du ) v kt thc (khng tip tc so khp vi cc
mu khc). K t i din * cho php so khp vi mi loi chui. * thng c
xem nh trng hp so snh ng cui cng nu cc mu so snh trc tht
bi. Bn c th xem * l mnh default trong lnh switch ca C hay case
else ca Pascal.
Vic so snh thng thc hin t mu th nht tr xung cho nn bn
ng bao gi t * u tin, bi v nh th bt k chui no cng u tha mn
case. Hy t nhng mu d xy ra nht trn u, tip theo l cc mu c tn s
xut hin thp. Sau cng mi t mu * x l mi trng hp cn li. Nu
mun c th dng mu * t xen gia cc mu khc theo di (debug) li ca
chng trnh (nh in ra ni dung ca bin trong lnh case chng hn).
Lnh case trong v d trn r rng l sng sa hn chng trnh s dng if.
Tuy nhin c th kt hp chung cc mu so khp vi nhau khin cho case ngn
gn hn nh sau:
V du 3-12 case2.sh
#!/bin/sh
echo "Is it morning? Please answer yes or no"
read timeofday
case "$timeofday" in
"yes" | "y" | "Yes" | "YES" ) echo "Good Morning";;
"n*" | "N*" )
*)
esac
exit 0
V du 3-13 case3.sh
#!/bin/sh
echo "Is it morning? Please answer yes or no"
read timeofday
case "$timeofday" in
"yes" | "y" | "Yes" | "YES" )
echo "Good Morning"
echo "Up bright and early this morning?"
;;
[nN]* )
echo "Good Afternoon"
;;
*)
echo "Sorry, answer not recognised"
echo "Please answer yes or no"
exit 1
;;
esac
exit 0
4. Bi Tp
1. Bi 1: chy tt cc on lnh v d trong file hng dn phn 3. Chp
hnh chy cc file script v kt qu vo bo co.
2. Bi 2: vit chng trnh cho php nhp vo tn v mssv. Kim tra nu
mssv khng trng vi mnh th bt nhp li. In ra mn hnh kt qu.
3. Bi 3: vit chng trnh cho php nhp vo mt s n. Kim tra nu n < 10
th bt nhp li. Tnh tng cc s t 1-> n. In kt qu ra mn hnh.
4. Bi 4: vit trnh cho php nhp vo mt chui. Kim tra chui c tn ti
trong mt file text (v d test.txt) cng th mc hay khng.
5.Tham Kho
Gio trnh lp trnh Linux Shell Script
Linux Shell Scripting- A Beginner's handbook
Standard Wildcards and Relugar Expressions