Professional Documents
Culture Documents
T−¬ng t¸c
Tr−êng hîp ®−îc coi lµ ®¬n gi¶n khi sö dông shell, shell ®îi ng−êi sö dông gâ c¸c lÖnh t¹i
dÊu nh¾c, sau ®ã göi tíi hÖ thèng yªu cÇu tõ lÖnh nhËn ®−îc.
LËp tr×nh
Shell cung cÊp tËp hîp c¸c lÖnh ®Æc biÖt mµ tõ ®ã cã thÓ t¹o nªn nh÷ng ch−¬ng tr×nh, khi
®ã ®−îc gäi lµ shell script. Trong thùc tÕ hÇu hÕt c¸c lÖnh nµy cã thÓ sö dông trong cña sæ
lÖnh cña Unix vµ ng−îc l¹i, c¸c lÖnh cña Unix ®Òu cã thÓ viÕt trong shell script. Shell script
rÊt tiÖn lîi trong viÖc gép nhiÒu lÖnh ®éc lËp vµo mét vµ thùc hiÖn nhiÒu lÇn.
Ngoµi nh÷ng lÖnh ®¬n gi¶n cña hÖ thèng Unix, shell cßn ®−îc bæ sung thªm c¸c cÊu tróc
phøc t¹p nh− ®iÒu khiÓn rÏ nh¸nh (if/case), vßng lÆp (for/while).
B¹n cã thÓ thay ®æi shell mÆc ®Þnh sang mét lo¹i kh¸c b»ng c¸ch sö dông lÖnh:
VÝ dô chuyÓn tõ Bourne shell sang C shell:
exec csh
hoÆc cã thÓ ®æi shell míi b»ng lÖnh:
chsh [<tªn shell>]
CÊu tróc lÖnh chsh nh− sau:
chsh [-s <tªn shell>] [ -l ] [<tªn ng−êi>]
chsh -l liÖt kª c¸c lo¹i shell hiÖn cã (th«ng tin chøa trong tÖp /ect/shells).
Trong phÇn tiÕp theo, chóng t«i sÏ giíi thiÖu vÒ Bourne shell, lo¹i tiªu chuÈn, ®¬n gi¶n vµ
phæ dông nhÊt hiÖn nay trong c¸c hÖ thèng Unix.
#!/bin/sh
#vi du dau tien
echo “Vi du dau tien voi shell.”
B¹n cã thÓ sö dông vi, emacs, .. ®Ó so¹n th¶o tÖp trªn. Sau ®ã dïng lÖnh chmod ®Ó chuyÓn tÖp
vidu1 thµnh tÖp cã thÓ ch¹y ®−îc, lÖnh ®ã nh− sau:
chmod +x thidu1
§Ó ch¹y thö b¹n chØ viÖc gâ: vidu1 <enter>
ViÖc t¹o vµ dïng chmod ®Òu cÇn thùc hiÖn ®èi víi mçi tÖp sau khi t¹o ra vµ cÇn chuyÓn thµnh
tÖp ch¹y ®−îc, chóng t«i sÏ kh«ng nh¾c l¹i vÒ sau n÷a. Nh−ng ®èi tÖp ®∙ ®−îc chuyÓn mod
mét lÇn th× kh«ng cÇn lµm l¹i khi thay ®æi néi dung hay ®æi tªn.
Gi¶i thÝch:
- Dßng ®Çu tiªn lµ dßng ®Æc biÖt, dïng ®Ó x¸c ®Þnh lo¹i shell ®−îc sö dông vµ gäi ch−¬ng
tr×nh th«ng dÞch shell t−¬ng øng.
- Dßng thø hai b¾t ®Çu b»ng dÊu # ®Ó chØ mét dßng chó thÝch.
- LÖnh echo dïng ®Ó in ra mµn h×nh x©u ký tù hay c¸c biÕn, echo cã cÊu tróc nh− sau:
echo [-n] [x©u ký tù]
NÕu cã chøc n¨ng -n, con trá kh«ng bÞ ng¾t xuèng dßng sau khi in x©u ký tù.
Ngoµi ra, bªn trong x©u x©u ký tù c¸c b¹n cßn cã thÓ sö dông mét sè chøc n¨ng kh¸c nh−:
\b lïi l¹i mét ký tù (backspace).
\c kh«ng xu«ng dßng (nh− -n).
\n xuèng dßng.
\t in ra ký tù tab.
\\ in ra ký tù \.
\0n in ra ký tù cã sè n (sè thËp ph©n) trong b¶ng m∙ ASCII.
C¸c b¹n cã thÓ in ra nh÷ng ký tù ®Æc biÖt b»ng c¸ch ®Æt sau ký tù \, vÝ dô: \” ®Ó in ký tù
nh¸y kÐp (”) ra mµn h×nh.
VÝ dô:
echo “\”Thong bao co loi! \”, \c \007”
#!/bin/sh
#vi du 2
echo
Trong ®ã lÖnh ls -l lµ mét lÖnh cña hÖ thèng ®−îc thùc hiÖn mµ kh«ng cÇn gâ tõ dÊu nh¾c.
Ngoµi ra tÊt c¶ c¸c lÖnh vµ tham sè kh¸c cña hÖ thèng ®Òu cã thÓ ®−îc thùc hiÖn mét c¸ch
t−¬ng tù, vÝ dô nh−: cd, cp, mkdir, chmod, cat, ...
#!/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 [$-]"
C¸c b¹n cã thÓ hiÓu thªm khi thùc hiÖn lÖnh: vidu3 vi du 3
Gi¶i thÝch:
- Trong ®ã, $0 lµ biÕn chøa tªn cña tÖp võa ch¹y.
- $n, n=1,..9 lµ c¸c tham sè dßng lÖnh ®−îc ®−a vµ khi ch¹y.
- $$ lµ chØ sè cña tÖp võa ch¹y (ID process).
- $# lµ sè tham sè dßng lÖnh ®∙ ®−¬c ®−a vµo.
- $@ liÖt kª tÊt c¶ c¸c tham sè dßng lÖnh.
- @- cê cña process.
T−¬ng tù nh− c¸c ng«n ng÷ lËp tr×nh kh¸c, shell script cung cÊp c¸c phÐp “g¸n” vµ “lÊy”
gi¸ trÞ cña biÕn. VÝ dô cã biÕn víi tªn var, viÖc g¸n vµ lÊy gi¸ trÞ ®−îc hiÓu nh− sau:
var = <gi¸ trÞ> gi¸ trÞ ë ®©y cã thÓ lµ mét sè, mét x©u ký tù hay tõ mét biÕn kh¸c.
$var dïng ®Ó lÊy gi¸ cña biÕn var.
#!/bin/sh
#Vi du 4
echo “Ban ten gi: “
read ten
echo “Chao ban $ten”
Gi¶i thÝch:
- read dïng ®Ó nhËn gi¸ trÞ tõ bµn phÝm sau ®ã g¸n vµo biÕn ten.
- $ten tr¶ ra gi¸ trÞ mµ nã l−u tr÷.
LÖnh read cßn cã thÓ nhËn nhiÒu biÕn cïng mét lóc vµ cã cÊu tróc nh− sau:
read <biÕn 1> [biÕn 2] [biÕn 3] ...
VÝ dô:
read ten dienthoai diachi
5. Ph©n biÖt dÊu huyÒn ( ` ), nh¸y ®¬n ( ' ) vµ nh¸y kÐp ( " )
Trong shell cã ba dÊu `, “, ‘ ®−îc dïng trong c¸c lÖnh in ra mµn h×nh hay lÖnh g¸n, nh−ng ý
nghÜa vµ ph−¬ng thøc thùc hiÖn ®èi víi nh÷ng dÊu nµy lµ kh¸c nhau.
5.1 DÊu ( ` )
VÝ dô trong mét tÖp shell cã nh÷ng lÖnh sau:
currentdir = `pwd`
LÖnh thø nhÊt sÏ ®−îc thùc hiÖn vµ g¸n ®−êng dÉn hiÖn thêi vµo biÕn currentdir, lÖnh thø hai
®−îc thùc hiÖn vµ ®Õm sè dßng trong tÖp cã tªn trong $filename råi g¸n vµo biÕn linecount.
Nh− vËy b¹n cã thÓ hiÓu mét c¸ch ®¬n gi¶n lµ nh÷ng g× viÕt trong gi÷a hai dÊu ` ` sÏ ®−îc coi
lµ lÖnh cña hÖ thèng vµ ®−îc thùc hiÖn, nh÷ng tham sè sau c¸c lÖnh hÖ thèng còng ®−îc tù
®éng g¸n trong phÇn nµy.
B¹n cã thÓ dÔ thÊy sù kh¸c biÖt cña hai dÊu nh¸y ®¬n vµ nh¸y kÐp qua nh÷ng dßng lÖnh trªn,
®èi víi nh¸y kÐp (“), khi in ra sÏ ®−îc thùc hiÖn víi gi¸ trÞ cña biÕn sau dÊu $. §èi víi dÊu
nh¸y ®¬n (‘) th× sÏ in ra y nguyªn nh− trong dßng v¨n b¶n. Th«ng th−êng dÊu nh¸y ®¬n Ýt
®−îc sö dông nh−ng l¹i rÊt tiÖn lîi khi muèn in y nguyªn mét dßng v¨n b¶n, ®Æc biÖt lµ khi cã
c¸c ký tù ®Æc biÖt nh− $, \.
Qua vÝ dô d−íi ®©y b¹n cã thÓ hiÓu râ h¬n cÊu tróc vßng lÆp for.
VÝ dô 5: VÝ dô vÒ vßng lÆp for.
#!/bin/sh
#Vi du 5
Cã thÓ gi¶i thÝch nh− sau: víi mçi letter trong word th× thùc hiÖn nh÷ng lÖnh n»m trong do-
done, trong vÝ dô trªn bao gåm t¨ng biÕn count vµ in biÕn letter ra mµn h×nh.
Chó ý: Trong vÝ dô trªn cã dïng lÖnh expr ®Ó gäi lÖnh thùc hiÖn tÝnh to¸n cña hÖ thèng tÝnh
phÐp céng tr−íc khi g¸n vµo biÕn count.
#!/bin/sh
#Vi du 6
word= "abcde" # khëi t¹o mét x©u
dem = 0 # khëi t¹o biÕn count
while [ $count –lt 5 ] # vßng lÆp víi biÕn letter
do # lÖnh b¾t ®Çu vßng lÆp
count=`expr $count + 1` # t¨ng biÕn count lªn 1
echo "Letter $count is [$letter]" # in ra biÕn letter
done # lÖnh kÕt thóc vßng lÆp
C¸c b¹n cã thÓ thÊy ngay cÊu tróc hai vßng lÆp trªn gÇn hoµn toµn gièng nhau, chØ kh¸c
dßng for/while. Trong vÝ dô trªn, $count -lt 5 ®−îc coi lµ ®iÒu kiÖn cña vßng lÆp. PhÐp so
s¸nh “-lt” lµ phÐp so s¸nh “nhá h¬n hoÆc b»ng” (less-than) trong lÖnh test cña Unix/Linux.
LÖnh kiÓm tra ®iÒu kiÖn trªn sÏ tr¶ ra gi¸ ®óng (1) trÞ hoÆc sai (0) ®Ó thùc hiÖn tiÕp hay tho¸t
khái vßng lÆp.
Ngoµi phÐp so s¸nh “-lt" cßn cã -gt-lín h¬n, -eq-b»ng, -ne-kh«ng b»ng. Trong phÇn phô
lôc chóng t«i cã liÖt kª l¹i c¸c lÖnh, tham sè vµ phÐp to¸n cña shell, c¸c b¹n cã thÓ ®äc ®Ó biÕt
thªm c¸c phÐp to¸n kh¸c.
if [ <®iÒu kiÖn> ]
then
<lÖnh>
[ elif <lÖnh> then <lÖnh> ] ...
[ else <lÖnh> ]
fi
§èi víi cÊu tróc nµy cã hai d¹ng, ®¬n gi¶n vµ phøc t¹p. Sau ®©y chóng t«i sÏ giíi thiÖu hai
vÝ dô ®Ó c¸c b¹n hiÓu c¸ch sö dông.
VÝ dô 7: CÊu tróc if ®¬n gi¶n.
#!/bin/sh
#Vi du 7a
echo “Nhap so a: ”
read a
echo “Nhap so b: ”
read b
if [ $a –lt $b ] #kiÓm tra a nhá h¬n b kh«ng
then
echo “so a nho hon so b.”
elif [ $a –eq $b ] #kiÓm tra nÕu a b»ng b
then
echo “so a bang so b.”
else #tr−êng hîp cßn l¹i
echo “so a lon hon so b.”
fi #kÕt thóc
VÝ dô trªn thùc hiÖn ®èi víi c¸c sè, d−íi ®©y lµ vÝ dô ®èi víi ®−êng dÉn vµ tÖp trªn ®Üa.
Trong vÝ dô trªn, f lµ cê kiÓm tra sù tån t¹i cña mét tÖp, d lµ cê ®Ó kiÓm tra sù tån t¹i mét th−
môc.
VÝ dô 8: CÊu tróc if phøc t¹p. Trong vÝ dô nµy b¹n sÏ hiÓu c¸ch sö dông ®iÒu kiÖn kÐp; &&
(vµ), || (hoÆc).
#!/bin/sh
#Vi du 8a
echo “Nhap so a: ”
read a
echo “Nhap so b: ”
read b
echo “Nhap so c: ”
read c
Trong vÝ dô trªn, && (vµ) lµ dÊu kiÓm tra kÐp ®Ó kÕt hîp hai ®iÒu kiÖn. Ta cã thÓ hiÓu ®iÒu
kiÖn sau if nh− sau: “NÕu a nhá h¬n c vµ b nhá h¬n c th× ...” Ngoµi ra cßn cã || (... hoÆ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 <biÕn>
in
biÕn-1)
<lÖnh>
biÕn-2)
<lÖnh>
biÕn-3)
<lÖnh>
...
*) #cßn l¹i
exit
esac
VÝ dô 9: VÝ dô vÒ case ®èi víi tham sè ®Çu vµo cña mét tÖp ch−¬ng tr×nh.
#!/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ô trªn ®∙ ®−a ra c¸ch sö dông cÊu tróc case, ®ång thêi giíi thiÖu c¸ch nhËn vµ xö
lý tham sè ®Çu vµo khi ch¹y mét tÖp shell script. LÖnh shift lµ lÖnh dÞch tham sè ®Çu vµo sang
tr¸i 1 ®Ó thùc hiÖn c¸c tham sè tiÕp theo. §Æc biÖt trong ®ã cßn chØ c¸ch gäi m¸y tÝnh sè víi
sè cÇn tÝnh ®−îc ®−a vµo tr−íc.
6.6 Hµm
Shell hç trî khai b¸o vµ sö dông hµm con, ®©y lµ mét hç trî rÊt h÷u Ých nh−ng cÇn ph¶i khai
b¸o trong phÇn khëi ®éng cña ng−êi sö dông, cô thÓ lµ trong tÖp .profile.
Mét vÝ dô ®¬n gi¶n:
uppercase()
{
echo $1 | tr 'abcdefghijklmnopqrstuvwxyz' \
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
}
Hµm trªn dïng ®Ó sö dông lÖnh tr cña hÖ thèng nh»m chuyÓn c¸c ch÷ th−êng thµnh ch÷ hoa.
ViÖc gäi hµm trªn chØ cÇn viÕt:
uppercase “thu chuyen doi”
hoÆc
smallword = “thu chuyen doi”
uppercase “$smallword”
Nh−ng nh− ®∙ nãi vÒ sù kh¸c biÖt cña kÕt qu¶ trong dÊu nh¸y kÐp, kÕt qu¶ cña hai dßng lÖnh
sau:
largeword = `uppercase “$smallword”`
#!/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
Trong vÝ dô trªn cã sö dông mét vµi kü thuËt nh− ®äc phÇn cuèi cña tÖp ®Çu vµo (víi lÖnh
tail)sau ®ã l¹i lÊy dßng ®Çu cña ®o¹n ®ã (víi lÖnh head -1) ®Ó lÊy ra ®−îc tõng dßng tõ trªn
xuèng cña tÖp ®Çu vµo. Hai tham sè -c1-8 cña lÖnh wc dïng ®Ó bá phÇn tªn tÖp trong kÕt qu¶
liÖt kª sè dßng trong tÖp ®ã. Ngoµi ra, c¸c b¹n cã thÓ dïng lÖnh:
VÝ dô:
if test $# -gt 0 nÕu cã tham sè
if [ -n “$1” ] nÕu tham sè kh¸c trèng
if [ $count -lt 5 ] nÕu gi¸ trÞ cña biÕn count nhá h¬n 5
Phô lôc
Danh s¸ch phÐp to¸n, lÖnh vµ tham sè m« tr−êng
+ phÐp céng
- phÐp trõ
* phÐp nh©n
/ phÐp chia
% phÐp lÊy phÇn d−
== so s¸nh b»ng
!= so s¸nh kh«ng b»ng
< so s¸nh nhá h¬n
> so s¸nh lín h¬n
>= so s¸nh lín h¬n hoÆc b»ng
<= so s¸nh nhá h¬n hoÆc b»ng
|| hoÆc
&& vµ