Đăng ký Đăng nhập

Tài liệu Co ban velinuxshellscript

.PDF
15
322
100

Mô tả:

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 - [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 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 /bin/jsh /bin/ksh /bin/csh Bourne shell Bourne shell, cã thªm phÇn ®iÒu khiÓn t¸c vô (job control) Korn shell 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 [] 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 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 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 - [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µ ®Þ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Þ ë ®©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¸ 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 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 - [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è 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" echo "$myname" echo '$myname' # g¸n gi¸ trÞ cho mét biÕn # kÕt qu¶ ra mµn h×nh: Viet Hung # 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 in do 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 - [email protected] word= "abcde" # dem = 0 # for letter in $word # do count=`expr $count + 1` echo "Letter $count is [$letter]" done khëi t¹o mét x©u khëi t¹o biÕn count vßng lÆp víi biÕn letter # lÖnh b¾t ®Çu vßng lÆp # t¨ng biÕn count lªn 1 # in ra biÕn letter # 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 dodone, 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 done VÝ dô 6: VÝ dô vÒ vßng lÆp while. #!/bin/sh #Vi du 6 word= "abcde" # dem = 0 # while [ $count –lt 5 ] # do count=`expr $count + 1` echo "Letter $count is [$letter]" done khëi t¹o mét x©u khëi t¹o biÕn count vßng lÆp víi biÕn letter # lÖnh b¾t ®Çu vßng lÆp # t¨ng biÕn count lªn 1 # in ra biÕn letter # 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 - [email protected] 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 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 ] then echo “so a nho hon so b.” elif [ $a –eq $b ] then echo “so a bang so b.” else echo “so a lon hon so b.” fi #kiÓm tra a nhá h¬n b kh«ng #kiÓm tra nÕu a b»ng b #tr−êng hîp cßn l¹i #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 ] then echo “so c lµ so lon nhat.” fi #xem c cã lín nhÊt kh«ng 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 - [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) ... *) exit esac #cßn l¹i 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 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 - [email protected] 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 >> <<-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 if [ -n “$1” ] if [ $count -lt 5 ] nÕu cã tham sè nÕu tham sè kh¸c trèng 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 $1 $2 ... $# $@ $$ tªn tÖp ®ang ®−îc thùc hiÖn tham sè thø nhÊt 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 read in ra mµn h×nh ®äc tõ bµn phÝm $HOME/$home $dir $path th− môc chÝnh cña ng−êi dïng hiÖn t¹i VietHung soft group - [email protected]
- Xem thêm -

Tài liệu liên quan