🔙 Quay lại trang tải sách pdf ebook Cơ Bản Về Linux Shell Script
Ebooks
Nhóm Zalo
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 Æ„ dfich 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 Æfinh 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 Æfinh 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 Æfinh 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 cfln Æ−Ó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), vflng lÆp (for/while).
VietHung soft group - [email protected]
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 dfich 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 dflng 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, cfln sˆ dÙng mÈt lo¹i kh¸c cho vi÷c t−¨ng t¸c. T÷p /etc/passwd sœ x¸c Æfinh lo¹i shell nµo sœ Æ−Óc sˆ dÙng mÆc Æfinh trong h÷ thËng cho mÁi phi™n lµm vi÷c cÒa b¹n. Trong ph«n cuËi cÒa dflng 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 Æfinh 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 []
C u trÛc l÷nh chsh nh− sau:
chsh [-s ] [ -l ] []
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 - [email protected]
B. Bourne shell
1. In mÈt dflng 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 dflng 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
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:
- Dflng Æ«u ti™n lµ dflng ÆÆc bi÷t, dÔng Æ” x¸c Æfinh lo¹i shell Æ−Óc sˆ dÙng vµ g‰i ch−¨ng tr×nh th´ng dfich shell t−¨ng ¯ng.
- Dflng th¯ hai bæt Æ«u bªng d u # Æ” chÿ mÈt dflng 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 bfi ngæt xuËng dflng sau khi in x©u k˝ t˘. Ngoµi ra, b™n trong x©u x©u k˝ t˘ c¸c b¹n cfln 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 dflng (nh− -n).
\n xuËng dflng.
\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 - [email protected]
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µ Æfinh 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Ë dflng 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Ë dflng l÷nh Æ∙ Æ−¨c Æ−a vµo.
- $@ li÷t k™ t t c¶ c¸c tham sË dflng 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¸ trfi cÒa bi’n. V› dÙ c„ bi’n vÌi t™n var, vi÷c g¸n vµ l y gi¸ trfi Æ−Óc hi”u nh− sau: var = gi¸ trfi Î Æ©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 - [email protected]
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¸ trfi tı bµn ph›m sau Æ„ g¸n vµo bi’n ten.
- $ten tr¶ ra gi¸ trfi mµ n„ l−u tr˜.
L÷nh read cfln 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 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¸ trfi 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 cfln l¹i. ßËi vÌi bi’n cuËi cÔng, n’u kh´ng cfln d˜ li÷u th× sœ nhÀn gi¸ trfi 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 - [email protected]
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Ë dflng 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 dflng v› dÙ sau:
myname = "Viet Hung" # g¸n gi¸ trfi 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 dflng l÷nh tr™n, ÆËi vÌi nh¸y k–p (ì), khi in ra sœ Æ−Óc th˘c hi÷n vÌi gi¸ trfi cÒa bi’n sau d u $. ßËi vÌi d u nh¸y ƨn (ë) th× sœ in ra y nguy™n nh− trong dflng 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 dflng 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 cfln 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 vflng lÆp: for
C u trÛc vflng lÆp for Æ−Óc x©y d˘ng nh− sau:
for in
do
done
Qua v› dÙ d−Ìi Æ©y b¹n c„ th” hi”u r‚ h¨n c u trÛc vflng lÆp for.
V› dÙ 5: V› dÙ v“ vflng lÆp for.
#!/bin/sh
#Vi du 5
VietHung soft group - [email protected]
word= "abcde" # khÎi t¹o mÈt x©u dem = 0 # khÎi t¹o bi’n count for letter in $word # vflng lÆp vÌi bi’n letter do # l÷nh bæt Æ«u vflng 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 vflng 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 vflng lÆp: while
C u trÛc cÒa vflng lÆp while Æ−Óc th” hi÷n nh− sau:
while [ <Æi“u ki÷n> ]
do
done
V› dÙ 6: V› dÙ v“ vflng 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 ] # vflng lÆp vÌi bi’n letter do # l÷nh bæt Æ«u vflng 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 vflng lÆp
C¸c b¹n c„ th” th y ngay c u trÛc hai vflng lÆp tr™n g«n hoµn toµn giËng nhau, chÿ kh¸c dflng for/while. Trong v› dÙ tr™n, $count -lt 5 Æ−Óc coi lµ Æi“u ki÷n cÒa vflng 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) trfi hoÆc sai (0) Æ” th˘c hi÷n ti’p hay tho¸t kh·i vflng lÆp.
Ngoµi ph–p so s¸nh ì-lt" cfln 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 - [email protected]
ChÛ ˝: Trong ph«n Æi“u ki÷n cÒa vflng 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 vflng lÆp: until
ChÛng ta c„ th” hi”u vflng 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
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
[ elif then ] ...
[ else ]
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 cfln 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 - [email protected]
#!/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 cfln 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 - [email protected]
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
in
bi’n-1)
bi’n-2)
bi’n-3)
...
*) #cfln 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 - [email protected]
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 dfich tham sË Æ«u vµo sang tr¸i 1 Æ” th˘c hi÷n c¸c tham sË ti’p theo. ߯c bi÷t trong Æ„ cfln 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 dflng l÷nh sau:
largeword = `uppercase ì$smallwordî`
VietHung soft group - [email protected]
largeword = `uppercase $smallword`
lµ kh¸c nhau. Dflng th¯ nh t tr¶ ra: ìTHU CHUYEN DOIî, cfln 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 dflng Æ«u cÒa Æo¹n Æ„ (vÌi l÷nh head -1) Æ” l y ra Æ−Óc tıng dflng 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Ë dflng trong t÷p Æ„. Ngoµi ra, c¸c b¹n c„ th” dÔng l÷nh:
Cat >> <<-EOA
Æ” t¹o ra mÈt t÷p tr−Ìc vÌi t™n trong .
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 - [email protected]
C„ c¸c tham sË nh− sau:
ßi“u ki÷n vÌi c¸c t÷p, th− mÙc:
-f s˘ tÂn t¹i cÒa t÷p th´ng th−Íng.
-d s˘ tÂn t¹i cÒa th− mÙc.
-c s˘ tÂn t¹i t÷p d¹ng k˝ t˘.
-r s˘ tÂn t¹i vµ c„ th” Ɖc Æ−Óc.
-s s˘ tÂn t¹i vµ c„ k›ch th−Ìc lÌn h¨n 0.
-w s˘ tÂn t¹i vµ c„ th” ghi Æ−Óc.
-x 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¸ trfi 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 - [email protected]
$- 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 - [email protected]