🔙 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]