You are on page 1of 15

C¬ b¶n vÒ Shell

A. Giíi thiÖu chung


1. Giíi thiÖu vÒ shell
Khi chóng ta muèn thùc hiÖn mét lÖnh nµo ®ã trong hÖ ®iÒu hµnh Unix chóng ta cÇn ph¶i ra
lÖnh ®Ó Unix hiÓu ®−îc chóng ta muèn lµm g×. ViÖc ra lÖnh nµy ®−îc thùc hiÖn qua shell. Nh−
vËy chóng ta cã thÓ hiÓu mét c¸ch ®¬n gi¶n shell lµ giao diÖn ®Ó giao tiÕp gi÷a ng−êi sö dông
vµ Unix. Shell nhËn lÖnh tõ ng−êi sö dông sau ®ã dÞch vµ chuyÓn ®Õn hÖ thèng nh÷ng ho¹t
®éng cÇn thùc hiÖn ®Ó ®¸p øng yªu cÇu.
HiÖn nay cã mét sè lo¹i shell trong c¸c hÖ thèng Unix, trong mét sè tr−êng hîp trong mét
hÖ thèng nµo ®ã cã thÓ cã mét hoÆc nhiÒu shell cïng tån t¹i. Mét sè lo¹i phæ biÕn ®ang tån t¹i
nh−: Bourne shell, Korn shell, C shell, ... Mçi lo¹i cã sù kh¸c nhau nh−ng tÊt c¶ ®Òu cung cÊp
®Çy ®ñ c«ng cô ®Ó thiÕt lËp m«i tr−êng giao tiÕp gi÷a ng−êi sö dông vµ Unix.

2. Môc ®Ých cña shell


Shell cã 3 môc ®Ých chÝnh nh− sau:
- T−¬ng t¸c (interactive use)
- §Æt biÕn m«i tr−êng ®èi víi mçi ng−êi sö dông
- LËp tr×nh

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.

§Æt biÕn m«i tr−êng ®èi víi mçi ng−êi sö dông


Unix shell x¸c ®Þnh c¸c biÕn ®Ó ®iÒu khiÓn m«i tr−êng cña ng−êi sö dông ®èi víi mçi
phiªn sö dông. ViÖc ®Æt c¸c biÕn nµy sÏ x¸c ®Þnh víi hÖ thèng nh÷ng tham sè nh− th− môc
nµo sÏ ®−îc sö dông lµm th− môc chÝnh, n¬i ®Æt mail, nh÷ng th− môc nµo ®−îc sö dông mÆc
®Þnh khi b¹n gäi ®Õn c¸c lÖnh Unix, ... Mét sè biÕn hÖ thèng cã thÓ ®−îc ®Æt trong tÖp khëi
®éng (start-up file) vµ ®−îc ®äc khi b¹n login (®¨ng nhËp). Trong tÖp khëi ®éng b¹n cã thÓ ®Æt
c¸c lÖnh cña Unix, nh−ng chó ý lµ nh÷ng lÖnh nµy sÏ ®−îc thùc hiÖn mçi khi b¹n login.

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).

VietHung soft group - viethung_group@email.com


Mét tÖp ch−¬ng tr×nh cña shell kh«ng quan träng ®Õn tªn vµ ®u«i, kh«ng cÇn dÞch còng nh−
kh«ng cã m«i tr−êng ph¸t triÓn. ViÖc so¹n th¶o mét tÖp shell cã thÓ sö dông bÊt kú mét c«ng
cô so¹n th¶o nµo, chØ cÇn ghi tÖp ®ã víi d¹ng text, sau ®ã ®æi thµnh d¹ng tÖp cã thÓ ch¹y
®−îc. Xem vÝ dô 1 trong phÇn sau ®Ó hiÓu thªm chi tiÕt.
Shell lu«n g¾n liÒn víi hÖ ®iÒu hµnh Unix, nh−ng ®Ó hiÓu vµ häc shell kh«ng nhÊt thiÕt b¹n
cÇn hiÓu s©u vÒ hÖ thèng còng nh− c¸c lÖnh cña Unix. Tuy nhiªn th«ng qua nh÷ng vÝ dô
chóng t«i nªu ë ®©y c¸c b¹n cã thÓ hiÓu thªm c¸ch sö dông lÖnh vµ biÕn hÖ thèng.
Chó ý: Chóng t«i chØ nh¾c ®Õn hÖ ®iÒu hµnh Unix khi giíi thiÖu còng nh− h−íng dÉn sö dông,
nh−ng thùc tÕ hiÖn nay Linux lµ mét hÖ ®iÒu hµnh kÕ thõa cña Unix. Linux còng cã nh÷ng
shell t−¬ng tù vµ b¹n cã thÓ sö dông nh÷ng giíi thiÖu vÒ shell ë ®©y víi c¸c hÖ thèng Linux.

