bash shell script µ{¦¡³]­p ¬Û«H©Ò¦³ª±¹L Unixªº¤H³£·|¦P·N shell script ¬O¤@­Ó¤Q¤À±j¤jªº¤u¨ã¡A¥i¥H¥Î¨ÓÀ°§U¦Û¤w¦bµu®É¶¡¤º¸Ñ¨M³\¦h¬\\ļ¦Ó¥F¨ýªº¤u§@¡A¦Ó¥BÅý¤u§@Åܱo¦³½ì¡C ¹ï©ó shell script ­n«ç»ò¼g¡A¬°¤°»ò·|·Q¨ì³o»ò¼g¡H¹ï©ó³o­Ó°ÝÃD¡A§Ú­Ó¤Hªºµª®×¬O¡G¥Î¦h¤F¡A´Nª¾¹D¤F¡C¦³®É«ÜÁo©úªº·Qªk¡A©¹©¹¬OÆF¾÷¤@°Ê¡A´N·Q¨ì¤F¡C§Ú·|«Øij¤j®a¡A¦pªG¼g¤F¦n¥Îªº script ´N§â¥L¯d¤U¨Ó¡Aµ¹­Ó¦n¦W¦r¡C¦³®É­Ô¥Î±o¤W®É¡A´N·|«Ü°ª¿³¦³³o­Ó¦Û»sªº¤u¨ã¡C ·íµM¡A­n¼g script ¤§«e¡A­n¥ý¤F¸Ñ¤@¨ÇªF¦è¡C 1. ¸ê®Æ¬y >, >> , < , | , #&># ..... 2. ¤@¨Ç¦n¥Îªº¤u¨ã cat grep awk sed find more ........ everything you can use. 3. ÅÜ¼Æ 4. «ü¥O¥N´« 5. §PÂ_¦¡ if else fi 6. ¬yµ{±±¨î while for .... ¦b¤§«áªº´X½g¤å³¹¤¤¡A§Ú·|ºCºC§â¤@­Ó­Ó topic ¼g§¹... §Æ±æ¤£·|¼g±o¤ÓÁV UNIX¬O²Ä¤@­Ó¤ä´©¸ê®Æ¬yªº§@·~¨t²Î¡C ¤°»ò¬O¸ê®Æ¬y©O¡H ´N¬O§âµ{¦¡ªº¿é¤J©M¿é¥X·Q¹³¦¨¤@­Ó¦ê¬y¡A ¦b Unix ¤§¤U¡A¥ô©M¤@­Ó¤@¯ëªºµ{¦¡³£·|ª½±µ¶}¤T­ÓÀɮסC 0. stdin 1. stdout 2. stderr ³o¤T­ÓÀɮפÀ§O¬O ¸ê®Æ¬yªº ¿é¤J©M¿é¥X¡A¤Î¿ù»~¿é¥X stdin ====> µ{¦¡ =====> stdout ¡@¡@¡@¡@¡@¡@¡@¡@¡è==> stderr ¦b default ¤§¤U¡Astdin ¬O±µµÛ keyboard stdout ¬O±µµÛ tty (§A·Q¦¨ monitor ´N¦n¤F) stderr ¤]¬O±µµÛ tty ¸ê®Æ¬y¬JµM¬O"¬y"¡A¨º·íµM¥i¥HÂà¦V¡C "<" ³o­Ó«ü¥O©O´N¬O§â stdin ±µ¤W«á­±ªºÀÉ®× ¦p cat < test.txt ">" ¬O§â stdout ¼g¤J«á­±ªº file ¦pÀɮפº¦³ªF¦è¡A·|§âÀɮפºªºªF¦è²MªÅ¤~¼g¤J¡C ">>" ©M ">" ¬Û¦P¡A¦ý¤£·|§âÀɮפºªºªF¦è²MªÅ¡A¦Ó¬O¼g¦bÀɧÀ ¦p cat test.txt >> foo "|" (pipe)³o­Ó©O«h¬O§â«e­±ªºstdout ±µ¨ì«á­±µ{¦¡ªº stdin ¦p cat test.txt | more ³o¼Ë¡A cat ªº¿é¥X´N¥i¥H³Q more ±µ¤U¨Ó¡C > >> ÁÙ¥i¥H§â stderr Âà¨ì stdout ¦p 2>&1 ¤]¥i§â stdout Âà¨ì stderr ¦p 1>>&2 ¦b shell script ¤¤¸ê®Æ¬yÂà¦V¡A©Mpipe ¬O¤Q¤À±`¥Îªº§Þ¥© (À³¸Ó»¡¬O°ò¥»¤u¤Ò) ¦b¤@¯ë¤U«ü¥Oªº®É­Ô¤]¬O«Ü±`¥Î¤W ¦p cat pbsd.c | grep CONFIG_PBS ¦³®É­Ô¦pªG­n°µ¤@¨Ç¤ñ¸û½ÆÂøªº°Ê§@¡C±µ­Ó¥|¤­­Ó pipe ¦A¥[¤WÂà¦V¡A¤]¤£¬°¹L ¦pªG¦³¦nªº¯à¤O¡A¨S¦³¦nªº¤u¨ã¡A¨º¤]¬O¨S¦³¥Î¡A¦ý«Ü©¯¹Bªº¬O¡A ¤§«eªº Unix Programer ¼g¤F³\¦h¤è«K¦Û¤vªº¤u¨ã¡A¬Û¦Pªº¨º¨Ç¤u¨ã\r ¤]¯à¤è«K§Ú­Ì¡C ¤U­±¬O¤@¨Ç¤u¨ãªºÂ²³æ¤¶²Ð¡C(³£¥i¥Î pipe ©MÂà¦V) cat : ¡@¡@§âÀÉ®×¥´¶}¡A¦L¨ì stdout ¤W grep : ¡@¡@ grep ¬O¤@­Ó¦b¿é¤J¸ê®Æ¤¤§ä¥X«ü©ú­n§äªº¦r¦êªº¨º¤@¦æ¤å¦rªº¤u¨ã¡C ¡@¡@¦p ¡@¡@ grep "I Love Shell Script" test.txt ¡@¡@ ´N¬O§â test.txt ³o­ÓÀɮפ¤¡A¦³ "I Love Shell Script" ³o­Ó¦r¦êªº¨º¤@¦æ¦L>¨ì ¡@¡@stdout ¤¤¡C ¡@¡@cat test.txt | grep "I Love Shell Script" #¤]¬O¤@¼Ëªº awk : ¡@¡@¤@­Ó¥Î¨Ó¤ÀªR¤º¤åªº¤u¨ã¡A¥¦¥i¥H±½´y¤å³¹¤º®e¡A§ä¥X§A­nªº¤å¦r¡A¥B ¡@¡@¨Ì§Aªº­n¨D°µ¿é¥X¡A§A¥i¥H§â¥¦·í°µ grep ªº¥[±jª©¡C ¡@¡@awk ªº»yªk«Ü¹³ C »y¨¥¡A©Ò¥H¹ï·|¼g C »y¨¥ªº¤H¦Ó¨¥¡A³o¬O¤@­Ó«Ü¦n¥Îªº¤u¨ã ¡@¡@¦p ¡@¡@awk '{print NR,$0}' text.txt ¡@¡@´N·|§â text.txt ªº¤º®e¦L¥X¨Ó¡A¥B¥[¤W¦æ¼Æ sed : ¡@¡@³o­Ó¤u¨ã¥i¥HÀ°§A§â§A·Q´«±¼ªº¦r¦ê¤@¦¸´«±¼ awk ©M sed ³o¨â­Ó¤u¨ã¬O¤Q¤À±j¤jªº¤u¨ã¡A¥¦­Ì¥i¥H°µ¨ìªº¨Æ¤Q¤Àªº¦h »·¤ñ¥¦¤@¶}©l³Q©w¸q®É©Ò·Q¨ìªº¥\¯àÁÙ¦h¡A¦h¨ì¥i¥H¼g¤@¥»®Ñ¨Ó½Í¡C\r O'Reilly ´N¦³¥X¤@¥» awk & sed ªº®Ñ¡A¦³¿³½ìªº¸Ü¥i¥H§ä¤@¥»¨Ó¬Ý¬Ý¡C find: ¡@¡@³o­Ó¤u¨ã¥i¥H¨Ì§Aªº­n¨D¡A§ä¥X§A·Q­nªºÀɮסA¦b¨t²ÎºÞ²z¤W«Ü¦n¥Î¡C ¡@¡@¥i¬O¨Ì®É¶¡¡A¤j¤p¡AÀɦW¡A­×§ï®É¶¡µ¥µ¥ªº¿ï¶µ¨Ó§äÀɮסC more (less) : ¡@¡@§â stdin or Àɮפº®e¤À¦¨¤@­¶¤@­¶ªº¨Ó¬Ý¡A¤@¯ë¨Ó»¡¡A less ¤ñ¸û±j¤@¨Ç¡C ¡@¡@¥i¥H¤ä´© vi ªº»yªk¡A¦ý¥Ø«e more ¤]¤@¤@¤ä´©¤F¡C ¥H¤W¨C­Ó¤u¨ã³£¬O¤Q¤À¦n¥Îªº¤u¨ã¡C ¦ý§Ú¨S¦³¸Ô²Óªº½Í¡A¸Ô²ÓªºªF¦è©O¡A§A¥i¥H¥Î man ³o­Ó¤u¨ã¨Ó¬Ý¡C ¦p man find µM«á§A´N·|¤F¸Ñ¬°¤°»ò§Ú¥u»¡¤@¤U¥¦­Ìªº¥\¯à¤F ¦b bash ¤¤³]©wÅܼƫܮe©ö ¤£¥Î«ü©w§ÎºA ª½±µ«ü©w´N¥i¥H¤F ¦p myvar="I love linux." ´N¬O«ü©w myvar ³o­ÓÅܼƬ° "I love linux." ³o­Ó¦r¦ê ¨Ï¥Î³o­ÓÅܼƩO¡A«h¬O¥Î $myvar ¨Ó¨Ï¥Î ¦p echo $myvar ¦p·Q¹ï Åܼưµ¹Bºâ¡A¥i¥Î let let "expression" ¦p let i=i+1 ¦b shell script ¤¤¡A¥i¥H¦b script ¥[¤W°Ñ¼Æ ¦Ó°Ñ¼Æ·|¨Ì§A©Ò¥´¤Jªº«ü¥O¨Ì§Ç©w¸q ¦p¦³¤@­Óscript ¥s showme #!/bin/bash # filename showme echo $0 echo $1 echo $2 °õ¦æµ²ªG¦p¤U >./showme abc def ./showme abc def ¦pªG­n show¥X©Ò¦³°Ñ¼Æ¡A¥i¥H $* ªí¤§¡C ­nª¾¹D°Ñ¼Æ¼Æ¶q¡A¥i¥H $# ªí¤§ $$ ¬° script °õ¦æ®Éªº pid -- ¼gµÛ¼gµÛ¡A¦³¤@¨ÇªF¦è¤£²M·¡¡A§ä¤F¤@¤U man µo²{ man ¼g±o¯u¬O²M·¡·¥¤F¡C ¤W google ¬d¤F¤@¤U¡A¦³¤@­Óºô­¶¾ã²zªº«Ü¦n http://www.fanqiang.com/a4/b1/index_b.html ¬Ý¨Ó§Ú¥i¥H¤£¥Î¼g¤F ¦b bash ¤§¤¤ §Ú­Ì¥i¥H¥Î ` command` ¨Ó°õ¦æ«ü¥O¡A¥B±N¨äµø¬°¤@­Ó¾ãÅé¡A³Ì«áªºµ²ªG¬°¥þ³¡ªºµ²ªG ¨Ò¦p ls -alF `find -size 0` ´N¬O§ä¥X©Ò¦³ size == 0 ªºÀÉ®× ±N¤§µ²ªG·í°µ¬O ls -alF ªº°Ñ¼Æ ³o­Ó§Þ¥©¦b shell ¤§¤¤«Ü±`¨£¦p NumberOfFiles=`find | wc -l` ´N¬O§â find | wc -l ³oµ²ªG«ü©w¬° NumberOfFiles ªº­È shell script ¬O¤@­Ó§¹¾ãªº»y¨¥¡A·íµM·|¦³ if else µ¥µ¥ªº«ü¥O ´NÅý§Ú­Ì¨Ó¬Ý¬Ý¦p¦ó¨Ï¥Î bash shell ªº §PÂ_¦¡ §a ¦b³oùاڬO°²³]¤j®a·|¨Ï¥Î¬YºØµ{¦¡»y¨¥¡C ®æ¦¡¬O¦p¤Uªº if expression; then ¡@¡@list elif list; then ¡@¡@ list else ¡@¡@list fi ³oùتº list ¥Nªí¬O¤@­Ó©Î¤@°ï«ü¥Oªº¶°¦X¡C expression ¥Nªíªº¬O¤@­Ó·|¦³return ­Èªº«ü¥O¡C ¦pexpression ¤£¬°ªÅ¡A©Î 0 ´Nªí¥Ü¬° true fi ¥Nªí ³o­Ó if µ²§ô¤F ¦p¦P C »y¨¥ªº } then ´N¦p¦P C »y¨¥ªº { elif «á­±ªº list ·|¨Ì§Ç°õ¦æ¡A¨ì¤F³Ì«á¦p¤£¬°ªÅ¡A©Î 0 ´N¬°¯u ¤]´N¬O¦A°õ¦æ«á­±ªº list ¹ï©ó expression ¦p­n¼g§PÂ_¦¡ ¦³¨âºØ®æ¦¡ 1. (( expression )) ³o­Ó®æ¦¡µ¥¦P©ó let "expression" ³o´N¬O§â expression ¤ºªº¸ê®Æ°µ­pºâ ¨Ò¦p (( $abc + 1 )) 2. [[ expression ]] ³o­Ó®æ¦¡µ¥¬O¥i¥H¤ñ¸û³o­Ó expression ªº¨âÃä ¦p [[ $1 == "abc" ]] ¦pªG¬Û¦P¡A´N¬° 1 §_«h¬° 0 ¤ñ¸ûªº¹Bºâ¤l¦³ == != ! && || == ¬O¥þµ¥ != ¤£µ¥ ! not ¹Bºâ¤l && and ¹Bºâ¤l || or ¹Bºâ¤l ¦p ( (( $# > 3 )) && [[ $1=="abc" ]] && ( [[ $2!="def" ]] || ![[ $3=="ghi" ]]) ) ¤@­Ó¨Ò¤l if (( $#==0 )) ; then echo "usage: xxx [xxx | xxxx]" else ¡@if ( [[ $1 != "xxx" ]] && [[ $1 != "xxxx" ]] ) ; then ¡@¡@echo "prometer [xxx | xxxx]" ¡@¡@exit ¡@fi ¡@if [ $1 = "xxx" ]; then ¡@¡@.... ¡@else ¡@¡@........ ¡@fi fi ¦bµ{¦¡¤§¤¤¡Afor ©M while Åý§Ú­Ì¬Ù¤U¤F«Ü¦hªº¤O®ð ¦b bash shell ¤§¤¤ for ©M while ªº¥Îªk¦p¤U for: ¦bbash ¤¤ for ªº¥Îªk¦³¨âºØ for name [ in word ] ; do list ; done for (( expr1 ; expr2 ; expr3 )) ; do list ; done ²Ä¤@ºØ¬O±q ¦r¦êªºarray ¤¤®³¥X¤@­Ó¡A¦¨¬° name (name ¬°ÅܼÆ) ¦A¶i¤J°j°é¤¤¡Aª½¨ìarray ¤¤ªº¦r®³§¹¬°¤î (list ¬°°j°é¤º®e) ²Ä¤GºØ´N«Ü¹³ C »y¨¥¤F, ²Ä¤@¦¸¶]®É¡A¤@¶}©l run expr1 ¦A check expr2 ¶]§¹ list «á ¶] expr3 ¦A¶] expr2 ¤@¥¹expr2 ªºµ²ªG¬O 0 or ªÅ ´N¸õÂ÷ while: while ªº¥Îªk while list_a ; do list_b; done ·í list_a ªº³Ì«á¤@­Ó command µ²ªG¤£¬° 0 ©Î ªÅ¤§®É¡A´N¶i¤J°j°é°µ list_b until: until list_a; do list_b; done ©M while ¬Û¤Ï¡A·í list_a ªº³Ì«á¤@­Ó command ªºµ²ªG¤£¬° 0 ©ÎªÅ®É¡AÂ÷¶}°j°é¡C ÁÙ¦³¤@¨ÇªF¦è ¦p select case esac µ¥... ³o¨ÇªF¦è¥i¥H¥Î if for or while ²Õ¦X¦Ó¦¨¡A´N¤£¦A»¡©ú¤F¡C »¡¤F¨º»ò¦h¡A§Ú­Ì¶}©l¨Ó¼g¼g bash shell script §a ´N®³¤§«epost ¹Lªº chout ¬°¨Ò¤l¦n¤F ­º¥ý¡A¤@©l¶}¼g shell script ªº¤H«Ü¦³¥i¯à¤£ª¾¹D¦p¦ó°õ¦æ shell script °²³]§Ú­Ì¦³¤@­Ó shell script ¥s chout ¤w¸g¼g¦n¤F §Ú­Ì¦³¨â­Ó¤èªk¥i¥H°õ¦æ¥¦ 1. bash chout ³o­Ó¤èªk¬O°õ¦æ¤@­Ó bash ¡A¥B¥s¥¦Åª¤J chout ¨Ã°õ¦æ 2. ¦b chout ªº²Ä¤@¦æ¥[¤J #!/bin/bash (§i¶D§Aªºshell ³o­Ó shell script «ü©w¥Î bash) ¦A chmod a+x chout («ü©w chout ¬°¤@­Ó¥i°õ¦æÀÉ) ¤§«á§A´N¥i¥H§â chout ·í¤@­Óµ{¦¡¨Ó¨Ï¥Î¤F¡C Åý§Ú­Ì¨Ó¬Ý¬Ý³o­Ó¨Ò¤l 01 #!/bin/bash 02 if (( $#==1 )) ; then 03¡@¡@ares=`find -name '*.c'` 04¡@¡@ares="$ares `find -name '*.h'`" 05 else 06 ¡@¡@ares=`find -name $2` 07 fi 08 for arrs in $ares 09 do 10 ¡@if [ -f $arrs ] && (( `cat $arrs | grep -i $1 | wc -l` > 0 )); then 11 ¡@¡@echo "In file $arrs" 12 ¡@¡@cat $arrs | awk '{print "#"NR"\t"$0}' | grep -i $1 13 ¡@¡@echo " " 14 ¡@fi 15 done 01 ¦æ§i¶D§Ú­Ì¡A³o¬O¤@­Ó bash ªºµ{¦¡ 02 $# ¬OÅܼƪº¼Æ¶q¡A¤]´N¬O : ­Y Åܼƪº¼Æ¶q¬° 1 «h°µ 03 04 §_«h°µ 06 03 §â "find -name *.c" ³o­Ó«ü¥Oªºµ²ªG¦s¦bares ¤¤ 04 ares ¦A¥[¤W find -name *.h ªºµ²ªG 06 §ä ¦W¦r¬°²Ä¤G­Ó°Ñ¼ÆªºÀɮסA¥B¦s¦¨ ares 08 ¦b ares ¤¤¨Ì§Ç§ì¥X¤@­Ó¤¸¯À¡A©R¤§¬° arrs ¡A¦p§ì§¹¤F¡A°µ 15 ¦æªº¤U¤@¦æ(¨S¦³¤F¡A´N¬Oµ²§ô¤F) 09 10~14 ¬O°j°é½d³ò 10 ·í $arrs ¬OÀÉ®× ( [ ] ¬O test ªºÂ²¼g (¦³¿³½ì½Ð¬Ý man test)) ¥B $arrs ¦³¤j©ó¤@¦æ¥]²[ ²Ä¤@­Ó°Ñ¼Æªº¸Ü¡A°µ 11~13 11 À³¸Ó¤£¥Î¸ÑÄÀ§a 12 ¬°$arrs ¤¤ªº¤º®e¥[¤W¦æ¸¹¡A¥u show ¥X¦³ $1 ªº¦æ 13 ¦LªÅ¥Õ¦æ ¡@ ¥H¤W¥u¬O¤@­Ó¤p¤pªº shell script ¦]¬° shell script ¤£¥Î compile ¡A¥u­nÀH¤â§ï§ï¡AÀH¤â¼g¼g´N¯à¥Î¡C ¤£¥Î¦Ò¼{¤Ó¦h§ÎºAªº°ÝÃD¡A©Ò¦³µ{¦¡³£¬O«ü¥O¡C³£¬O ¥i¥Îªºfunction ©Ò¥H¦b¨Ï¥Î¤W«Ü¤è«K¡A¥u­n¦h¥[¤@ÂIÂI¥©«ä¡A´N¥i¥H¥Î¤@ÂIÂIªº®É¶¡¡A°µ¥X¤@¨Ç«Ü¬¯ªºªF¦è¡C ¸ÕµÛª±ª±¬Ý§a¡A«Oµý linux ¥\¤O·|¤j¼W³á!! #!/bin/bash for file in * do echo $file done ³o¼Ëªºshell¡A·|¦C¥X¥Ø«e¥Ø¿ý¤¤©Ò¦³ªºÀɦW * ¬Oshell defaultªº²Å¸¹¡A¥¦ªí¥Ü¤@­Óarray¦s©ñ©Ò¦³ªºÀɦW¸ê®Æ¡Afor ·|±Narray¤¤ªº¸ê®Æ¤@µ§¤@µ§ªº¥á¶ifileÅܼƤ¤¡Aª½¨ìfile¬°ªÅ¡A¤~¸õ¥X¦^°é¡C $ ±NfileÅܼƤ¤ªº­È¨ú¥X ¥H¤W¬O¾ã­Ófor¦^°éªº¹B§@¹Lµ{¡A§Æ±æ¹ï¤j®a¦³À°§U¡C