wA@As峹аѦB
pGzuܷQnToAåBQnnn޲znݩzDAAOiDzA Shell Scripts uOnDzߪ@DOI򥻤WA shell script IO妸ɡA YON@ǫOJ_Ӥ@AO Shell script ֦jj\ANOA LiHi{ (program) gAåBAݭngLsĶ (compiler) NA uܤKC[WAڭ̥izL shell script ²Ƨڭ̤`u@޲zA ӥBA Linux ҤA@ǪA (services) ҰʳOzL shell script A pGz script AѡAKKIoͰDɡAiuO|DULI ҥHAnnǤ@ǥLaI

1. O Shell Script
@@1.1 FDz shell scripts?
@@1.2 Ĥ@ script gP
@@1.3 g shell script }nߺDإ
2. ²檺 shell script mߡG
3. ΧP_G
@@3.1 Q test Oե\
@@3.2 QΧP_Ÿ [ ]
@@3.3 Shell script w]ܼ($0, $1...)
4. P_G
@@4.1 Q if .... then
@@4.2 Q case ..... esac P_
@@4.3 Q function \
5. j (loop)
@@5.1 while....do....done, until....do....done
@@5.2 for...do...done
6. shell script lܻP debug
7. Dm
8. w糧媺ijGhttp://phorum.vbird.org/viewtopic.php?t=23886

O Shell scripts H
oӦ쪺DӦ^ݬݡAO shell script OH shell ڭ̦b { bash wgLFAO@ӤrUڭ̻Ptηq@Ӥu㤶A script OԣH rWNqA script Oy}B@zNCyܬOA shell script Ow shell Ҽgy@Iz FڡHIA shell script OQ shell \Ҽg@ӡy{ (program)zAoӵ{Oϥί¤rɡAN@ shell ykPOgb̭A ftWܪkB޽uROPƬyɦV\AHFڭ̩ҷQnBzتC

ҥHA²檺A shell script NO DOS ~N妸 (.bat) A²檺\NON\hOJgb@_A ϥΪ̫ܻN one touch (@ɮ "shell script" AN@hӫO)A ӡA shell script 󴣨Ѱ}CBjBP޿P_n\AϥΪ̤]iHH shell Ӽg{AӤϥ C {yDzε{gykOI

Ao򻡱ziHAѤFܡHOI shell script iH²檺QݦO妸ɡA ]iHQO@ӵ{yABoӵ{yѩ󳣬OQ shell PuOA ҥHݭnsĶYiAB֦ (debug) uAҥHALiHUtκ޲zֳt޲znDC


FDz shell scripts?
oOӦnDAڤSF@wn shell script HڤSOTHASg{A ڷF٭n shell script OHnǥiiHڡHpG Linux zӨA zuOQny|ΡzӤwAAݭn shell script ]ٵLҿסAoLLhA 즳ŪɭԡAAӦnn@@@COApGzOuQnM Linux shߡA shell script NiAOH]G

  • ۰ʤƺ޲zn̾G
  • γz]DA޲z@DuO²檺ƱACѭni檺ȴNG dߵnɡBlܬyqBʱϥΪ̨ϥΥDABDUw]ƪAB DnsdߡB󤣭noILϥΪ̪MnDFCӳoǤu@A zQnۦʳBzA٬Og²檺{zC۰ʳBzRAYD~qzOH MOtΦ۰ʤu@nAaIoNon}n shell script աI

  • lܻP޲ztΪnu@G
  • Mڭ٨SAȱҰʪkALAo̥iH@UAڭ Linux tΪA ( services ) ҰʪAb /etc/init.d/ oӥؿUAҦɮ׳O scripts F t~A]A} (booting) L{]OQ shell script jMtΪ]wơA MANJUӪAȪ]wѼưڡI|ҨӻApGڭ̷QnsҰʨtεnɡA iHϥΡGy/etc/init.d/syslogd restartzA syslogd ɮ״NO script աI t~AڴgbY@N FC Wo{AҰ MySQL oӸƮwAȮɡATOiHҰʪA OùWoѬOX{yfailurezAӤ~o{AӬOҰ MySQL script |DʪHyŪKXzhյnJ MySQL AڭקL MySQL KXoMNnJѡ ӧF script ANhoӰDաIpӡA script TOݭnDzߪڡI

  • ²JI\G
  • ڭ̪tΦɡAjh|NoDzObtΰOA]NOڭ̱`쪺ytεnɡzA ڭ̥iHbTwXDʪhRtεnɡAYıDANߨq޲zA Ϊ̬Oߨ[j𪺳]wWhAp@ӡAzDiNFyۧګO@zoDzߥ\ա |ҨӻAڭ̥iHqL shell script hRyӫʥ]մX٬OsuѤANHצ IPz|ʡAҦpgL@׬寸n骺 shell script A NOγoӷQkhFOI

  • sO@G
  • AsӨA script ²檺\NOGyJ@Ǧb command line UFsOANLgJ scripts AӥѪ scripts ӱҰʤ@sꪺ command line OXJIzҦpG sWh ( iptables )A}J{Ǫ ( NOb /etc/rc.d/rc.local Y ) AOۦ\աI AFApGҼ{ program A scripts ]iHQAȬOڭ̧@jꪺOJb@ɮ׸̭A Ӫɮ״NiH桦@SSOqINOo²աI

  • ²ƳBzG
  • ѫe@ Wܪk awk {A ziHo{A awk iHΨӳBz²檺ƾڸƩOIҦp~檺BzڵC shell script \jjAҦpg shell script BzƾڸƪڡA rƪBzڵAgKAtפS(]b Linux į)A uOܤΪաI

  • 󥭥x䴩PDz߾{uG
  • XGҦ Unix Like WiH] shell script As MS Windows tC]iHΡA ~A shell script ykO۷˩MAݳݪorAӤOXA ܮeDzߡodzOziH[HҶqDzIڡI

    WodzOzҼ{Dz shell script SI㦹~A shell script ٥iH²檺H vi ӪsgAbOܤKnFIҥHA٬OijzDzߤ@UաC

    LAM shell script ٬O{ (program) AڤWA shell script BzƪtפWOӰC] shell script ΪO~OP bash shell @ǹw]uAҥHAL``|hIs~祃wA]ABtפWM񤣤WDzΪ{yC ҥHoA shell script Φbtκ޲zWOܦn@uAOΦbBzjqƭȹBWA NnFӥB٫ܳ·СA]GShell scripts t׸CA BϥΪ CPU 귽hAyD귽t}C٦nA ڭ̽Tܤ֬ݨQ shell script bijqƾڹB⪺AҥHAߪաI


    Ĥ@ script gP
    pPe쪺A shell script NO¤r (ASCII) Aڭ̥iHsoɮסA Moɮרڭ̤@hӫOAΪ̬OQΤ@ǹBP޿P_ڭ̹FYǥ\C ҥHաAnsoɮתeɡAMNݭnƦ bash shell OUF{ѡC ڭ̻LAnUFOݭn`Nƶb bash `wgLA b shell script gP˻ݭnΨoǪ`NƶG
    1. pPe bash command 쪺AOPѼƶhӪťշ|QF
    2. Ӫťզ]NQIAåB [tab] ]O|Qz|I
    3. pGŪ@ Enter Ÿ ( CR )^ANն}lӦROF
    4. ܩpG@檺eӦhAhiHϥ \[Enter] өܤU@F
    5. ~Aϥγ̦h # iѡI[b # ᭱rANQѤrӳQI
    p@ӡAڭ̦b script Ҽg{AN|Q@@檺CnFAoӵ{]ɦWO shell.sh nFApoɮסH²AiHUXӤkG ϥINOn shell.sh OiHQ檺NաIxIڬݭnϥ ./shell.sh ӤUFOH ٰOoڭ̦b bash ̭@jժAOO_QP PATH oܼƦA ҥHAnyثeoӥؿUYɮסzNݭn[W ./ oӥؿաIt~Az]iHN shell.sh bzaؿU ~/bin oӥؿAMQ PATH="$PATH":~/bin ]wA KKANz script o ^_^

    A sh shell.sh ]iHOHoO] /bin/sh NO /bin/bash A ϥ sh shell.sh YiDtΡAڷQnH bash \Ӱ shell.sh oɮפONC ӧڭ̤]iHQ sh ѼơAp -n -x ˬdPl shell.sh ykO_TOI ^_^


  • gĤ@ script
  • ׬OӪAnǪZ\nqa_Anǵ{OHA֩wOѡyqX Hello WorldIz oӦr}lIOKI򳾭Ng@ script ja@@@G
    [root@linux ~]# mkdir scripts; cd scripts
    [root@linux scripts]# vi sh01.sh
    #!/bin/bash
    # Program:
    #       This program is used to show "Hello World !" in screen.
    # History:
    # 2005/08/23	VBird	First release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    echo -e "Hello World ! \a \n"
    exit 0
    
    bڭ̳oӳ`AбNҦg script mzaؿ ~/scripts oӥؿA n޲zաIWgkAڥDnNӵ{gƬqAjPOoˡG
    1. Ĥ@ #!/bin/bash bŧio script ϥΪ shell W١G
      ]ڭ̨ϥΪO bash AҥHAnHy #!/bin/bash zӫŧioɮפykϥ bash ykIoӵ{QɡALNJ bash ҳ]wɡA åB bash Өϧڭ̩UOIoܭnI(bܦhpApGS]wno@A ӵ{ܥi|LkA]tΥiLkP_ӵ{ݭnϥΤ shell ӰڡI)

    2. {eŧiG
      script AFĤ@檺 #! OΨӫŧi shell ~AL # Oyѡzγ~I ҥHW{AĤGHUNOΨӻӵ{AC@ӻA ijz@wni script G1. eP\F 2. TF 3. @̻Pp觋F 4. ɤF5. v CoNU󥼨ӵ{gP debug OI

    3. DnܼƪŧiG
      ijȥnN@ǭnܼƳ]wnAӤH{A PATH O̭nI p@ӡAhiڭ̳o{biɡAiHUFOA Ӥg|OInաI

    4. Dn{
      NNDn{gnYiIboӨҤlANO echo @աI

    5. 榨Gi
      O_Ooڭ̦b bash ̭nQפ@ӫO榨\P_AiHϥ $? oܼƨ[ ڭ̤]iHQ exit oӫO{_AåB^Ǥ@ӼƭȵtΡC bڭ̳oӨҤlAڨϥ exit 0 AoN} script AåB^Ǥ@ 0 tΡA ҥHڰ槹o script AYۤUF echo $? hio 0 ȳI oŪӤ]DFAIQγo exit n \Aڭ٥iHۭq~TA o{ܱo[ smart OI
    UӰݬݵGO˧aH
    [root@linux scripts]# sh sh01.sh
    Hello World !
    
    
    z|ݨùOoˡAӥBٷ|ťyNz@nAOHٰOoe@쪺 printf aH echo ۨǯS]iHoͦP˪Ʊ LA echo n[W -e ѼƤ~I IbzgoӤp script AzNiHjnGyڤ]|g{FzII ²榳a ^_^

    t~AA]iHQΡGychmod a+x sh01.sh; ./sh01.shzӰo script OI

    g shell script }nߺDإ
    @Ө}nߺDiOܭnjab}lg{ɭԡA̮eoA {{gXӴNnFALnCApG{MA zۤvOܤjUC

    |ҨӻAۤvFۤvݨDAggF֪ script ڶiD IP ڡB nɤRP޲zڡB۰ʤWǤUn]wɰڵALANO]iFA ޲zDSӦhFA``P@ӵ{bPDWiA̫A쩳@~O̷sO_ӡA ӥBAIOAڨ쩳OF̡HH򰵨˪קHѪ@GbunR

    ҥHAӳbg{ɭԡAq`|JӪN{]pL{LOUӡA ӥBٷ|O@ǾvAp@ӡAnhF ܤ֫ܮeDڭקFǸơAHε{ק諸zP޿跧A b@WOPܦhܦhI

    t~Ab@Ҫ]wWACӤHҳۦPAFoΪҡA ڳ|ۦwqn@Ǥ@w|QΨ쪺ܼơAҦp PATH oӪNI oˤnաҥHAijz@wni}n script gߺDA bC script YBOnG

    ²檺 shell script m
    bĤ@ shell script gA۫HzӨ㦳򥻪g\OFC UӡAb}l`J{eAڭ̥Ӫ@Ǥ쪺²檺pdҦnFC UdҤAFG觋۷hAijzۦ漶gݬݡAgAPgeA oˤ~[`InIoAڭ̴N@Ӥ@ӨӪaI


  • ܼƤeѨϥΪ̨Mw
  • ܦhɭԧڭ̻ݭnϥΪ̿J@ǤeAn{iHQB@C ²檺ӻAjaӳw˹Ln骺gAw˪ɭԡALO|ݱzynw˨쨺ӥؿhHzܡH ϥΪ̿Jƪʧ@ANOϥΪ̿JܼƤeաC

    AٰOob bash ɭԡAڭ̦Ǩ@ read OaHѰOܡAЦۦ^Yh\Ū@fC {bAЧAH read Oγ~Ag@ script ALiHϥΪ̿JG1 first name P 2. last nameA ̫åBbùWܡGyYour full name is: zeG
    [root@linux scripts]# vi sh02.sh
    #!/bin/bash
    # Program:
    # 	Let user keyin their first and last name, and show their full name.
    # History:
    # 2005/08/23	VBird	First release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    
    read -p "Please input your first name: " firstname
    read -p "Please input your last name:  " lastname
    echo -e "\nYour full name is: $firstname $lastname"
    
    NWo sh02.sh @UAANo{ϥΪ̦ۤvJܼƥiHQΪI ܤaI[oI


  • Q date iɮתإ
  • Q@ӪpApGڨCѭniƥAӳƥƤSQQл\A]NOA ڷQnNCѳƥƩbPɮפCzIouxZڡHDnڨCѥhק script H ݭnڡI]CѪyzäۦPAҥHڥiHNɦWG backup.20050802 A NiHCѤ@ӤPɦWFܡHITpCnFAUӥXӨҤlG ڷQnإߤTӪŪɮסAɦW̶}YѨϥΪ̿JMwA]ϥΪ̿J filename nFA ѪO 2005/08/23 AڷQnHeѡBQѡBѪӫإ߳oɮסAY filename_20050821, filename_20050822, filename_20050823 AӦpOnH
    [root@linux scripts]# vi sh03.sh
    #!/bin/bash
    # Program:
    # 	User can keyin filename to touch 3 new files.
    # History:
    # 2005/08/23	VBird	First release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    
    # 1. ϥΪ̿JɮצW١Aèo fileuser oܼơF
    echo -e "I will use 'touch' command to create 3 files."
    read -p "Please input the filename what you want: " fileuser
    
    # 2. FקKϥΪHN Enter AQܼƥ\RɦWO_]wH
    filename=${fileuser:-"filename"}
    
    # 3. }lQ date OӨoһݭnɦWFF
    date1=`date --date='2 days ago' +%Y%m%d`
    date2=`date --date='1 days ago' +%Y%m%d`
    date3=`date +%Y%m%d`
    file1="$filename""$date1"
    file2="$filename""$date2"
    file3="$filename""$date3"
    
    # 4. NɦWإߧaI
    touch $file1
    touch $file2
    touch $file3
    
    ڳzL@²檺ʧ@Aoǰʧ@iHb bash @̭A ]ApO (`) oTBܼƪ]w\Bܼƪ֥[HΧQ touch OUI pGz}lo sh03.sh AAiHi⦸JA@ [Enter] Ӭd\ɦWOԣH @iHJ@ǦrAo˨ӧP_Aɮ׳I date OΡA man date aI ^_^


  • ƭȹB⪺k
  • UݩxٰOoAڭ̥iHϥ declare өwqܼƪaHI oˤ~i[BڡIiOA bash shell Yw]Ȥ䴩ƪơC OKIڭ̨ӪݡApGڭ̭nϥΪ̿JܼơAMNܼƪeۭA ̫XۭGAiH򰵡H
    [root@linux scripts]# vi sh04.sh
    #!/bin/bash
    # Program:
    # 	User can input 2 integer to cross by!
    # History:
    # 2005/08/23	VBird	First release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    echo -e "You SHOULD input 2 number, I will cross them! \n"
    read -p "first number:  " firstnu
    read -p "second number: " secnu
    total=$(($firstnu*$secnu))
    echo -e "\nThe number $firstnu x $secnu is ==> $total"
    
    bƦrBWAڭ̥iHϥΡy declare -i total=$firstnu*$secnu z ]iHϥΤW觋ӶiI򥻤WAijϥγo˪觋ӶiBG eOСAӥB]Kh㥼ӱziHϥγoؤ觋ӭp⪺rIܩƭȹBWBzA hG+, -, *, /, %C % Olưա|ҨӻA 13 3 lơAGO 13=4*3+1AҥHlƬO 1 ڡINOG
    [root@linux scripts]# nu=$((13%3)); echo $nu
    1
    
    oAѤFaHIhhDz߻PγI ^_^

    ΧP_
    b bash `Aڭ̴L $? oܼƩҥNNqA ~A]zL && || ӧ@e@ӫOO_\i檺@ӰѦҡC ApGڷQnD /dmtsai oӥؿO_sbɡAD@wnϥ ls ӰA MAH $? ӧP_榨GܡHIMݭnI ڭ̥iHzLy test zoӫOӰOI


    Q test Oե\
    ڭn˴tΤWYɮשΪ̬OݩʮɡAQ test oӫOӤu@A uOnαooFA|ҨӻAڭnˬd /dmtsai O_sbɡAϥΡG
    [root@linux ~]# test -e /dmtsai
    
    浲Gä|ܥTA̫ڭ̥iHzL $? && || Ӯi{ӵGOI Ҧpڭ̦bNWҤlgoˡG
    [root@linux ~]# test -e /dmtsai && echo "exist" || echo "Not exist"
    
    ̲תGiHiڭ̬Oyexistz٬OyNot existzOIڪD -e Oդ@ӡyFzbbA pGٷQnդ@UɦWOԣNɡA٦ǼлxiHӧP_OHIUoǪFI

    ժлxNNq
    1. YɦWyz(sbP_)Ap test -e filename
    -eӡyɦWzO_sbH(`)
    -fӡyɦWzO_ɮ(file)H(`)
    -dӡyɦWzO_ؿ(directory)H(`)
    -bӡyɦWzO_@ block device ˸mH
    -cӡyɦWzO_@ character device ˸mH
    -SӡyɦWzO_@ Socket ɮסH
    -pӡyɦWzO_@ FIFO (pipe) ɮסH
    -LӡyɦWzO_@ӳsɡH
    2. ɮתvAp test -r filename
    -rɦWO_㦳yiŪzݩʡH
    -wɦWO_㦳yigzݩʡH
    -xɦWO_㦳yizݩʡH
    -uɦWO_㦳ySUIDzݩʡH
    -gɦWO_㦳ySGIDzݩʡH
    -kɦWO_㦳ySticky bitzݩʡH
    -sɦWO_yDťɮסzH
    3. ɮפApG test file1 -nt file2
    -nt(newer than)P_ file1 O_ file2 s
    -ot(older than)P_ file1 O_ file2
    -efP_ file2 P file2 O_P@ɮסAiΦbP_ hard link PwWC DnNqbPwAɮ׬O_VP@ inode I
    4. ӾƤPwAҦp test n1 -eq n2
    -eqƭȬ۵ (equal)
    -neƭȤ (not equal)
    -gtn1 j n2 (greater than)
    -ltn1 p n2 (less than)
    -gen1 j󵥩 n2 (greater than or equal)
    -len1 p󵥩 n2 (less than or equal)
    5. Pwrꪺ
    test -z stringPwrO_ 0 HY string ŦrAh true
    test -n stringPwrO_D 0 HY string ŦrAh falseC
    G -n iٲ
    test str1 = str2Pw str1 O_ str2 AY۵Ah^ true
    test str1 != str2Pw str1 O_ str2 AY۵Ah^ false
    6. hPwAҦpG test -r filename -a -x filename
    -a(and)⪬pPɦߡIҦp test -r file -a -x fileAh file Pɨ㦳 r P x vɡA~^ trueC
    -o(or)⪬p@ӦߡIҦp test -r file -o -x fileAh file 㦳 r x vɡANi^ trueC
    !Ϭ۪AAp test ! -x file A file 㦳 x ɡA^ true

    OKI{bڭ̴NQ test ڭ̼gX²檺ҤlCAP_@UA ϥΪ̿J@ɦWAڭ̧P_G
    1. oɮ׬O_sbAYsbh@ӡyFilename does not existzTAä_{F
    2. YoɮצsbAhP_LOɮשΥؿAGXyFilename is regular filez yFilename is directoryz
    3. P_@UA̪oɮשΥؿҾ֦vAÿXvơI
    AiHۦЧ@ݬݡAMA򩳤UGQװQסC`NQ test P && ٦ || лxI
    [root@linux scripts]# vi sh05.sh
    #!/bin/bash
    # Program:
    # 	Let user input a filename, the program will search the filename
    #	1.) exist? 2.) file/directory? 3.) file permissions 
    # History:
    # 2005/08/25	VBird	First release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    
    # 1. ϥΪ̿JɦWAåBP_ϥΪ̬O_uJrH
    echo -e "The program will show you that filename is exist which input by you.\n\n"
    read -p "Input a filename : " filename
    test -z $filename && echo "You MUST input a filename." && exit 0
    # 2. P_ɮ׬O_sbH
    test ! -e $filename && echo "The filename $filename DO NOT exist" && exit 0
    # 3. }lP_ɮPݩ
    test -f $filename && filetype="regulare file"
    test -d $filename && filetype="directory"
    test -r $filename && perm="readable"
    test -w $filename && perm="$perm writable"
    test -x $filename && perm="$perm executable"
    # 4. }lXTI
    echo "The filename: $filename is a $filetype"
    echo "And the permission are : $perm"
    
    ܦ쪺ҤlaIziHۦAHLרҨӼg@UiΪ\OI


    QΧP_Ÿ [ ]
    Fڭ̫ܳwϥΪ test ~AAڭ٥iHQΧP_Ÿy [ ] zӶiƪP_OI |ҨӻApGڷQnD $HOME oܼƬO_ŪAiHo˰G
    [root@linux ~]# [ -z "$HOME" ]
    
    ϥ [] nSO`NOAbWzCӤ󤤶ݭnťӤjA]ڪťϥΡyzӪܡA AboǦaAݭnťG
    [  "$HOME"  ==  "$MAIL"  ]
    ["$HOME"=="$MAIL"]
                     
    
    WҤlbAӦr $HOME P $MAIL O_ۦPNA۷ test $HOME = $MAIL NաI ӦpGSťդjAҦp [$HOME==$MAIL] ɡAڭ̪ bash N|ܿ~TFIoinܪ`NڡI ҥHAz̦nn`NG |ҨӻApڳ]wF name="VBird Tsai" AMo˧PwG
    [root@linux ~]# name="VBird Tsai"
    [root@linux ~]# [ $name == "VBird" ]
    bash: [: too many arguments
    
    OH] $name pGSϥ޸_ӡAWPw|ܦG ӤOڭ̭nG oiOtܦhIt~AAϥΤkPлxP test XG@Ҥ@˰ڡ uOA`ΦbP_ if ..... then ..... fi pNOFC nAڭ̤]~Ӱ@ӤpרҦnFG
    1. @ӵ{ɭԡAoӵ{|ϥΪ̿ Y N A
    2. pGϥΪ̿J Y y ɡANܡy OK, continue z
    3. pGϥΪ̿J n N ɡANܡy Oh, interrupt Iz
    4. pGO Y/y/N/n LrANܡyI don't know what is your choicez
    QΤAB && P || ~aI
    [root@linux scripts]# vi sh06.sh
    #!/bin/bash
    # Program:
    # 	This program will show the user's choice
    # History:
    # 2005/08/25	VBird	First release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    
    read -p "Please input (Y/N): " yn
    [ "$yn" == "Y" -o "$yn" == "y" ] && echo "OK, continue" && exit 0
    [ "$yn" == "N" -o "$yn" == "n" ] && echo "Oh, interrupt!" && exit 0
    echo "I don't know what is your choice" && exit 0
    
    ܦaIQγoӦrPOkAڭ̴NiHܻPNϥΪ̷Qni檺u@OOI UӡAڭ̦Aӽͤ@ǨLSFaI
    P_̭UFn == ӤO@ = NnFOHڭ̦be@Wܪk̭ awk A u@ = Ψӵ@ܼƳ]w䤺eA޿P_ɡAh|ӵA YyzӫDy]wzNo̭nnn@UI ^_^

    Shell script w]ܼ($0, $1...)
    Aڭ̰@ shell script ɡAbo shell script ̭NwNڭ̰n@ǥiΪܼƤFC |ҨӻAb[NӡAzN|o{Aڭ̭nҰʤ@ӨtΪAȮɡAi|UFo˪OG
    [root@linux ~]# /etc/init.d/crond restart
    
    OԣNHINOyV /etc/init.d/crond o script UF restart OzA xIڭ̤Oϥ read ŪϥΪ̿JܼƤeܡHԣڥiHb script ᭱WoӰѼơH oO] shell script ڭ̳]wn@ǫwܼƤFIܼƪOo˪G
    
    /path/to/scriptname  opt1  opt2  opt3  opt4  ...
           $0             $1    $2    $3    $4   ...
    
    o˰MFaHI檺ɦW $0 oܼơAĤ@ӱѼƴNO $1 ڡ ҥHAunڭ̦b script ̭ $1 ܡANiH²檺ߧYUFYǫO\FI nFAӰӨҤla㰲]ڭn@ script AA script |۰ʦCXۤvɦWA ٦᭱eTӰѼơAӦpOnH
    [root@linux scripts]# vi sh07.sh
    #!/bin/bash
    # Program:
    # 	The program will show it's name and first 3 parameters.
    # History:
    # 2005/08/25	VBird	First release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    
    echo "The script name is ==> $0"
    [ -n "$1" ] && echo "The 1st parameter is ==> $1" || exit 0
    [ -n "$2" ] && echo "The 2nd parameter is ==> $2" || exit 0
    [ -n "$3" ] && echo "The 3th parameter is ==> $3" || exit 0
    
    o{̭[WF@DZAYQ && || ӥ[HP_ $1 ~ $3 O_sbH Ysb~ܡAYsbN_浲GpUG
    [root@linux scripts]# sh sh07.sh theone haha quot
    The script name is ==> sh07.sh
    The 1st paramter is ==> theone
    The 2nd paramter is ==> haha
    The 3th paramter is ==> quot
    
    Wo7ӨҤl²aHXGOQ bash \Ӥw ա㧐Uڭ̴NnϥαP_Ӷi@ǤO\઺]wFAnn@@@

    P_G
    uny{zܡAP_AYOy if then zoاPO֩w@wnDzߪI ]ܦhɭԡAڭ̳n̾ڬYǸƨӧP_{ӦpiC|ҨӻAڭ̦bWYOm߷ϥΪ̿J Y/N ɡAn椣PTXܡH²檺觋iHQ && P || ApGٷQn@OOH uon if then o㧐Uڭ̴NӲ@I


    Q if .... then
    o if .... then O̱`P_F²檺ANOŦXYӱP_ɭԡA NHiYu@NOFCڭ̥iH²檺oˬݡG
    if [ P_ ]; then
    	P_߮ɡAiHi檺Ou@eF
    fi
    
    ܩP_P_kAPe@p`ЬۦPڡISOOApGڦhӱnPOɡA F sh06.sh ӮרҡA]NONhӱgJ@ӤAp~A ٥iHhӤAӹj}IӬAPAAhH && || ӹj}AL̪NqOG ҥHAbϥΤAP_A && || NPOUFAPFC|ҨӻA sh06.sh ӨҤlڥiHgoˡG
    [root@linux scripts]# vi sh06-2.sh
    #!/bin/bash
    # Program:
    # 	This program will show the user's choice
    # History:
    # 2005/08/25	VBird	First release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    
    read -p "Please input (Y/N): " yn
    
    if [ "$yn" == "Y" ] || [ "$yn" == "y" ]; then
    	echo "OK, continue"
    	exit 0
    fi
    if [ "$yn" == "N" ] || [ "$yn" == "n" ]; then
    	echo "Oh, interrupt!"
    	exit 0
    fi
    echo "I don't know what is your choice" && exit 0
    
    LAѳoӨҤlݰ_ӡAG]SF_aH sh06.sh ٤²O OApGڭ̦Ҽ{UAAzN|D if then nBFG
    if [ P_ ]; then
    	P_߮ɡAiHi檺Ou@eF
    else
    	P_߮ɡAiHi檺Ou@eF
    fi
    
    pGҼ{pAhiHϥγoӻykG
    if [ P_@ ]; then
    	P_@߮ɡAiHi檺Ou@eF
    elif [ P_G ]; then
    	P_G߮ɡAiHi檺Ou@eF
    else
    	P_@PG߮ɡAiHi檺Ou@eF
    fi
    
    ڴNiHN sh06-2.sh goˡG
    [root@linux scripts]# vi sh06-3.sh
    #!/bin/bash
    # Program:
    # 	This program will show the user's choice
    # History:
    # 2005/08/25	VBird	First release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    
    read -p "Please input (Y/N): " yn
    
    if [ "$yn" == "Y" ] || [ "$yn" == "y" ]; then
    	echo "OK, continue"
    elif [ "$yn" == "N" ] || [ "$yn" == "n" ]; then
    	echo "Oh, interrupt!"
    else
    	echo "I don't know what is your choice"
    fi
    
    O_{ܱo²AӥB̧ǧP_AiHקKƧP_pAo˯uܮe]p{աI ^_^ nFApGڭnAҿJѼƬO_ hello O A ]NOApGڷQnDAAb{᭱ұĤ@ӰѼ (NO $1 ڡI) O_ hello A
    1. pGOܡAN "Hello, how are you ?"F
    2. pGS[ѼơANܨϥΪ̥nϥΪѼƤUFkF
    3. ӦpG[JѼƤO hello ANϥΪ̶ȯϥ hello ѼơC
    ӵ{giHOo˪G
    [root@linux scripts]# vi sh08.sh
    #!/bin/bash
    # Program:
    # 	Show "Hello" from $1....
    # History:
    # 2005/08/28	VBird	First release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    
    if [ "$1" == "hello" ]; then
    	echo "Hello, how are you ?"
    elif [ "$1" == "" ]; then
    	echo "You MUST input parameters, ex> $0 someword"
    else
    	echo "The only parameter is 'hello'"
    fi
    
    MziHo{AOb $1 mJ hello, SJPHNJA NiHݨ줣PXoO_ıo²檺ڡI ^_^CƹWA Ǩo̡A]uܼF`FnFAUڭ~Ӫ@Ǥj@Io ڭ̦be@wgǷ|F grep oӦnΪNAhǤ@ӥs netstat OA oӫOiHdߨثeD}ҪAȰf (service ports)A \ڭ̷|bA[]g~򤶲СAo̱zunDAڥiHQΡy netstat -tuln zӨoثeDҰʪAȡA ӥBoTIoˡG
    [root@linux ~]# netstat -tuln
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address   Foreign Address    State
    tcp        0      0 0.0.0.0:199     0.0.0.0:*          LISTEN
    tcp        0      0 :::80           :::*               LISTEN
    tcp        0      0 :::22           :::*               LISTEN
    tcp        0      0 :::25           :::*               LISTEN
    
    WIOSr骺ӳAǯSr骺NNO port o C port NNqOHXӱ` port PAȪYOG ڦpzL netstat hڪDO_}ҳo|ӥDnAȰfOH ڥiH²檺o˥hgoӵ{G
    [root@linux scripts]# vi sh09.sh
    #!/bin/bash
    # Program:
    # 	Using netstat and grep to detect WWW,SSH,FTP and Mail services.
    # History:
    # 2005/08/28	VBird	First release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    
    # 1. @@ǧiʧ@Ӥw
    echo "Now, the services of your Linux system will be detect!"
    echo -e "The www, ftp, ssh, and mail will be detect! \n"
    
    # 2. }li@Ǵժu@AåB]X@ǸToI
    testing=`netstat -tuln | grep ":80 "`
    if [ "$testing" != "" ]; then
    	echo "WWW is running in your system."
    fi
    testing=`netstat -tuln | grep ":22 "`
    if [ "$testing" != "" ]; then
    	echo "SSH is running in your system."
    fi
    testing=`netstat -tuln | grep ":21 "`
    if [ "$testing" != "" ]; then
    	echo "FTP is running in your system."
    fi
    testing=`netstat -tuln | grep ":25 "`
    if [ "$testing" != "" ]; then
    	echo "Mail is running in your system."
    fi
    
    oˤS@Ӥ@ӪˬdoO_ܦڡI ^_^CUӡAڭ̦AӪ@IC ڭ̪DiHQ date ܤPɶA]iHQ $((p⦡)) ӭpƭȹBC t~A date ]iHΨܦ 19710101 HӪy`ơz (Цۦd\ man date info date) CAzO_iHg@p{AΨӡyphٳѴXѡHz]NOG
    1. ϥΪ̿JL̪hF
    2. AѲ{bhF
    3. ѨӤܡyٻݭnXѡz~hrˡC
    GˤlH]|աAQΡy date --date="YYYYMMDD" +%s zNFڭ̩ҷQnopGzwggF{AөUgkլݬݡG
    [root@linux scripts]# vi sh10.sh
    #!/bin/bash
    # Program:
    # 	Tring to calculate your demobilization date at how many days 
    #	later...
    # History:
    # 2005/08/29	VBird	First release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    
    # 1. iϥΪ̳o{γ~AåBiӦpJ榡H
    echo "This program will try to calculate :"
    echo "How many days about your demobilization date..."
    read -p "Please input your demobilization date (YYYYMMDD ex>20050401): " date2
    
    # 2. դ@UAoӿJeO_THQΥWܪko
    date_d=`echo $date2 |grep '[0-9]\{8\}'`
    if [ "$date_d" == "" ]; then
    	echo "You input the wrong format of date...."
    	exit 1
    fi
    
    # 3. }lpo
    declare -i date_dem=`date --date="$date2" +%s`
    declare -i date_now=`date +%s`
    declare -i date_total_s=$(($date_dem-$date_now))
    declare -i date_d=$(($date_total_s/60/60/24))
    if [ "$date_total_s" -lt "0" ]; then
    	echo "You had been demobilization before: " $((-1*$date_d)) " ago"
    else
    	declare -i date_h=$(($(($date_total_s-$date_d*60*60*24))/60/60))
    	echo "You will be demobilized after $date_d days and $date_h hours."
    fi
    
    @@@Ao{iHzphOpGOwghB͡A ٥iHDwghh[F㫢IܥiRaQ date X 1971/01/01 HӪ`ơA APثe`ƨӤAMH@Ѫ` (60*60*24) ƥhp`ơA No̪tF@ʧ@SWXڭ̩ҾǪda ^_^ ٯקKϥΪ̿J~ƦrAҥHhF@ӥWܪkP_O oӨҤlAQn@sB͡AiH@@UҫmD pͤ骺@DI[oI


    Q case ..... esac P_
    WӤp`쪺y if .... then .... fi zܼƪP_A OH諸觋Ӥ몺ApGŦXANiYǦ欰AåBzLhh ( NO elif ... ) 觋Ӷihܼƪ{XgAĴp sh08.sh Ӥp{ANOγo˪觋ӪoC nAU@ڦhӬJwܼƤeAҦp sh08.sh AکһݭnܼƴNO "hello" ΪŦrӡA ڥunwoܼƨӳ]wpNnFaHIiHϥΤ觋ӳ]pOH N case ... in .... esac aALykpUG
    case $ܼƦW in
      "Ĥ@ܼƤe")
    	{q
    	;;
      "ĤGܼƤe")
    	{q
    	;;
      *)
    	]tĤ@ܼƤePĤGܼƤeL{q
    	exit 1
    	;;
    esac
    
    n`NOAoӻykOH case }YAӥH esac AԣHO esac OHQ@QAJM if O fi A case MNON case ˵ۼgA۵MNO esac o ^_^AܦnOa t~AC@ܼƤe{q᳣̫ݭnӤ (;;) ӥNӵ{qAonI ܩ󬰦ݭn * oܼƤeb̫OHoO]ApGϥΪ̤OJܼƤe@ΤGɡA ڭ̥iHiϥΪ̬TڡI|ҨӻAڭ̦pGN sh08.sh gܡA Lӷ|ܦo˳I
    [root@linux scripts]# vi sh08-2.sh
    #!/bin/bash
    # Program:
    # 	Show "Hello" from $1.... by using case .... esac
    # History:
    # 2005/08/29	VBird	First release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    
    case $1 in
      "hello")
    	echo "Hello, how are you ?"
    	;;
      "")
    	echo "You MUST input parameters, ex> $0 someword"
    	;;
      *)
    	echo "Usage $0 {hello}"
    	;;
    esac
    
    bWo sh08-2.sh רҷApGAJy sh sh08-2.sh test zӰA ùWN|X{yUsage sh08-2.sh {hello}zrˡAi̶ȯϥ hello o˪觋ݭnYǩTwrӰ檺ܼƤeN㪺[KOH oؤ觋zunxIoO]tΪܦhAȪҰ scripts OϥγoؼgkA |ҨӻAڭ Linux AȱҰʩmؿOb /etc/init.d/ AڤwgDY syslog AȡAڷQnsҰʳoӪAȡAiHo˰G IO restart աpGziJ /etc/init.d/syslog N|ݨLϥΪO case ykA åB|WwYǬJwܼƤeAAiHUF /etc/init.d/syslog A script N|iAǫ򱵪ܼƥiHϥoKaI ^_^

    @ӻAϥΡy case $ܼ in zoӻykA $ܼ jPبo觋G o򻡩γ\zP٤AnAڭ̪gӵ{ӪGϥΪ̯J one, two, three A åBNϥΪ̪ܼܨùWApGO one, two, three ɡANiϥΪ̶ȦoTؿܡC
    [root@linux scripts]# vi sh11.sh
    #!/bin/bash
    # Program:
    # 	Let user input one, two, three and show in screen.
    # History:
    # 2005/08/29	VBird	First release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    
    echo "This program will print your selection !"
    # read -p "Input your choice: " choice
    # case $choice in
    case $1 in
      "one")
    	echo "Your choice is ONE"
    	;;
      "two")
    	echo "Your choice is TWO"
    	;;
      "three")
    	echo "Your choice is THREE"
    	;;
      *)
    	echo "Usage {one|two|three}"
    	;;
    esac
    
    ɡAziHϥΡy sh sh11.sh two z觋ӤUFOANiH۹^FC WϥΪOUF觋AӦpGϥΪOʦɡANW 10, 11 檺 "#" A ñN 12 [W (#)ANiHϥΪ̿JѼooˬO_ܦڡHI


    Q function \
    Oy (function)z\ڡH²檺AA ƥiHb shell script X@ۭqOFA̤j\OA iH²Ƨڭ̫ܦh{X|ҨӻAW sh11.sh ACӿJG one, two, three Xe@˰ڡ㨺ڴNiHϥ function ²ƤFI function ykOo˪G
    function fname() {
    	{q
    }
    
    fname NOڭ̪ۭqOW١ӵ{qNOڭ̭nL檺eFC n`NOAb shell script A function ]w@wnb{̫eA oˤ~bɳQiΪ{qInڭ̱N sh11.sh g@UG
    [root@linux scripts]# vi sh11-2.sh
    #!/bin/bash
    # Program:
    # 	Let user input one, two, three and show in screen.
    # History:
    # 2005/08/29	VBird	First release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    
    function printit(){
    	echo -n "Your choice is "
    }
    
    echo "This program will print your selection !"
    case $1 in
      "one")
    	printit; echo $1 | tr 'a-z' 'A-Z'
    	;;
      "two")
    	printit; echo $1 | tr 'a-z' 'A-Z'
    	;;
      "three")
    	printit; echo $1 | tr 'a-z' 'A-Z'
    	;;
      *)
    	echo "Usage {one|two|three}"
    	;;
    esac
    
    HWҤlӻAڰF@ӨƦW٬ printit AҥHAڦb򪺵{q̭A un printit ܡANܧڪ shell script nhy function printit .... z ̭Xӵ{qoI MoAWoӨҤl|o²FAҥHz|ıo function nF`A LApGYǵ{X@Aab script ƮɡAo function iNnho iH²Ƶ{XAӥBiHyҲաzNAuܴΰաI

    t~A function ]O֦ܼƪLܼƻP shell script A ƦW٥N $0 Aӫ򱵪ܼƤ]OH $1, $2... ӨN o̫ܮed]y function fname() { {q } z $0, $1... P shell script $0 OPCHW sh11-2.sh ӻApڤUFGy sh sh11-2.sh one z oܦb shell script $1 "one" oӦrCOb printit() $1 hPo one LC ڭ̱NWҤlAg@UAzMI
    [root@linux scripts]# vi sh11-3.sh
    #!/bin/bash
    # Program:
    # 	Let user input one, two, three and show in screen.
    # History:
    # 2005/08/29	VBird	First release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    
    function printit(){
    	echo "Your choice is $1"
    }
    
    echo "This program will print your selection !"
    case $1 in
      "one")
    	printit 1
    	;;
      "two")
    	printit 2
    	;;
      "three")
    	printit 3
    	;;
      *)
    	echo "Usage {one|two|three}"
    	;;
    esac
    
    bWҤlApGzJy sh sh11-3.sh one zN|X{y Your choice is 1 zrˡ O 1 OH]b{qAڭ̬OgFy printit 1 z 1 N| function $1 oˬO_zѩOH function x@IApGzٷQniLgܡC LAڭ̶ȬOQn[A shell script ӤwAҥHAo̬ݬݧYiAѭzNno ^_^

    j (loop)
    F if...then...fi oرP_~AjiO{̭n@F jiH_Yӵ{qAϥΪ̳]wFC ҥHAIOӡy󪺹FzOCUڭ̴Nӽͤ@͡G


    while do done, until do done
    @ӻAj̱`NOUoتAFG
    while [ condition ]
    do
    	{q
    done
    
    oؤ觋A while Oy....ɡzAҥHAoؤ觋Oy condition 󦨥߮ɡANijA condition 󤣦ߤ~zNC
    until [ condition ]
    do
    	{q
    done
    
    oؤ觋P while ۤϡAOy condition 󦨥߮ɡANפjA _hNij骺{qCzO_nۤϰڡڭ̥H while Ӱ²檺mߦnFC ]ڭnϥΪ̿J yes Ϊ̬O YES ~{A_hN@iiϥΪ̿JrC
    [root@linux scripts]# vi sh12.sh
    #!/bin/bash
    # Program:
    # 	Use loop to try find your input.
    # History:
    # 2005/08/29	VBird	First release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    
    while [ "$yn" != "yes" ] && [ "$yn" != "YES" ]
    do
    	read -p "Please input yes/YES to stop this program: " yn
    done
    
    WoӨDOy $yn oܼƤO "yes" B $yn ]O "YES" ɡA~ij馎{Cz ӦpG $yn O "yes" "YES" ɡAN|}jo㨺pGϥ until OHo L|ܦoˡG
    [root@linux scripts]# vi sh12-2.sh
    #!/bin/bash
    # Program:
    # 	Use loop to try find your input.
    # History:
    # 2005/08/29	VBird	First release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    
    until [ "$yn" == "yes" ] || [ "$yn" == "YES" ]
    do
    	read -p "Please input yes/YES to stop this program: " yn
    done
    
    JӤ@UoӪF観ԣPI ^_^AӡApGڷQnp 1+2+3+....+100 oӼƾکOH QΰjڡLOo˪G
    [root@linux scripts]# vi sh13.sh
    #!/bin/bash
    # Program:
    # 	Try to use loop to calculate the result "1+2+3...+100"
    # History:
    # 2005/08/29	VBird	First release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    
    s=0
    i=0
    while [ "$i" != "100" ]
    do
    	i=$(($i+1))
    	s=$(($s+$i))
    done
    echo "The result of '1+2+3+...+100' is ==> $s"
    
    KKIzFy sh sh13.sh zANiHo 5050 oӼƾڤ~ڡIoAI zۦ氵@UApGQnϥΪ̦ۦJ@ӼƦrA{ 1+2+... zJƦrA Ӧp󼶼gOHӫ²aHIץiHѦҤ@UDm߸̭@DI


    for...do....done
    ۹ while, until j觋OnyŦXYӱzAA for oػykAhOy wgDniXjzAILykOG
    for (( l; ; B ))
    do
    	{q
    done
    
    oػykAXƭȤ觋BAb for ᭱ATꤺeNqG ȱo`NOAbyBz]wWApGCW[ 1 AhiHϥyi++z觋AYO i Cj鳣|W[@NCnAڭ̥Hoؤ觋Ӷi 1 ֥[ 100 jaI
    [root@linux scripts]# vi sh14.sh
    #!/bin/bash
    # Program:
    # 	Try do calculate 1+2+....+100
    # History:
    # 2005/08/29	VBird	First release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    
    s=0
    for (( i=1; i<=100; i=i+1 ))
    do
    	s=$(($s+$i))
    done
    echo "The result of '1+2+3+...+100' is ==> $s"
    
    @ˤ]O²aIQγo for hiHjniXOIonΪFDubƭȤ譱ʧ@H MOաڭ٥iHQΩU觋ӶiDƦr譱jB@I
    for var in con1 con2 con3 ...
    do
    	{q
    done
    
    HWҤlӻAo $var ܼƤebju@ɡG
    1. Ĥ@jɡA $var e con1 F
    2. ĤGjɡA $var e con2 F
    3. ĤTjɡA $var e con3 F
    4. ....
    ڭ̥iH²檺mߡC]ڦTذʪAOO dog, cat, elephant TءA ڷQC@泣XoˡGyThere are dogs...zrˡAhiHG
    [root@linux scripts]# vi sh15.sh
    #!/bin/bash
    # Program:
    # 	Using for .... loop to print 3 animal 
    # History:
    # 2005/08/29	VBird	First release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    
    for animal in dog cat elephant
    do
    	echo "There are ""$animal""s.... "
    done
    
    ²OaI ^_^CnFApGڷQnϥΪ̿JYӥؿA MڧXYؿɦWvOHSӦpOnHIiHo˰ա
    [root@linux scripts]# vi sh16.sh
    #!/bin/bash
    # Program:
    # 	let user input a directory and find the whole file's permission.
    # History:
    # 2005/08/29	VBird	First release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    
    # 1. ݬݳoӥؿO_sbڡH
    read -p "Please input a directory: " dir
    if [ "$dir" == "" ] || [ ! -d "$dir" ]; then
    	echo "The $dir is NOT exist in your system."
    	exit 1
    fi
    
    # 2. }lɮo
    filelist=`ls $dir`
    for filename in $filelist
    do
    	perm=""
    	test -r "$dir/$filename" && perm="$perm readable"
    	test -w "$dir/$filename" && perm="$perm writable"
    	test -x "$dir/$filename" && perm="$perm executable"
    	echo "The file $dir/$filename's permission is $perm "
    done
    
    Iܦ쪺ҤlaQγoؤ觋AziHܻӳBz@ɮתSʩO ڭ̰jNШo̤FLhΡANozݨDӪoC

    shell script lܻP debug
    scripts b椧eA̩ȪNOX{DFIڭ̦p debug OHSkݭnzL scripts NiHӧP_O_DOIHI MOIڭ̴NH bash ѼƨӶiP_aI
    [root@linux ~]# sh [-nvx] scripts.sh
    ѼơG
    -n  Gn scriptAȬd߻ykDF
    -v  GA sccript eAN scripts eXùWF
    -x  GNϥΨ쪺 script eܨùWAoOܦΪѼơI
    dҡG
    
    dҤ@G sh16.sh LykDH
    [root@linux ~]# sh -n sh16.sh 
    # YykSDAh|ܥTI
    
    dҤGGN sh15.sh L{CXӡ
    [root@linux ~]# sh -x sh15.sh 
    + PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/home/vbird/bin
    + export PATH
    + for animal in dog cat elephant
    + echo 'There are dogs.... '
    There are dogs....
    + for animal in dog cat elephant
    + echo 'There are cats.... '
    There are cats....
    + for animal in dog cat elephant
    + echo 'There are elephants.... '
    There are elephants....
    # ϥ -x uOl script nkALiHNҦ檺{qbeCXӡA
    # pGO{qAhXɡA̫e|[W + rAܥLO{XӤwA
    # ڪXhP standard output ڡpWҥܡC
    
    bWdҤGAڭ̥iHzLo²檺Ѽ -x ӹF debug تAoiO@ӤihoѼơA q`pGz script ooͰDɡAQγo -x ѼơANiHDDOoͦb@WFI

    x sh ΪkANiHϱzb޲z Linux L{oIܩb Shell scripts DzߤkWAݭnyhݡBhҥBå[Hק令ۤv˦Iz O̧֪DzߤqFIW۷hBͦb}o@Ǭ۷Ϊ scripts AYOziHN𫍧 scripts ӡAåB令AXۤvDˤlIDzߪĪG|O̧֪OI

    t~Aڭ Linux tΥӴNܦhҰ script ApGzQnDC script ҥN\OH iHH vi iJ script hd\@UAq`ߨND script تFC |ҨӻAڭ̪ Linux YɮצW٬G /etc/init.d/portmap Ao script OFΪH Q vi hd\̫eXrALX{pUTG
    # description: The portmapper manages RPC connections, which are used by \
    #              protocols such as NFS and NIS. The portmap server must be \
    #              running on machines which act as servers for protocols which \
    #              make use of the RPC mechanism.
    # processname: portmap
    
    ²檺ALOQΦb NFS P NIS W@ӱҰ RPC script A Mڭ̦AQ http://www.google.com.tw hjM@U NFS, NIS P RPC A ߨNDo script \oҥHAUzo{ script ɡA pGOtδѪAQγoˬd觋A@wiHAѪաI [oo ^_^

    t~AҦdҳiHb http://vbird.org.cn/linux_basic/0340bashshell-scripts/scripts.tgz YI[o


    Dm
    ( nݵ׽бNƹʨyGzUťճBAUťճBYi )

    2002/06/27GĤ@
    2003/02/10GssƻP[J FAQ
    2005/08/29GNª峹ʨ o FC
    2005/08/29GII[JF@Ǥ쪺mDĤ@nhjahh@