3. Nh÷ng lo¹i shell hiÖn thêi


HiÖn nay cã kh¸ nhiÒu lo¹i shell ®−îc sö dông trong c¸c hÖ thèng Unix, nh−ng ë ®©y chóng
t«i chØ ®Ò cËp ®Õn 3 lo¹i c¬ b¶n vµ phæ biÕn, ®ã lµ:
- Bourne shell, ®−îc coi lµ shell chuÈn, c« ®äng vµ lµ lo¹i ®¬n gi¶n nhÊt.
- Korn shell, cao cÊp h¬n Bourne shell vµ cho phÐp so¹n dßng lÖnh.
- C shell, sö dông có ph¸p cña ng«n ng÷ lËp tr×nh C vµ cã thªm nhiÒu chøc n¨ng tiÖn lîi.
Th«ng th−êng c¸c hÖ thèng cã Ýt nhÊt lµ mét lo¹i shell vµ th«ng th−êng Bourne shell ®−îc sö
dông ®Ó viÕt shell script, cßn sö dông mét lo¹i kh¸c cho viÖc t−¬ng t¸c.
TÖp /etc/passwd sÏ x¸c ®Þnh lo¹i shell nµo sÏ ®−îc sö dông mÆc ®Þnh trong hÖ thèng cho
mçi phiªn lµm viÖc cña b¹n. Trong phÇn cuèi cña dßng chøa tªn b¹n, b¹n cã thÓ t×m thÊy
th«ng tin vÒ lo¹i shell nµo ®−îc sö dông. Mçi khi b¹n login, hÖ thèng sÏ ®äc tÖp nµy ®Ó lÊy
th«ng tin khëi t¹o cho shell.
Th«ng tin cã thÓ gåm mét trong nh÷ng d¹ng sau:

/bin/sh Bourne shell


/bin/jsh Bourne shell, cã thªm phÇn ®iÒu khiÓn t¸c vô (job control)
/bin/ksh Korn shell
/bin/csh C shell

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.

VietHung soft group - viethung_group@email.com


B. Bourne shell
1. In mét dßng ch÷ ra mµn h×nh
VÝ dô 1: B¹n t¹o ra mét tÖp víi tªn vidu1, sau ®ã gâ vµo nh÷ng dßng sau:

#!/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”

2. Thùc hiÖn c¸c lÖnh hÖ thèng


VÝ dô 2: VÝ dô thùc hiÖn mét lÖnh cña hÖ thèng.

#!/bin/sh
#vi du 2
echo

VietHung soft group - viethung_group@email.com


echo “Danh sach cac thu muc va tep:”
ls –l
echo
echo “Vi tri hien thoi: ”`pwd`

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, ...

3. BiÕn vµ tham sè hÖ thèng


Còng nh− c¸c ng«n ng÷ lËp tr×nh, shell cã thÓ sö dông biÕn nh−ng kh«ng cÇn khai b¸o vµ
®Þnh nghÜa kiÓu. C¸c tham sè cña m«i tr−êng vµ hÖ thèng cã thÓ sö dông trùc tiÕp b»ng tªn.
Tªn cña c¸c tham sè th−êng lµ mét c¸i tªn, mét ký tù, sè hay mét trong c¸c ký hiÖu *, @, #,
?, -, $, !\^.
VÝ dô 3: VÝ dô vÒ dö sông tham sè hÖ thèng.

#!/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.

VietHung soft group - viethung_group@email.com


4. LÖnh vµo ra
LÖnh in ra echo nh− ®∙ ®−îc giíi thiÖu trong c¸c vÝ dô tr−íc, lÖnh read ®−îc dïng ®Ó ®äc
vµo tõ bµn phÝm.
VÝ dô 4: VÝ dô vÒ lÖnh ®äc vµo vµ in ra d÷ liÖu.

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

Khi b¹n gâ vµo: Hung 0123456 334 Nguyen Trai


B¹n dïng c¸c lÖnh sau ®Ó in thö c¸c biÕn ra mµn h×nh:

echo “Ten : $ten”


echo “Dien thoai : “ $dienthoai”
echo “Dia chi : $diachi”

Trªn mµn h×nh sÏ in ra:


