BASH Programming - Introduction HOW-TO by Mike G mikkey at dynamo.com.ar Mon Jul 27 11:47:00 ART 2000 ú{êó çUTi July 2000 ±Ì¶ÍAÌVFXNvgÌvOðnßélÌèøƵ Ä©êĢܷB(^Cg©ç઩éæ¤É)±êÍxÈàeððൠ½¶ÅÍ èܹñBí½µ©gAVFvOÌGLXp[gÅÍÈ ¢Å·µAܵÄâBlÅà èܹñB±êð±¤Æv¢§Á½ÌÍA» ±©ç©ªª½ðw×é¾ë¤ÆvÁ½©çÅ èA൩µ½ç¼lÌð ɧ©àµêÈ¢Æl¦½©çÅ·BÇñÈtB[hobNà½}µÜ·B ÁÉApb``®Å¢½¾¯éÆðµv¢Ü· :) ______________________________________________________________________ Ú 1. Cg_NV 1.1 ÅVo[WÌüèê 1.2 Kv 1.3 ±Ì¶Ìg¢û 2. ñíÉVvÈXNvg 2.1 `Ì Hello World XNvg 2.2 ñíÉVvÈobNAbvXNvg 3. _CNgVÉ¢Ä(redirection) 3.1 _ÆÈPÈt@X 3.2 Tv: stdout ð file Ö 3.3 Tv: stderr ð file Ö 3.4 Tv: stdout ð stderr Ö 3.5 Tv: stderr ©ç stdout Ö 3.6 Tv: stderr Æ stdout ©ç file Ö 4. pCv (pipe) 4.1 ½ÈÌ©ADZª¢¢Ì© 4.2 Tv: sed ðgÁ½ÈPÈpCv 4.3 Tv: 'ls -l *.txt' ÌãÖR}h 5. Ï (variable) 5.1 Tv: ÏðgÁ½ Hello World! 5.2 Tv: ñíÉVvÈobNAbvXNvg(üÇÅ) 5.3 [JÏ 6. ð§ä(conditionals) 6.1 ZI[ 6.2 Tv: if .. then Éæéî{IÈð§äÌá 6.3 Tv: "if .. then ... else" ðgÁ½î{IÈð§äÌá 6.4 Tv: ÏðºÁ½ð§ä 7. for, while, until Éæé[v 7.1 For ÌTv 7.2 C ¾êɽ for 7.3 while ÌTv 7.4 until ÌTv 8. Ö(functions) 8.1 ÖÌTv 8.2 p[^[ðæéÖÌTv 9. [UC^[tFCX 9.1 ÈPÈj [ðìé½ßÉ select ðg¤ 9.2 R}hCðgÁÄÝé 10. »Ì¼ÌXNvg 10.1 read ðgÁÄ[UÌüÍðÇÝÞ 10.2 lÌ]¿ 10.3 bash ðT· 10.4 vOÌßèlðl¾·éû@ 10.5 R}hoÍðl¾·éû@ 10.6 ¡Ì\[Xt@C 11. QÆe[u 11.1 ¶ñärZq 11.2 ¶ñärÌÀá 11.3 lZq 11.4 lÖWZq 11.5 ÖÈR}h 11.5.1 sed (stream editor) 11.5.2 awk (f[^t@CâeLXgÌõÆ®`) 11.5.3 grep (õp^[Év·ésÌoÍ) 11.5.4 wc (sAêAoCgð¦Ü·) 11.5.5 sort (eLXgt@CàÌsÌÀ×Ö¦) 11.5.6 bc (lvZpÌvO~O¾ê) 11.5.7 tput ([Ìú»â terminfo f[^x[XÌõ) 12. ¢ë¢ëÈXNvg 12.1 fBNgãÌSt@CÉR}hðKp·éû@ 12.2 Tv: ñíÉVvÈobNAbvXNvg(üÇÅ) 12.3 t@C¼ÏXXNvg 12.4 t@C¼ÏXXNvg(ÈÕÅ) 13. ¤Ü¢©È¢(fobO) 13.1 bash ÌÄÑoµû 14. ±Ì¶É墀 14.1 (³)ÛØÉ墀 14.2 |óÉ墀 14.3 Ó« 14.4 üùð 14.5 Qlz[y[W 14.6 ú{êóÉ墀 ______________________________________________________________________ 1. Cg_NV 1.1. ÅVo[WÌüèê http://www.linuxdoc.org/HOWTO/Bash-Prog-Intro-HOWTO.html 1.2. Kv GNU/Linux ÌR}hCÉáa´ªÈAvOÉ¢ÄÌî{IÈ l¦ûªgÉ¢ĢéÆðµâ·¢Æv¢Ü·Bµ©µA±ÌûqÍv O~OÌZpÅÍÈ¢ÌÅA½Ìî{TOÉ¢Äà¾ðÁ¦Ä( é¢ÍÈÆà»ÌwÍðµÄ)¢Ü·B 1.3. ±Ì¶Ìg¢û ±Ì¶ÍAÌæ¤ÈêÉð§Â±ÆðOªÉu¢Ä©êĢܷB o vO~OªÇ¤¢¤àÌ©mÁÄ¢ÄA±ê©çVFXNvgÌ R[fBOðnßæ¤ÆµÄ¢éêB o VFvO~OÉ¢ÄRƵ©mçÈ¢ÌÅAQÆū鶣 ª~µ¢êB o ©ªÅ«nßéÉ ½ÁÄAÀÛÌXNvgÆ»ÌRgð¢Â ©©½¢êB o DOS/Windows «©çÚsµæ¤ÆµÄ¢Ä( é¢ÍµÄµÜÁÄ)A uob`vðÀ»µ½¢êB o ¢íäé®SÉuI^N(nerd)vÆÄÎêéÐÆÅAÐÁ[©ç HOW-TO {ðÇñÅ¢éêB 2. ñíÉVvÈXNvg ±Ì HOW-TO ÍAáèÉd_ðu¢ÄAVFXNvgÌvO~OÉ Ö·éqgðAq×æ¤ÆµÄ¢Ü·B ±ÌÍÅÍA¢Â©ÌeNjbNðð·éÌÉð§Âæ¤ÈÈPÈXN vgðæèã°Ü·B 2.1. `Ì Hello World XNvg #!/bin/bash echo Hello World ±ÌXNvgÍAñsµ© èܹñBêsÚÍAt@CðÀs·éÌÉ ÇÌvOðg¤©ðVXeÉw¦µÄ¢Ü·B ñsÚÍA±ÌvOªÀs·éBê̽ߪ©êÄ¢ÄA»êÉæÁ Ä[É "Hello World" Æ\¦³êÜ·B ൩·éÆA./hello.sh: Command not found. Æ\¦³ê½©àµêܹ ñB¨»çAÅÌsÌ "#!/bin/bash" ª³µÈ¢½ßÅµå ¤B'whereis bash' ÆÅ©A``ubash ðT·(10.3)v''ð©é©µÄA» ÌsÌ«ûðmFµÄ¾³¢B 2.2. ñíÉVvÈobNAbvXNvg #!/bin/bash tar -cZf /var/my-backup.tgz /home/me/ ±ÌXNvgÅÍA^[~iÉbZ[Wð\¦·éÌÅÍÈA[U Ìz[fBNgÌàeð³kt@C(tarball)ÉÜÆßÜ·B±êÍ ÀÛÌgpðÓ}µ½àÌÅÍ èܹñBàÁÆÖÈobNAbvXN vgðA±Ì¶ÅãÙÇÐîµÜ·B 3. _CNgVÉ¢Ä(redirection) 3.1. _ÆÈPÈt@X bash ÉÍAt@CLqq(file descriptor)ƵÄAWüÍ (stdin)AW oÍ(stdout)A»µÄWG[(stderr) Ì 3 ª èÜ·B ( std Í standard ÌÓ¡Å·B) î{IÉȺ̱ƪūܷB 1. stdout ð file É_CNg 2. stderr ð file É_CNg 3. stdout ð stderr É_CNg 4. stderr ð stdout É_CNg 5. stderr Æ stdout ð file É_CNg 6. stderr Æ stdout ð stdout É_CNg 7. stderr Æ stdout ð stderr É_CNg (_CNg\¶ÅÍ)Ì 1 Í stdout ð\µA 2 Í stderr ð\µÜ ·B *ãLÌÚ»ê¼êÉ¢ÄÌÈPÈ* less R}hðg¤ÆA stdout (±êÍobt@ÉcèÜ·)Æ stderr (XN[ÉÍ\¦³êÜ· ªA»Ìobt@ð©æ¤Æ·éÆÁ³êĵܢܷ)̼ûð©é±Æ ªÅ«Ü·B 3.2. Tv: stdout ð file Ö ÌêAvOÌoͪt@CÉ«ÜêÜ·B $ ls -l > ls-l.txt ãLÅÍ ls-l.txt Æ¢¤t@Cªì¬³êÜ·B»µÄA'ls -l' Æ¢¤ R}hðÀsµ½êÉXN[É\¦³êéàeªA»Ìt@CÉÛ ¶³êÜ·B 3.3. Tv: stderr ð file Ö ÌêAvOÌ stderr Ìoͪt@CÉ«ÜêÜ·B $ grep da * 2> grep-errors.txt ãLÅÍAgrep-errors.txt Æ¢¤t@Cªì¬³êÜ·B»µÄA»Ì t@CÉÍA'grep da *' ÌoÍ̤¿AÇÒª©æ¤ÆµÄ¢éÍ¸Ì stderr ̪ª«ÜêĢܷB 3.4. Tv: stdout ð stderr Ö ÌêAvOÌ stderr oͪAstdout ƯêÌt@CLqqÉ «ÜêÜ·B $ grep da * 1>&2 ãLÅÍAR}hÌ stdout ̪ª stderr ÉçêÜ·BÊÌâèûª é±ÆÉÇÒÍCt¢Ä¢é©àµêܹñB 3.5. Tv: stderr ©ç stdout Ö ÌêAvOÌ stderr oͪAstdout ƯêÌt@CLqqÉ «ÜêÜ·B $ grep * 2>&1 ãLÅÍAR}hÌ stderr ̪ª stdout ÉçêÜ·Bµ½ªÁÄA àµpCvðgÁÄ less ɬ¹ÎAÊíÈç stderr É«ÜêÄÁ¦Ä µÜ¤Í¸ÌoÍsªA stdout Éçê½±ÆÅÛ³êÄ¢éÌðmFÅ «Ü·B 3.6. Tv: stderr Æ stdout ©ç file Ö ÌêAvOÌSÄÌoͪt@CÉüêçêÜ·B±êÍA®S ÉÙÁÄR}hðÀs³¹½¢æ¤È cron ÌÀsÚðêÉKµÄ ¢Ü·B $ rm -f $(find / -name core) &> /dev/null cron vOÌÀsÚðv¢©×ÄÙµ¢ÌÅ·ªAãLÍA çä éfBNg©ç "core" ÆÄÎêét@Cð·×Äí·éàÌÅ·B R}hÌoÍð©¦ÈµÄµÜ¤êÍA»ÌR}hªÇ¤¢¤ð ·éÌ©[ªF¯µÄ¨©È¯ê΢¯Ü¹ñB 4. pCv (pipe) ±ÌÍÅÍAÈP©ÂÀpIÈpCvÌg¢ûÆ»ÌLp«É¢Äà¾µÜ ·B 4.1. ½ÈÌ©ADZª¢¢Ì© ÈPÉ¢¤ÆApCvðg¦ÎAvOÌoÍð¼ÌvOÌüÍÆ µÄpÅ«éæ¤ÉÈèÜ·B 4.2. Tv: sed ðgÁ½ÈPÈpCv ÌáÍÈPÈpCvÌg¢ûð¦·àÌÅ·B $ ls -l | sed -e "s/[aeio]/u/g" ãLÅÍA̱ƪN±èÜ·Bæ¸R}h 'ls -l' ªÀs³êA»Ì oͪæÊÉ\¦³êéãíèÉAsed vOÉçê (pipe ³ ê)A¡xÍ sed ª»êðµÄæÊÉ\¦µÜ·B 4.3. Tv: 'ls -l *.txt' ÌãÖR}h ¨»çÍA'ls -l *.txt' Æ·éæèàïµ¢û@Å·B±êðáèÉæ èã°éÌÍAt@CðXgAbv·éÆ«ÌW}ððÁ·é½ßÅ ÍÈAPÉpCvÌg¢ûðྵ½¢©çÅ·B $ ls -l | grep "\.txt$" ãLÅÍA'ls -l' vOÌoͪ grep vOÉçêA»±Å "\.txt$" ̳K\»Év·ésªæÊÉoͳêÜ·B (ó: ãLÅ~ }[Nª\¦³êéêA»êÍobNXbV ÌÓ¡Å·B) 5. Ï (variable) Ïðg¦È¢vO¾êÍ èܹñB½¾Abash ÉÍf[^^(data type)ª èܹñBbash ÌÏÍAA¶A¶ñði[·é±ÆªÅ «Ü·B Ïðé¾·éKvÍÈAQƷ׫ÏÉlðãü·êÎA»ê¾¯Åì ¬Å«Ü·B 5.1. Tv: ÏðgÁ½ Hello World! #!/bin/bash STR="Hello World!" echo $STR 2 sÚÅ STR Æ¢¤ÏðìÁÄA»êÉ "Hello World" Æ¢¤¶ñðã üµÄ¢Ü·B±ÌÏÌulvÍÏÌÅÉ "$" ðu±ÆÅæèo¹ Ü·Bൠ"$" Æ¢¤LðgíÈ©Á½çvOÌoÍÍá¤àÌÆ ÈèA]ñ¾Êð¾çêȢƢ¤±ÆððµÄ( é¢ÍÀÛÉâÁÄ ÝÄ)¾³¢B 5.2. Tv: ñíÉVvÈobNAbvXNvg(üÇÅ) #!/bin/bash OF=/var/my-backup-$(date +%Y%m%d).tgz tar -cZf $OF /home/me/ ãLÌXNvgÍA¡ÜÅÆ͵ᤱÆðÐîµÄ¢Ü·BܸñsÚ É éÏÌì¬ÆãüÉ¢ÄÍवê½Æv¢Ü·BÅÍA"$(date +%Y%m%d)" Æ¢¤\»Éڵľ³¢BXNvgðÀs·éÆAÛJb RÌÈ©ÌR}hªÀs³êÄA»ÌoͪæèÜêéæ¤ÉÈÁÄ¢Ü ·B ±ÌXNvgÅÍAdate R}hÌ(+%Y%m%d)Æ¢¤®XCb`É]Á ÄAoͳêét@C¼ªúÏíé±ÆÉӵľ³¢BáÁ½® ðwè·é±ÆÅA±êÆÍÙÈét@C¼É·é±ÆàÅ«Ü·B »êÈOÌQláƵÄA o echo ls o echo $(ls) Æ¢Á½à̪ èÜ·B 5.3. [JÏ [JÏÍAlocal Æ¢¤L[[hðgÁÄ쬷é±ÆªÅ«Ü·B #!/bin/bash HELLO=Hello function hello { local HELLO=World echo $HELLO } echo $HELLO hello echo $HELLO [JÏÌg¢ûÉ¢ÄÍAÈãÌáÅ[ª©Æv¢Ü·B 6. ð§ä(conditionals) ð§äðg¦ÎA é½ßðÀsð·×«©Ç¤©ÌèªÅ«Ü·B»µ ÄA±ÌèÍA®Ì]¿ÉæèȳêÜ·B 6.1. ZI[ ð§äÉÍA½Ì`®ª èÜ·BÅàî{IÈ`®ÍAuif ð® then Às¶v Å èA±ÌÀs¶Íð®Ì]¿ª^Å éÆ«¾¯Às³ êÜ·B" 2 < 1 " Æ¢¤ÌÍUÆ]¿³êéð®Å èA" 2 > 1 " Æ¢ ¤ÌÍ^Æ]¿³êéð®Å·B ܽAð§äÍAuif ð® then Às¶1 else Às¶2 vÆ¢¤`®à ÆèÜ·B±±ÅÍAð®ª^ÌÆ«Às¶ 1 ªÀs³êA»êÈOÌÆ «ÍÀs¶ 2 ªÀs³êÜ·B ð§äÉͳçÉÊÌ`®à èÜ·Buif ð®1 then Às¶1 else if ð®2 Às¶ 2 else Às¶3 v Å·B±Ì`®ÅÍA "else if ð ®2 then Às¶2 " Æ¢¤ÌªÁíÁ½¾¯Å·ªA±êÍàµð®2 Ì]¿ª^ÈçÎÀs¶2 ðÀs·éàÌÅ·B»Ì¼ÌªÉ¢ÄÍA ÇÒÌzÊèÅ·B(±êÜÅÌ`®ð²¾³¢) \¶ÉÖµÄÅ·ªA bash Å if §ä\¢ðg¤Æ«Ìî{ÍȺÌæ¤È àÌÅ·B if [ð®] then (if Ìðª^¾Á½Æ«Ì)ÀsR[h fi 6.2. Tv: if .. then Éæéî{IÈð§äÌá #!/bin/bash if [ "foo" = "foo" ]; then echo expression evaluated as true fi u[X [ ] àÌð®ª^Å Á½êA"then" Æ¢¤¶ÌãÉAÀs ³êéR[hª©êĢܷB»µÄ»ÌãÉAð§äÉîâÄÀs³ êéR[hÌI¹ðw¦·é "fi" ªu©êĢܷB 6.3. Tv: "if .. then ... else" ðgÁ½î{IÈð§äÌá #!/bin/bash if [ "foo" = "foo" ]; then echo expression evaluated as true else echo expression evaluated as false fi 6.4. Tv: ÏðºÁ½ð§ä #!/bin/bash T1="foo" T2="bar" if [ "$T1" = "$T2" ]; then echo expression evaluated as true else echo expression evaluated as false fi 7. for, while, until Éæé[v ±ÌÍÅÍAfor, while, »µÄ util Éæé[vÉ¢Äq×Ü·B bash Ì for ÍA¼Ì¾êÅÌg¢ûÆá±ÙÈèÜ·Bî{IÉÍA é¶ ñàÌPêð ½Ü©çɽ·éàÌÅ·B while ÍA§ä®ª^ÌÔÍR[hðÀsµÄ¢ÄAUÉÈÁ½Æ« ( é¢ ÍÀsR[hàÉ break ª¾¦³êÄ¢éê)ÉÌÝâ~µÜ·B until [vÍA§ä®ªUÆ]¿³êÄ¢éÔÍR[hªÀs³êéÆ¢¤ _ðÆAwhile [vÆÙÚ¯¶Å·Bwhile Æ until ªÄ¢éÆ vÁ½ÈçA»êͳµ¢l¦Å·B 7.1. For ÌTv #!/bin/bash for i in $( ls ); do echo item: $i done ñsÚÅAÏ i ªé¾³êĢܷB±êÉÍA$( ls ) ÉæÁÄoͳ êélXÈlª(ÔÉ)ãü³êÄ¢«Ü·BOsÚÍAKvÅ êÎàÁÆ ·Å«Ü·B·Èí¿AlsÚÌ done ÌOÉ¡Ìsª¶ÝµÄà©Ü¢ ܹñBlsÚÌ done ÍAÏ $i ÌlðgpµÄ¢½R[hª»±ÅI¹ µ½±Æð¦µÄ¢Ä¢Ü·Bµ½ªÁÄA$i ÉVµ¢lðãü·é±Æª Â\Å·BãLÍAÍÙÆñÇÓ¡ªÈ¢XNvgÅ·Bfor [vðgp ·éàÁÆLvÈû@ÍAÈOÌáèÉ Á½æ¤ÉA éíÌt@C¾¯ ðIðIÉ·éêÉg¤±Æ¾Æv¢Ü·B 7.2. C ¾êɽ for Fiesh ³ñ©çȺÌæ¤È`®Ì[vðt¯Á¦½çǤ©Æ¾íêܵ ½B±Ì for [vÍAC ¾êâ Perl Ì for [vÉÞµ½gíꩽ ðµÄ¢Ü·B #!/bin/bash for i in `seq 1 10`; do echo $i done 7.3. while ÌTv #!/bin/bash COUNTER=0 while [ $COUNTER -lt 10 ]; do echo The counter is $COUNTER let COUNTER=COUNTER+1 done ãLÌXNvgÍA(C, Pascal, Perl Æ¢Á½)L¼È¾êÌ for ̧ä \¢ð^½àÌÅ·B 7.4. until ÌTv #!/bin/bash COUNTER=20 until [ $COUNTER -lt 10 ]; do echo COUNTER $COUNTER let COUNTER-=1 done 8. Ö(functions) ÙÆñÇÇñÈvOÉÄÍÜé±ÆÅ·ªAÖ(function)ðg¦ ÎAæè_IÉêQÌR[hðO[v»·é±ÆªÅ«Ü·BܽA_é IÆࢦéÄA@(recursion)ðg¤±ÆàÂ\ÉÈèÜ·B ÖÌé¾ÍA "function my_func { my_code }" ƾ¯ÅÅ«Ü·B ÖÌÄÑoµÍA¼ÌvOÌÄÑoµÆ¯¶ÅA»Ìּ𾠯ŷB 8.1. ÖÌTv #!/bin/bash function quit { exit } function hello { echo Hello! } hello quit echo foo ñsÚ©çlsÚÉ©¯ÄÍA"quit" Æ¢¤ÖªLq³êĢܷBÜs Ú©çµsÚÉ©¯ÄÍA"hello" Æ¢¤ÖªLq³êĢܷB±ÌXN vgª½ðµÄ¢é©®SÉc¬Å«È¢ÈçAÀÛÉ©ªÅ¢ÄAÀs µÄÝľ³¢B ÖÍA½ç©ÌÁèÌl®Éæéé¾ðKvƵȢƢ¤±ÆÉ ¾³¢B ±ÌXNvgðÀs·éÆAÅÉ "hello" ÖªÄÑo³êAÉ "quit" ÖªÄÑo³êÜ·B»µÄvOÍ\sÚÜÅÍÀs³êÈ ¢±ÆÉCtŵå¤B 8.2. p[^[ðæéÖÌTv #!/bin/bash function quit { exit } function e { echo $1 } e Hello e World quit echo foo ãLÌvOÍAOLÌvOÆÙÚ¯êÅ·BåÈá¢ÍAÖ "e" ̶ÝÅ·B±ÌÖÍó¯æÁ½æêøð\¦µÜ·BøÍAÖ ÌàÉ éÆ«ÅàAXNvgɼÚnµ½Æ«Æ¯¶æ¤ÉµíêÜ ·B 9. [UC^[tFCX 9.1. ÈPÈj [ðìé½ßÉ select ðg¤ #!/bin/bash OPTIONS="Hello Quit" select opt in $OPTIONS; do if [ "$opt" = "Quit" ]; then echo done exit elif [ "$opt" = "Hello" ]; then echo Hello World else clear echo bad option fi done àµãLÌXNvgðÀsµ½ÈçAeLXgx[XÌj [Æ¢¤v O}ÌÐÆÂ̲ªÀ»µÄ¢é̪ª©éÆv¢Ü·Bܽ for ̧ä \¢ÆÄ¢é±ÆÉàCt¢½©àµêܹñB$OPTIONS Éãü³ê½ê (word)ðÐƸÂ[v³¹éãíèÉAvvgðo͵ĢéÆ¢¤ ᢪ 龯¾©çÅ·B 9.2. R}hCðgÁÄÝé #!/bin/bash if [ -z "$1" ]; then echo usage: $0 directory exit fi SRCD=$1 TGTD="/var/backups/" OF=home-$(date +%Y%m%d).tgz tar -cZf $TGTD$OF $SRCD ãLÌXNvgª½ð·é©ÍAनª©èŵå¤BÅÌð§äÌ ®ÍAvOªø ($1)ðó¯æÁ½©Ç¤©ð²×éàÌÅ·B»µ ÄAøðó¯æçÈ©Á½Æ«ÍÈPÈgpû@É¢ÄÌbZ[Wð\ ¦µÄI¹µÜ·BXNvgÌcè̪ÍA±Ì_Å;ľÆv¢Ü ·B 10. »Ì¼ÌXNvg 10.1. read ðgÁÄ[UÌüÍðÇÝÞ [Uɽç©ÌüÍ𣵽¢Æv¤êªæ éàÌÅ·B»êðÀ» ·éû@͢©¶ÝµÜ·ªAȺͻêç̤¿ÌÐÆÂÅ·B #!/bin/bash echo Please, enter your name read NAME echo "Hi $NAME!" ãLÌÏ`ƵÄAread ðgÁÄ¡Ìlðó¯æé±ÆàÅ«Ü·BÌ áèÍ»êð¾ç©É·éàÌÅ·B #!/bin/bash echo Please, enter your firstname and lastname read FN LN echo "Hi! $LN, $FN !" 10.2. lÌ]¿ R}hC( é¢ÍVF)ÅAÌæ¤ÉÅÁÄÝľ³¢B $ echo 1 + 1 2 ªoͳêéÆúҵĢ½ÈçAªÁ©èµ½±Æŵå¤B bash É lðvZ³¹½¢Æ«ÍAǤµ½ç¢¢Ìŵå¤HðôÍÌæ¤É· é±ÆÅ·B $ echo $((1 + 1)) ãLÅÍAæèWJÈoͪȳ꽱ÆÆv¢Ü·B±êÍ®ð]¿ µ½Æ¢¤±ÆÅ·BܽAÌæ¤È\»Å௶±ÆªÅ«Ü·B $ echo $[ 1 + 1 ] ªâ é¢ÍàÁÆ¡GÈwIªKvÉÈÁ½êA é¢Í®Å Vѽ¢Æ«ÈÇÍA®]¿Ì½ßÌ bc Æ¢¤R}hªg¦Ü·BR} hvvgãÅ "echo $[3/4]" ÆÀsµÄàAbash ͮŵ©¦ð ԹȢÌÅAÊÍ 0 ÆÈèÜ·Bµ©µA"echo 3/4 | bc -l" ÆÀs· êÎA0.75 Æ¢¤³µ¢¦ªÔÁÄ«Ü·B 10.3. bash ðT· Mike ©çÌbZ[WðfڵܷB(Ó«ð©Ä¾³¢) Ƚ͢Âà #!/bin/bash Æ¢¤ÌðgÁĢܷªAbash ªÇ±É é Ì©T·û@ðᦵ½Ù¤ª¢¢Æv¢Ü·B"bash ð»ÌêÉu¢Äµ ܦ΢¢ÌÅ·ªA·×ÄÌ}Vª»êðµÄ¢éí¯ÅÍ èܹñB [gfBNg©çA'find ./ -name bash' ðÀs·êÎÊíÍTµo ¹é͸ŷB `FbN·×«ÈÌÍAÌæ¤Èêŵå¤B ls -l /bin/bash ls -l /sbin/bash ls -l /usr/lodal/bin/bash ls -l /usr/bin/bash ls -l /usr/sbin/bash ls -l /usr/local/sbin/bash (±êÈOÌfBNgÍ·®Év¢©Ñܹñ... VXeªáÁÄ àA±êÜÅͱ̩ç©Â©éêªÙÆñÇŵ½B) »ê© çA'which bash' ðgÁÄÝéÌࢢÆv¢Ü·B 10.4. vOÌßèlðl¾·éû@ bash ÅÍAvOÌßèlð $? Æ¢¤ÁêÈÏÉüêĨ±Æª Å«Ü·BȺÍAvOÌßèlðl¾·éû@ð¢½àÌÅ·B½ ¾µA /dada Æ¢¤fBNgÍÀݵܹñB(±êà Mike ©çÌñÄ ðÚ¹½àÌÅ·) #!/bin/bash cd /dada &> /dev/null echo rv: $? cd $(pwd) &> /dev/null echo rv: $? 10.5. R}hoÍðl¾·éû@ ȺÌÈPÈXNvgÍA·×ÄÌf[^x[XãðTµÄSÌe[u ð\¦·éÆ¢¤àÌÅ·( MySQL ªCXg[³êÄ¢é±ÆªOñÅ ·)B±ÌÌ 'mysql' Æ¢¤R}hªðÏXµÄALøÈ[U¼Æp X[hªg¦éæ¤ÉµÄ¾³¢B #!/bin/bash DBS=`mysql -uroot -e"show databases"` for b in $DBS ; do mysql -uroot -e"show tables from $b" done 10.6. ¡Ì\[Xt@C R}h\[XƵġÌt@Cðg¤±ÆªÅ«Ü·B ì¬\è( TO DO ) 11. QÆe[u 11.1. ¶ñärZq (1) s1 = s2 s1 Æ s2 ª¯ê (2) s1 != s2 s1 Æ s2 ª¯êÅÈ¢ (3) s1 < s2 ì¬ (4) s1 > s2 ì¬ (5) -n s1 s1 ª null ÅÈ¢(ê¶ÈãðÜñÅ¢é) (6) -z s1 s1 ª null Å é 11.2. ¶ñärÌÀá Ó½Â̶ñðär·é #!/bin/bash S1='string' S2='String' if [ $S1=$S2 ]; then echo "S1('$S1') is not equal to S2('$S2')" fi if [ $S1=$S1 ]; then echo "S1('$S1') is equal to S1('$S1')" fi ±±ÅAãLÌ if [ $1 = $2 ] ÉÖµÄ Andrea Beck ªÁÄê½[ Ìê¶ðøpµÜ·B Ü袢l¦Æ;¦Ü¹ñBàµA$S1 © $S2 Ìǿ穪óÌêA p[TG[ÉÈé©çÅ·Bx$1=x$2 © "$1"="$2" Ƶ½Ù¤ªæ¢Å µå¤B 11.3. lZq + - * / % (è]) 11.4. lÖWZq -gt ( > ) -le ( <= ) -ge ( >= ) -eq ( == ) -ne ( != ) C vO}ªgÁÄ¢éZqÉ¢ÄàAÛJbRðt¯ÄÎÖW𦠵ܵ½B 11.5. ÖÈR}h ±ÌZNVÍ Kees (Ó«ð©Ä¾³¢)ÉæÁÄCg³ê½àÌÅ ·B ȺÌR}hÌÈ©ÉÍA®SÈvO~O¾êðàïµÄ¢éÆ¢¦ »¤ÈàÌà èÜ·B»êçÌR}hðæèã°ÄAî{Ip@¾¯ðà ¾µæÆv¢Ü·BÚ×ÈðàÉ¢ÄÍAR}hÌ}j Ay[WðÝ Ä¾³¢B 11.5.1. sed (stream editor) sed ÍmEC^NeBuÈGfB^Å·BJ[\ðæÊãÅ®©µÈ ªçt@CÉÏXðÁ¦é©íèÉAÒWÉÖ·éw¦ÆÒW·×«t@C ¼ð«ñ¾XNvgðgpµÜ·BܽAsed ÍêíÌtB^Å éÆl¦é±ÆàÅ«Ü·B¢Â©áð©ÄÝܵå¤B $ sed 's/to_be_replaced/replaced/g' /tmp/dummy ãLɨ¢ÄAsed ÍA/tmp/dummy Æ¢¤t@CðÇÝñÅA¶ñ "to_be_replaced" ð¶ñ "replaced" Éu·µÜ·B»ÌÊÍWo Í(ÊíÍR\[)ÉoͳêÜ·ªAãLR}hCÌöÉ(ᦠÎ) '> capture' Æt¯Á¦éÈçA "capture" Æ¢¤¼OÌt@CÉ sed ÌoÍÊðé±ÆàÅ«Ü·B $ sed 12, 18d /tmp/dummy ãLÌáÅAsed Í 12 ©ç 18 sÚÜÅðSÄÌsð\¦µÜ·B±Ì R}hÉæÁijÌt@CÉÏXªÁ¦çêé±ÆÍ èܹñB 11.5.2. awk (f[^t@CâeLXgÌõÆ®`) AWK vO~O¾êÉͽÌÀª¶ÝµÜ·B(ÅàL¼ÈC^[ v^ÍAGNU Ì gawk ÆuVµ¢ awkv Å é mawk Å·B) AWK Ì´ ÍPÅ·Bp^[ðTµÄAvµ½p^[(pattern)SÄÉεÄÈ ñç©Ì(action)ðs¤Æ¢¤±ÆÅ·B ÄxAȺÌæ¤ÈsðÜÞ_~[t@Cðìèܵ½B test123 test tteesstt $ awk '/test/ {print}' /tmp/dummy test123 test ãLɨ¢ÄAAWK ªT»¤Æµ½p^[(pattern)Í "test" Å èA/tmp/dummy t@CÌsÌ©ç "test" Æ¢¤¶ñðTµoµ½Æ «ÉsÁ½(action)ªæÊÖÌ\¦ "print" Å·B $ awk '/test/ {i=i+1} END {print i}' /tmp/dummy 3 ½Ìp^[ðT»¤ÆµÄ¢éÆ«ÍANIe[V('')ÅÍÜê½ ¶ñð(á¦Î) '-f file.awk' Æ¢Á½t@C¼Åu«·¦Ü·B»¤ ·êÎA·×ÄÌp^[Æð 'file.awk' Æ¢¤t@CÉ«ñ ÅAÜÆßÄÀsÅ«Ü·B 11.5.3. grep (õp^[Év·ésÌoÍ) grep R}hÌA ép^[Év·ésð\¦·é@\É¢ÄÍA± êÜÅÌÍÅ¢Âà©Ä«½Æv¢Ü·Bµ©µAgrep Ì@\ͻ꾯 ÅÍ èܹñB $ grep "look for this" /var/log/messages -c 12 ãLÌáÍA"look for this" Æ¢¤¶ñª /var/log/messages t@C ÌÈ©Å 12 ñ©Â©Á½±ÆðÓ¡µÄ¢Ü·B [ OK, ±ÌáèÍtFCNÈñ¾B/var/log/messages É¿åÁÆèðÁ¦Æ ¢½Ì³B :-)] 11.5.4. wc (sAêAoCgð¦Ü·) ȺÌáèÅÍAoͪúÒÊèÉÈÁĢȢ̪ª©éÆv¢Ü·B±Ì áèÅgíê½_~[t@CÉÍ(OÉgÁ½àeÆÍÙÈé)Ìæ¤È¶ ñªÜÜêÄ¢½©çÅç·B bash introduction howto test file $ wc --words --lines --bytes /tmp/dummy 2 5 34 /tmp/dummy wc ÅÍp[^wèÌÔÍ©RÅ·ªA»êçÌoÍÌÔÍ¢Âà ÜÁĢܷBãLÌæ¤ÉAsAêAoCgAt@C¼ ÌÔ ÉÈèÜ·B 11.5.5. sort (eLXgt@CàÌsÌÀ×Ö¦) ¡ñÌ_~[t@CÌàeÍÌæ¤ÉÈÁĢܷB b c a $ sort /tmp/dummy ÍA»ÌAEgvbgªÇ¤\¦³êé©Å·B a b c R}hðg¤Æ·éÆA±êÙÇÈPÉÍ¢©È¢Åµå¤B 11.5.6. bc (lvZpÌvO~O¾ê) bc ÍR}hCÅì·éæÅ«½vZvOÅ·B_CN gâpCv©çÍüÍūܹñªAt@C©çÌüͪÂ\ÅA[UC ^[tFCXà èÜ·BȺÅÍA»ÌR}hÌ©ç¢Â©ðÀÛ ÉfXg[VµÄÝÜ·BȨAbc N®É -q p[^ðg pµÄ¢éÌÍAN®ÉEFJbZ[Wðoͳ¹È¢½ßÅ·B $ bc -q 1 == 5 0 5 != 5 0 2 ^ 8 256 sqrt(9) 3 while (i != 9) { i = i + 1; print i } 12345689 quit 11.5.7. tput ([Ìú»â terminfo f[^x[XÌõ) tput ÅÈɪūé©AÈPÉÐîµÜ·B $ tput cup 10 4 ãLÌáÅÍAvvgª (y10,x4) ÌÊuÉ çíêÜ·B $ tput reset ãLÅÍAæÊðàÆÉßµÄA(y1,x1) ÌÊuÉvvgð\¦µÜ ·B(y0,x0) ª¿å¤Ç¶ãÌ÷É ½éÊuÅ·B $ tput cols 80 ãLÅÍAX ²ûüɶª¢ÂÀÔÌ©ð\¦µÄ¢Ü·B (ÈÆà)ãLÌæ¤ÈvOÉ¢ÄÍAg¢µêĨ±Æð ¨EߵܷBR}hCãÌìÅÁÙÇÌðµÄêé¬³È vOÍ³É èÜ·B [áè̢©ÍA}j Ay[Wâ FAQ ©çæèܵ½B] 12. ¢ë¢ëÈXNvg 12.1. fBNgãÌSt@CÉR}hðKp·éû@ (ì¬) 12.2. Tv: ñíÉVvÈobNAbvXNvg(üÇÅ) #!/bin/bash SRCD="/home/" TGTD="/var/backups/" OF=home-$(date +%Y%m%d).tgz tar -cZf $TGTD$OF $SRCD 12.3. t@C¼ÏXXNvg #!/bin/sh # renna: ¢Â©Ì[É]ÁÄA¡Ìt@Cðl[·é # XNvg: Felix Hudson Jan 2000 # ÅɱÌvOªæé¢Â©Ìu[hvÉ¢Ä`FbN·é # æêø($1)Ìðªêv·éÈçAvOÌYªðÀsµÄ # I¹·é # prefix Ìðð`FbN·é if [ $1 = p ] ; then # [hÏ($1)Æ prefix ($2)ðæè prefix=$2 ; shift ; shift # t@Cªwè³êÄ¢é©ÈPÉ`FbN·é # wè³êĢȢƫÍA¶ÝµÈ¢t@Cðl[·é±ÆÍ # Å«È¢ÌÅAÈÉàµÈ¢ if [$1 = ]; then echo "no files given" exit 0 fi # vOÌøÆÈét@CðÉ[v·é # t@CðÐƸÂl[·é for file in $* do mv ${file} $prefix$file done # ±±ÅvOðI¹·é exit 0 fi # suffix ðl[·é©`FbN·é # ±±ÅÌcè̪ÍãLƨȶÈÌÅA»¿çð©ÄÙµ¢ if [ $1 = s ]; then suffix=$2 ; shift ; shift if [$1 = ]; then echo "no files given" exit 0 fi for file in $* do mv ${file} $file$suffix done exit 0 fi # ¼OÌu«·¦©Ç¤©ð`FbN·é if [ $1 = r ]; then shift # [UªÌàeðwèµÈ©Á½ÆµÄàt@Cª_[Wð # ó¯È¢æ¤ÉAÌR[hðÜß½ if [ $# -lt 3 ] ; then echo "usage: renna r [expression] [replacement] files... " exit 0 fi # ]vÈîñðí·é OLD=$1 ; NEW=$2 ; shift ; shift # ±Ì for [vÍvOÉ^¦çê½t@CðÉ·é # sed Æ¢¤vOðgÁÄAt@CðÐƸÂl[·é # sed ÍWüÍðÇÝñÅAÁèÌ\»ð^¦ç꽶ñÉu··é # ±±ÅÍAWüÍ©çt@C¼ðwèµÄAKvȶðu·³¹é for file in $* do new=`echo ${file} | sed s/${OLD}/${NEW}/g` mv ${file} $new done exit 0 fi # ±±ÜŽƷéÆAvOÉøªÈ©Á½Æ¢¤±ÆÈÌÅA # g¢ûð\¦·é echo "usage;" echo " renna p [prefix] files.." echo " renna s [suffix] files.." echo " renna r [expression] [replacement] files.." exit 0 # I¹ 12.4. t@C¼ÏXXNvg(ÈÕÅ) #!/bin/bash # renames.sh # basic file renamer criteria=$1 re_match=$2 replace=$3 for i in $( ls *$criteria* ); do src=$i tgt=$(echo $i | sed -e "s/$re_match/$replace/") mv $src $tgt done 13. ¤Ü¢©È¢(fobO) 13.1. bash ÌÄÑoµû øÊIÈÌÍAæêsÚÉ¿åÁÆèðÁ¦é±ÆÅ·B #!/bin/bash -x ±¤·éÆAoÍÉÛÉÊ¢îñª\¦³êÜ·B 14. ±Ì¶É墀 ñÄâù³Aܽ±Ì¶Éfڷ׫ʢ¿ÈÇÈñÅà¨CyÉA µÄ¾³¢Bū龯½f³¹Ü·B 14.1. (³)ÛØÉ墀 This documents comes with no warranty of any kind. and all that (}}) ±Ì¶ÉÍA¢©ÈéÛØຢܹñB 14.2. |óÉ墀 C^Aê: by Willy Ghelfi (wizzy at tiscalinet.it) ±¿ç tXê: by Laurent Martelli ( URL Ís¾) Øê: Minseok Park http://kldp.org Øê: Chun Hye Jin ( URL Ís¾) XyCê: óÒs¾ http://www.insflug.org àÁƽÌ|óª éÆv¤ÌÅ·ªAîñª èܹñBä¶mÌ©½ ÍAí½µÉ[ð¾³¢B±ÌÍðXVµÜ·B 14.3. Ó« o ±Ì¶ð|óµÄê½Ðƽ¿(OÍ) o Nathan Hurst ÍÚ×ÉZ³µÄêܵ½B o Jon Abbott Í®Ì]¿É¢ÄRgðÁÄêܵ½B o Felix Hudson Í renna XNvgð¢Äêܵ½B o Kees van den Broek (Z³É¦ÍµAÖÈR}hÌÍðCgµÄ êܵ½) o Mike (pink) Í bash ÌÊuðÁèµ½èt@CðeXgµ½è·é± ÆÉ¢Ģ©ñĵÄêܵ½B o Fiesh Í[vÌÍÉ¢Ģ¢ñÄðµÄêܵ½B o Lion ÍR}hG[É¢Äq×éæ¤ñĵÄêܵ ½B(./hello.sh: Command not found.) o Andrea Beck ÍZ³ÆRgÉ¢Ħ͵Äêܵ½B 14.4. üùð o |óªVKÉÇÁ³êA¢Â©ù³ðÁ¦½B o Kees ÌCgÉæéÖÈR}hÌÍðt¯Á¦½B o ù³ðñÄðåÉæèüê½B o ¶ñärÉ¢ÄÀáðâµ½B o v0.8 o[WîñðOµ½BútÅ[ª¾Æv¤B o v0.7 ù³Ó½BTO-DO ÌÍ𫼵B o v0.6 ·±µù³ o v0.5 _CNgÌÍðÇÁ o v0.4 OCÌ{XÌÓüÅ»êÜÅÌy[WÅöJÅ«ÈÈÁ½ªA±Ì ¶ÉÆÁÄÍÅKÌꪩ©Á½B <http://www.linuxdoc.org/> o »êÈO̱ÆÍo¦Ä¢È¢Brcs à cvs àgÁĢȩÁ½B 14.5. Qlz[y[W ( BeOS ÅÌ)bash ÉÖ·éÐî <http://org.laol.net/lamug/beforever/bashtut.htm> Bourne Shell ÌvO~O <http://207.213.123.70/book/> 14.6. ú{êóÉ墀 |ó çU Ti <ysenda@pop01.odn.ne.jp> Z³ äã Gå <shyugoro@pop12.odn.ne.jp> ä Lõ <takei@webmasters.gr.jp> É¡ Sê <kade@kadesoft.com>