Professional Documents
Culture Documents
2. Mc ch ca shell
Shell c 3 mc ch chnh nh sau:
- Tng tc (interactive use)
- t bin mi trng i vi mi ngi s dng
- Lp trnh
Tng tc
Trng hp c coi l n gin khi s dng shell, shell i ngi s dng g cc lnh ti
du nhc, sau gi ti h thng yu cu t lnh nhn c.
Lp trnh
Shell cung cp tp hp cc lnh c bit m t c th to nn nhng chng trnh, khi
c gi l shell script. Trong thc t hu ht cc lnh ny c th s dng trong ca s
lnh ca Unix v ngc li, cc lnh ca Unix u c th vit trong shell script. Shell script
rt tin li trong vic gp nhiu lnh c lp vo mt v thc hin nhiu ln.
Ngoi nhng lnh n gin ca h thng Unix, shell cn c b sung thm cc cu trc
phc tp nh iu khin r nhnh (if/case), vng lp (for/while).
Trong phn tip theo, chng ti s gii thiu v Bourne shell, loi tiu chun, n gin v
ph dng nht hin nay trong cc h thng Unix.
#!/bin/sh
#vi du dau tien
echo Vi du dau tien voi shell.
Bn c th s dng vi, emacs, .. son tho tp trn. Sau dng lnh chmod chuyn tp
vidu1 thnh tp c th chy c, lnh nh sau:
chmod +x thidu1
chy th bn ch vic g: vidu1 <enter>
Vic to v dng chmod u cn thc hin i vi mi tp sau khi to ra v cn chuyn thnh
tp chy c, chng ti s khng nhc li v sau na. Nhng i tp c chuyn mod
mt ln th khng cn lm li khi thay i ni dung hay i tn.
Gii thch:
- Dng u tin l dng c bit, dng xc nh loi shell c s dng v gi chng
trnh thng dch shell tng ng.
- Dng th hai bt u bng du # ch mt dng ch thch.
- Lnh echo dng in ra mn hnh xu k t hay cc bin, echo c cu trc nh sau:
echo [-n] [xu k t]
Nu c chc nng -n, con tr khng b ngt xung dng sau khi in xu k t.
Ngoi ra, bn trong xu xu k t cc bn cn c th s dng mt s chc nng khc nh:
\b li li mt k t (backspace).
\c khng xung dng (nh -n).
\n xung dng.
\t in ra k t tab.
\\ in ra k t \.
\0n in ra k t c s n (s thp phn) trong bng m ASCII.
Cc bn c th in ra nhng k t c bit bng cch t sau k t \, v d: \ in k t
nhy kp () ra mn hnh.
V d:
echo \Thong bao co loi! \, \c \007
#!/bin/sh
#vi du 2
echo
#!/bin/sh
#Vi du 3
echo "Ten tep [$0]"
echo "Bien vao thu nhat [$1]"
echo "Bien vao thu hai [$2]"
echo "Chi so cua process [$$]"
echo "So bien dau vao [$#]"
echo "Tat ca cac bien dau vao [$@]"
echo "Co cua process [$-]"
Gii thch:
- Trong , $0 l bin cha tn ca tp va chy.
- $n, n=1,..9 l cc tham s dng lnh c a v khi chy.
- $$ l ch s ca tp va chy (ID process).
- $# l s tham s dng lnh c a vo.
- $@ lit k tt c cc tham s dng lnh.
- @- c ca process.
Tng t nh cc ngn ng lp trnh khc, shell script cung cp cc php gn v ly
gi tr ca bin. V d c bin vi tn var, vic gn v ly gi tr c hiu nh sau:
var = <gi tr> gi tr y c th l mt s, mt xu k t hay t mt bin khc.
$var dng ly gi ca bin var.
#!/bin/sh
#Vi du 4
echo Ban ten gi:
read ten
echo Chao ban $ten
Gii thch:
- read dng nhn gi tr t bn phm sau gn vo bin ten.
- $ten tr ra gi tr m n lu tr.
Lnh read cn c th nhn nhiu bin cng mt lc v c cu trc nh sau:
read <bin 1> [bin 2] [bin 3] ...
V d:
read ten dienthoai diachi
5.1 Du ( ` )
V d trong mt tp shell c nhng lnh sau:
currentdir = `pwd`
Lnh th nht s c thc hin v gn ng dn hin thi vo bin currentdir, lnh th hai
c thc hin v m s dng trong tp c tn trong $filename ri gn vo bin linecount.
Nh vy bn c th hiu mt cch n gin l nhng g vit trong gia hai du ` ` s c coi
l lnh ca h thng v c thc hin, nhng tham s sau cc lnh h thng cng c t
ng gn trong phn ny.
Bn c th d thy s khc bit ca hai du nhy n v nhy kp qua nhng dng lnh trn,
i vi nhy kp (), khi in ra s c thc hin vi gi tr ca bin sau du $. i vi du
nhy n () th s in ra y nguyn nh trong dng vn bn. Thng thng du nhy n t
c s dng nhng li rt tin li khi mun in y nguyn mt dng vn bn, c bit l khi c
cc k t c bit nh $, \.
6. Cc cu trc phc tp
Nh gii thiu, ngoi nhng lnh n gin nh c, in ra mn hnh v thc hin cc lnh
h thng, shell cn h tr vic s dng cc lnh phc tp hn nh if-then-else, for/while.
Phn di y chng ti s gii thiu n nhng cu trc ny.
#!/bin/sh
#Vi du 5
C th gii thch nh sau: vi mi letter trong word th thc hin nhng lnh nm trong do-
done, trong v d trn bao gm tng bin count v in bin letter ra mn hnh.
Ch : Trong v d trn c dng lnh expr gi lnh thc hin tnh ton ca h thng tnh
php cng trc khi gn vo bin count.
V d 6: V d v vng lp while.
#!/bin/sh
#Vi du 6
word= "abcde" # khi to mt xu
dem = 0 # khi to bin count
while [ $count lt 5 ] # vng lp vi bin letter
do # lnh bt u vng lp
count=`expr $count + 1` # tng bin count ln 1
echo "Letter $count is [$letter]" # in ra bin letter
done # lnh kt thc vng lp
Cc bn c th thy ngay cu trc hai vng lp trn gn hon ton ging nhau, ch khc
dng for/while. Trong v d trn, $count -lt 5 c coi l iu kin ca vng lp. Php so
snh -lt l php so snh nh hn hoc bng (less-than) trong lnh test ca Unix/Linux.
Lnh kim tra iu kin trn s tr ra gi ng (1) tr hoc sai (0) thc hin tip hay thot
khi vng lp.
Ngoi php so snh -lt" cn c -gt-ln hn, -eq-bng, -ne-khng bng. Trong phn ph
lc chng ti c lit k li cc lnh, tham s v php ton ca shell, cc bn c th c bit
thm cc php ton khc.
if [ <iu kin> ]
then
<lnh>
[ elif <lnh> then <lnh> ] ...
[ else <lnh> ]
fi
i vi cu trc ny c hai dng, n gin v phc tp. Sau y chng ti s gii thiu hai
v d cc bn hiu cch s dng.
V d 7: Cu trc if n gin.
#!/bin/sh
#Vi du 7a
echo Nhap so a:
read a
echo Nhap so b:
read b
if [ $a lt $b ] #kim tra a nh hn b khng
then
echo so a nho hon so b.
elif [ $a eq $b ] #kim tra nu a bng b
then
echo so a bang so b.
else #trng hp cn li
echo so a lon hon so b.
fi #kt thc
#!/bin/sh
#Vi du 8a
echo Nhap so a:
read a
echo Nhap so b:
read b
echo Nhap so c:
read c
#!/bin/sh
#Vi du 8b
if [ -f $dir/$file ] || [ -f $dir/$newfile ]
then
echo "Hoac tep [$file] "
echo "hoac tep moi [$newfile] da ton tai"
case <bin>
in
bin-1)
<lnh>
bin-2)
<lnh>
bin-3)
<lnh>
...
*) #cn li
exit
esac
#!/bin/sh
#Vi du 9
size=0
page=200
option =
while [ "$1" != "" ]
do
case $1
in
-?) echo Su dung cac tham so l,-p,-s.
exit;;
-l) line = 50
page = 500
option = $option page[$page] line[$line]
shift;;
-p) line = 40
Trong v d trn a ra cch s dng cu trc case, ng thi gii thiu cch nhn v x
l tham s u vo khi chy mt tp shell script. Lnh shift l lnh dch tham s u vo sang
tri 1 thc hin cc tham s tip theo. c bit trong cn ch cch gi my tnh s vi
s cn tnh c a vo trc.
6.6 Hm
uppercase()
{
echo $1 | tr 'abcdefghijklmnopqrstuvwxyz' \
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
}
Hm trn dng s dng lnh tr ca h thng nhm chuyn cc ch thng thnh ch hoa.
Vic gi hm trn ch cn vit:
uppercase thu chuyen doi
hoc
smallword = thu chuyen doi
uppercase $smallword
Nhng nh ni v s khc bit ca kt qu trong du nhy kp, kt qu ca hai dng lnh
sau:
largeword = `uppercase $smallword`
7. Lm vic vi cc tp
Trong v d 7b chng ti gii thiu cch kim tra s tn ti ca mt tp hay mt ng dn
nn trong phn ny s khng cp n na m ch a ra cch c v ghi mt tp.
#!/bin/sh
#Vi du dem so tep trong thu muc
count=1
for file in `ls -1 *`
do
echo "$count: $file" >> $mnu0
count=`expr $count + 1`
done
V d:
if test $# -gt 0 nu c tham s
if [ -n $1 ] nu tham s khc trng
if [ $count -lt 5 ] nu gi tr ca bin count nh hn 5
Ph lc
Danh sch php ton, lnh v tham s m trng
+ php cng
- php tr
* php nhn
/ php chia
% php ly phn d
== so snh bng
!= so snh khng bng
< so snh nh hn
> so snh ln hn
>= so snh ln hn hoc bng
<= so snh nh hn hoc bng
|| hoc
&& v
echo in ra mn hnh
read c t bn phm