Ten : Hung
Dien thoai: 0123456
Dia chi: 334 Nguyen Trai
Nh− vËy cã thÓ hiÓu nh− sau: C¸c biÕn ®−îc nhËn gi¸ trÞ lÇn l−ît cho ®Õn dÊu c¸ch, biÕn cuèi
cïng sÏ ®−îc nhËn toµn bé phÇn cßn l¹i. §èi víi biÕn cuèi cïng, nÕu kh«ng cßn d÷ liÖu th× sÏ
nhËn gi¸ trÞ rçng (null).

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`

VietHung soft group - viethung_group@email.com


linecount = `wc –l $filename`

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.

5.2 DÊu ( ' ) vµ ( " )


Kh¸c víi dÊu huyÒn ( ` ), nh÷ng th«ng tin gi÷a hai dÊu nh¸y (nh¸y ®¬n hoÆc nh¸y kÐp) ®−îc
coi lµ th«ng tin ®−îc sö dông trong lÖnh echo vµ sÏ ®−îc in ra mµn h×nh hay ®−îc g¸n vµo
biÕn d¹ng x©u. Nh− vËy, kh«ng thÓ viÕt c¸c lÖnh hÖ thèng gi÷a hai dÊu nh¸y mµ chØ c¸c ®Ó c¸c
x©u ký tù hay c¸c biÕn. Chóng ta xem xÐt nh÷ng dßng vÝ dô sau:

myname = "Viet Hung" # g¸n gi¸ trÞ cho mét biÕn


echo "$myname" # kÕt qu¶ ra mµn h×nh: Viet Hung
echo '$myname' # kÕt qu¶ ra mµn h×nh: $myname

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− $, \.

6. C¸c cÊu tróc phøc t¹p


Nh− ®∙ giíi thiÖu, ngoµi nh÷ng lÖnh ®¬n gi¶n nh− ®äc, in ra mµn h×nh vµ thùc hiÖn c¸c lÖnh
hÖ thèng, shell cßn hç trî viÖc sö dông c¸c lÖnh phøc t¹p h¬n nh− if-then-else, for/while.
PhÇn d−íi ®©y chóng t«i sÏ giíi thiÖu ®Õn nh÷ng cÊu tróc nµy.

6.1 CÊu tróc vßng lÆp: for


CÊu tróc vßng lÆp for ®−îc x©y dùng nh− sau:

for <biÕn ký tù> in <x©u>


do
<c¸c lÖnh cÇn thùc hiÖn>
done

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

VietHung soft group - viethung_group@email.com


word= "abcde" # khëi t¹o mét x©u
dem = 0 # khëi t¹o biÕn count
for letter in $word # 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ã 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.

6.2 CÊu tróc vßng lÆp: while


CÊu tróc cña vßng lÆp while ®−îc thÓ hiÖn nh− sau:

while [ <®iÒu kiÖn> ]


do
<c¸c lÖnh>
done

VÝ dô 6: VÝ dô vÒ vßng lÆp while.

#!/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.

VietHung soft group - viethung_group@email.com


Chó ý: Trong phÇn ®iÒu kiÖn cña vßng lÆp while còng nh− trong nh÷ng ®iÒu kiÖn kh¸c, sau
dÊu “[“ vµ tr−íc dÊu “]” b¾t buéc ph¶i cã dÊu tr¾ng (dÊu c¸ch).

6.3 CÊu tróc vßng lÆp: until


Chóng ta cã thÓ hiÓu vßng lÆp until t−¬ng tù nh− while. CÊu tróc cña vong lÆp until nh− sau:

until [ <®iÒu kiÖn> ]


do
<c¸c lÖnh>
done

6.4 CÊu tróc rÏ nh¸nh: if - else


CÊu tróc rÏ nh¸nh cã thÓ ®−îc hiÓu qua c¸c tõ khãa cã cÊu tróc nh− sau:

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.

VietHung soft group - viethung_group@email.com


#!/bin/sh
#Vi du 7b
if [ -f $dirname/$filename ]
then
echo "Tep [$filename] da ton tai."
elif [ -d $dirname ]
then
echo "Duong dan [$dirname] da ton tai."
else
echo "Ca duong dan [$dirname] va tep [$filename] khong ton
tai."
fi

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

if [ $a –lt $c ] && [ $b –lt $c ] #xem c cã lín nhÊt kh«ng


then
echo “so c lµ so lon nhat.”
fi

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"

VietHung soft group - viethung_group@email.com


elif [ -d $dir ]
then
echo "Duong dan [$dir] da ton tai"
else
echo "Ca duong dan [$dir], tep [$file va tep moi $newfile]
deu khong ton tai"
fi

6.5 CÊu tróc rÏ nh¸nh nhiÒu tr−êng hîp: case


CÊu tróc case cã thÓ ®−îc hiÓu qua tËp c¸c tõ khãa sau:

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

VietHung soft group - viethung_group@email.com


option = “$option page[$page] line[$line] “
shift;;
-s) size = 10;
shift 2;;
*) echo "Tham so vao khong co trong [p, l, s]";
exit;;
esac
if [ $size = 0 ]
then
size=`echo "$page / $lines" | bc`
else
lines=`echo "$page / $size" | bc`
fi
done
echo “$option $lines $size”

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

VietHung soft group - viethung_group@email.com


largeword = `uppercase $smallword`
lµ kh¸c nhau. Dßng thø nhÊt tr¶ ra: “THU CHUYEN DOI”, cßn dong thø hai se tra ra:
“THU”.

7. Lµm viÖc víi c¸c tÖp


Trong vÝ dô 7b chóng t«i ®∙ giíi thiÖu c¸ch kiÓm tra sù tån t¹i cña mét tÖp hay m«t ®−êng dÉn
nªn trong phÇn nµy sÏ kh«ng ®Ò cËp ®Õn n÷a mµ chØ ®−a ra c¸ch ®äc vµ ghi mét tÖp.

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

#Vi du doc va ghi tu tep inputfile sang tep outputfile


filelength=`wc -l $inputfile | cut -c1-8`
filelength=`expr $filelength + 0`
while $filelength
do
line=`tail -$filelength $inputfile | head -1`
words=`s_count_args $line`
echo "$line = $words words" >> $outputfile
file_length=`expr $filelength - 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:

Cat >> <tªn tÖp> <<-EOA

®Ó t¹o ra mét tÖp tr−íc víi tªn trong <tªn tÖp>.

8. T×m hiÓu lÖnh test


test lµ lÇ lÖnh kiÓm tra sù tån t¹i cña c¸c tÖp, th− môc vµ so s¸nh biÕn sè. CÊu tróc cña lÖnh
test nh− sau:
test <®iÒu kiÖn>
hoÆc [<®iÒu kiÖn>]

VietHung soft group - viethung_group@email.com


Cã c¸c tham sè nh− sau:
§iÒu kiÖn víi c¸c tÖp, th− môc:
-f <tªn> sù tån t¹i cña tÖp th«ng th−êng.
-d <tªn> sù tån t¹i cña th− môc.
-c <tªn> sù tån t¹i tÖp d¹ng ký tù.
-r <tªn> sù tån t¹i vµ cã thÓ ®äc ®−îc.
-s <tªn> sù tån t¹i vµ cã kÝch th−íc lín h¬n 0.
-w <tªn> sù tån t¹i vµ cã thÓ ghi ®−îc.
-x <tªn> sù tån t¹i vµ cã thÓ ch¹y ®−îc.
§iÒu kiÖn víi c¸c x©u ký tù:
-n s1 x©u s1 cã ®é dµi lín h¬n 0.
-z s1 x©u s1 cã ®é dµi b»ng 0.
s1 = s2 hai x©u s1 vµ s2 gièng nhau.
s1 != s2 hai x©u s1 vµ s2 kh«ng gièng nhau.
s1 < s2 x©u s1 ®øng tr−íc x©u s2 theo thø tù cña b¶ng m∙ ASCII.
s1 > s2 x©u s1 ®øng sau x©u s2 theo thø tù cña b¶ng m∙ ASCII.
string biÕn string kh«ng rçng (not null).
§iÒu kiÖn víi c¸c sè:
n1 -eq n2 so s¸nh b»ng.
n1 -ge n2 so s¸nh lín h¬n hoÆc b»ng.
n1 -gt n2 so s¸nh lín h¬n.
n1 -le n2 so s¸nh nhá h¬n hoÆc b»ng.
n1 -lt n2 so s¸nh nhá h¬n.
n1 -ne n2 so s¸nh kh«ng b»ng.

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

$0 tªn tÖp ®ang ®−îc thùc hiÖn


$1 tham sè thø nhÊt
$2 tham sè thø hai
...
$# sè tham sè
$@ liÖt kª tÊt c¶ c¸c tham sè
$$ chØ sè cña process

VietHung soft group - viethung_group@email.com


$- cê (flag)

+ 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µ

$USER tªn ng−êi sö dông hiÖn t¹i

echo in ra mµn h×nh


read ®äc tõ bµn phÝm

$HOME/$home th− môc chÝnh cña ng−êi dïng hiÖn t¹i


$dir
$path

VietHung soft group - viethung_group@email.com

You might also like