Chap 0 -- «e¨¥ ( UNIX Shell Programming not for guru ...... )


(0.1) ŪªÌ»Ý­n¨º¨Ç°ò¦ ?

³o½g¤å³¹ªº¥DÃD¬O UNIX Shell Programming . ¾\Ū³o½g¤å³¹¶·­n¤@ÂI
°ò¦ , ¥]¬A : ¹ï UNIX ªº©R¥O­n¦³¤@ÂI»{ÃÑ , ¤×¨ä¬O±`¥Î , ­«­nªº
©R¥O . ¦¹¥~ , §A¤]¥²»Ý·|¦b UNIX ¤W¨Ï¥Î editor , ¹³ vi , joe ©Î
emacs µ¥ ...... ·íµM , °²¦p§A¦³¼gµ{¦¡ªº¸gÅç , ¨º»ò UNIX Shell
Programming ¹ï§A¨Ó»¡¤£¹L¬O¤Ï´x§éªK½}¤F . 


(0.2) ¨Ï¥Î¨º¤@ºØ Shell ? Why ?

¬JµM Shell ¦³«Ü¦hºØ , §Ú­Ì©Ò­n¤¶²Ð¬O³Ì¦­¥Ñ AT&T Bell Labs ªº
Stephen Bourne ©Ò¼gªº¼Ð·Ç Shell , ¤]´N¬O©Ò¿×ªº Bourne Shell .
¦b¤@¨Ç±¡ªp¤U , ¤]·|¶¶«K´£¤@¤U C Shell ¬ÛÃöªºªF¦è . 

¬JµM²{¦b¤w¸g¦³¤F§ó·s§ó¦nªº Shell , ¨º§Ú­Ì¬°¤°»òÁÙ­n¤¶²Ð Bourne
Shell ©O? ³o¬O¦]¬° , ¦b UNIX Shell Programming ¤¤ , ¦³³\¦h³£
ÁÙ¬O¥Î Bourne Shell ªº»yªk¼g¦¨ªº , ¤×¨ä¹³ /etc/rc.X ( SunOS ) 
¦Ó¤@¯ë¨Ï¥ÎªÌ©Î³\¥Î C Shell ªº¼W±jª© tcsh ©Î bash ( Bourne Again
Shell ) ³o¨Ç¤ñ¸û·sªº Shell . ¤£¹L¨S¦³Ãö«Y , ¥u­n¨t²Î¤¤¦³ sh
( Bourne Shell ) ³o­Óª½Ä¶¾¹¦s¦b , ¨º»ò , §Ú­Ì³£¥i¥H¥Î Bourne
Shell ªº»yªk¨Ó¼gµ{¦¡ . ( ¨S¦³ sh ªº¨t²Î , ¬O«ÜÃø·Q¹³ªº ...... ) 
ÁÙ¦³¤@ÂI , ¥Î sh ¨Ó¼gµ{¦¡¹ê»Ú¤W¤ñ¥Î csh ­n¦n , ºô¸ô¤W¤w¸g¦³
°Q½×¹L¤F , «Ü¦h®Ñ¤]³£´£¨ì¥Î csh ¼gµ{¦¡ªº¯ÊÂI , ¨Ã«ØÄ³¤£­n¥Î
csh ¨Ó¼gµ{¦¡ . §Ú­Ó¤H¨S¦³¤°»ò·N¨£ , sh »P csh ´N¦n¤ñµ{¦¡»y¨¥
¤¤ªº Pascal »P C (¥u¬O¤ñ³ë) , ·Q¥²¾Ç¹L³o¨âºØ»y¨¥ªº¤H³£ª¾¹D ,
¥u­n¾Ç·|¤F¨ä¤¤¤@ºØ , ¥t¤@ºØ¤]¤£ºâ¤ÓÃø¾Ç , sh »P csh ¤]¬O¤@¼Ë .
ªp¥B¼gµ{¦¡¯à¯u¥¿§@¨Æ´N¥i¥H , ¤£»Ý­n¤@¤U¤l¥Î sh , ¤@¤U¤l¥Î csh
¨Ó¼gµ{¦¡ . 

*************************************************************

ª`·N !!!! ©Ò¦³ªº¨Ò¤l³£­n¦b Bourne Shell ¨t¦CªºÀô¹Ò¤U¾Þ§@
«ØÄ³¥ý¬Ý¬Ý 2.3 , ¤~¤£·|·d¤F¥b¤Ñ , ¤~µoı­ì¨Ó§A¬O¥Î C Shell
¨t¦Cªº Shell (Shell ªººØÃþ¤Î¨t¦C¥i°Ñ¦Ò 2.3)
¦¹¥~ , ¤å¤¤ªº¤@¨Ç¨Ò¤l³£¬O¦b Linux ¤U¾Þ§@ , ¦b SunOS ©Î HP
¤W , ©R¥O¤]³\¦³¤Ö³\ªº¤£¦P . ·í§A¦bºt½m®É , °²¦p¤£¯à¥¿½Tªº
°õ¦æ , §AÀ³¸Ó¬Ý¬Ý«ü¥Oªº manual . ¹³ SunOS ªº find »P Linux
ªº find ´N¦³®t²§ . ¤j³¡¥÷ªº¨Ò¤l³£¥i¥H¦b¦UºØ¤£¦Pªº¥­»O¤W°õ¦æ .

*************************************************************


(0.3) ¥»½g¤å³¹ªº¬[ºc 

¥»¨Ó·Q¥Î html ¨Ó¼gªº , ³o¼Ë¦ü¥G¤ñ¸û¦n , ¦ý¬Oı±o¦³ÂI³Â·Ð , ©Ò
¥HÁÙ¬O¥Î¥­±`ªº®æ¦¡¨Ó¼g , ¦U¦ì°²¦p¥Î joe , ¨º»ò·í¬Ý¨ì (°Ñ¦Ò x.y)
®É , §AÁÙ¬O¥i¥H¥Î ctrl-k f ¨Ó´M§ä x.y ªº¼ÐÃD ; ¦b vi ¤U¤]¥i¥H¥Î
/x.y ¨Ó´M§ä , ³o¼Ë¤]³\¤]¥i¥H¹F¨ì hypertext ªº®ÄªG§a ...... :)

Chap 1 -- ²¤¶
Chap 2 -- °ò¥»ª¾ÃÑ
Chap 3 -- Shell Programming ¤¤ªº¸ê®Æªí¥Ü
Chap 4 -- Shell Programming ¤¤ªº»yªk
Chap 5 -- Ū¨ú¸ê®Æ¤Îµ{¦¡°»¿ù
ªþ¿ý¤@ -- Shell Summary ¤Î ¤@¨Ç Shell Script ªº¨Ò¤l
ªþ¿ý¤G -- grep ²¤¶¤Î regular expressions
°Ñ¦Ò¸ê®Æ -- ¤¶²Ð¤@¨Ç¬ÛÃöªº®Ñ¤Î¸ê®Æ


(0.4) °²¦p§A¤w¸g¹ï Bourne Shell Programming «Ü¼ô ......

¨º¤]³\ªþ¿ý¤@ Shell Summary ·|¹ï§A¦³½Æ²ß¤Î§Ö³t°Ñ¦Òªº¦n³B !
ÁÙ¦³ , °Ñ¦Ò¸ê®Æ¤¤ªº®Ñ¥Ø , ³£¬O­È±o¤@¬Ýªº®Ñ , °²¦p§AÁÙ¨S¬Ý¹L ,
¨º§Ú·Q§A¥i¥H°Ñ¦Ò¬Ý¬Ý . ·íµM , man ¤Î grep ªº°t¦X , ¤]±`±`
¥i¥H§U§A¤@Áu¤§¤O .




Chap 1 -- ²¤¶


µLºÃªº , UNIX ¬O¤@­Ó¥\¯à±j¤jªº§@·~¨t²Î , ¥¦¦h¤H¦h¤u¯S©Ê , ºô¸ô
ªº¤ä´© , ¦hªö¦h«ºªº X Windows System , ³£¬Û·íªº§l¤Þ¤H . °£¦¹¤§¥~
UNIX ÁÙ¦³¤@¶µ­«­nªº¯S©Ê , ´N¬O¥¦´£¨Ñ¤F¼Æ¥H¦Ê­pªº©R¥O .
¨C­Ó¤H³£ª¾¹D , DOS ¤U­±¤]¤£¹L¤G¤T¤Q­Ó©R¥O , ³o¤G¤T¤Q­Ó©R¥O¥i¯à
¤@¨â¤Ñ´N¥i¥H¾Çªº«Ü¦n¤F ; ¦ý UNIX §@·~¨t²Î«h¤£µM , ¼Æ¦Ê­Ó©R¥O´Nºâ
³£¾Ç·|¤F , ­Y§Ú­Ì¤£ª¾¹D¦p¦ó¥h "²Õ¦X³o¨Ç©R¥O" , ¨º§Ú­Ì±N¥¢¥h¾Ç²ß
UNIX ªº³Ì¤j¼Ö½ì !!

¦³¤H·|ı±oºÃ´b : "²Õ¦X©R¥O"·|¦³½ì¶Ü ? ¤°»ò¥s§@ "²Õ¦X©R¥O" ?
³o´N¬O§Ú­Ì©Ò­n¾Ç²ßªº . ²{¦b´NÁ|¤@­Ó³Ì²³æªº¨Ò¤l¦Ó¨¥ : ½Ð­pºâ¥Ø«e
¤u§@¥Ø¿ý¤U¦@¦³¦h¤Ö­Ó´¶³qÀÉ®× ( Regular File ) ?

·í§A¹J¨ì³o¼Ëªº°ÝÃD , §A­n¦p¦ó¸Ñ¨M ? ¦³¤H·|»¡ : " §Ú¥Î ls -l ¦C
¥X¥Ø«e¤u§@¥Ø¿ý¤U©Ò¦³ªºÀÉ®× , µM«áºCºCªº¼Æ ...... " , °²¦p§A¥Î¤F
³o¼Ëªº¤èªk , ¦Ó¥Ø«e¤u§@¥Ø¿ý¤U¤S¦³¼Æ¦Ê­ÓÀÉ®× , ¨º»ò , §Ú¯uªº«Ü·q
¨Ø§A "·M¤½²¾¤s" ªººë¯« . ÁÙ¦³¨Ç¤H¤ñ¸û "¼É¤O" , ¥L»¡ : " ³o­Ó¹À
«Ü²³æ , §Ú¼g¤@­Ó C »y¨¥µ{¦¡ , ¥Î opendir , lstat µ¥¨ç¼Æ¨Ó­pºâ
¬Y¤@¥Ø¿ý¤U¦³¦h¤Ö­Ó´¶³qÀÉ®× ...... " °²¦p§A­n³o¼Ë°µ , ¨º§Ú·íµM¤£
¤Ï¹ï , ±`½m²ß¼gµ{¦¡¤]¬O¤£¿ùªº . µM¦Ó , ´N¬°¤F³o»ò¤p¤pªº¤@­Ó°ÝÃD
¦Ó¼g¤@¬q C »y¨¥ªºµ{¦¡ , ¥¼§K¤Ó¤pÃD¤j§@ . ¹ê»Ú¤W , ¸ÑµªªºÃöÁä´N
¦b : " §A¬O¤£¬O·|±q¼Æ¦Ê­Ó UNIX ªº©R¥O¤¤¬D¥X¾A¦Xªº©R¥O , µM«á§â
³o¨Ç©R¥O²Õ¦X°_¨Ó , ¥H¹F¨ì§Ú­Ì©Ò­nªº¥Øªº !! " . " UNIX ªº¨C­Ó©R¥O
´N¦n¤ñ¦UºØ¤£¦Pªº IC , ¨CºØ IC ³£¦³¥¦¯S®íªº§@¥Î , ÂǥѤ£¦P IC ªº
²Õ¦X . §Ú­Ì¥i¥H¹F¨ì§Ú­Ì©Ò­nªº¥\¯à " , " ­n¹F¨ì¥Øªºªº¤èªk , ±`±`
¤£¬O¥u¦³¤@ºØ ......" ¤W­±³o´X¥y¸Ü¬Û·í­«­n , ¦U¦ì²{¦b¤]³\ÁÙ¤£²M
·¡ . ¤£¹L¤W­±´X¥y¸Ü©Ò´£ªº , ªº½T´N¬O UNIX »á¬°§l¤Þ¤Hªº¦a¤è¤§¤@ .
°£¤F©R¥O¤§¥~ , Shell ´£¨Ñ¤F¤@¨ÇÃþ¦ü¤@¯ëµ{¦¡»y¨¥ªº»yªk , §Ú­Ì¥i
¥H§Q¥Î³o¨Ç»yªk¨Ó¼gµ{¦¡ . ¦Ó³oÂI¤]¥¿¬O¥»½g¤å³¹ªº³Ì¥D­n¤º®e .




Chap 2 -- °ò¥»ª¾ÃÑ


(2.1) ¤°»ò¬O Shell ?

§Ú­Ì¥i¥H§â UNIX ¤Á¦¨¨â¤è­±¨Ó¬Ý , ¤@³¡¥÷¬O¨t²Îªº®Ö¤ß (kernel) ,
¥t¤@³¡¥÷´N¬O¨t²Î¤¤ªºÀ³¥Îµ{¦¡ . Á|¤Z§Ú­Ì±`¥Îªº¤@¨Ç©R¥O , ¹³
ls , find »P Shell ¤@¼Ë , ³£¥i³QÂkÃþ¬°À³¥Îµ{¦¡ . ©Ò¥H , Shell
ªº¦a¦ì»P¨ä¥¦ªºÀ³¥Îµ{¦¡¨Ã¨S¦³¤°»ò®t§O .

§Ú­Ì¥i¥H¬Ý¬Ýñ¤J UNIX §@·~¨t²Îªº¹Lµ{ : ·í§Ú­Ì¿é¤J username ¤§
«á , getty ´Nµ²§ô , ¨ú¦Ó¥N¤§ªº¬O login . ¦b§Ú­Ì¿é¤J¥¿½Tªº 
password «á , ¨t²Î´N¨Ì·Ó /etc/passwd ¤¤ªº°O¿ý , ¬°¨Ï¥ÎªÌ±Ò°Ê
¬Û¹ïÀ³ªº Shell . ¦b³o­Ó®É­Ô , ¨Ï¥ÎªÌ´N·|±o¨ì¤@­Ó´£¥Ü²Å¸¹ .
±µµÛ§Ú­Ì´N¥i¥H¤U¹F¤@¨Ç©R¥O .


 --  getty --> login --> shell --> logout --
 ^                                          |
 |------------------------------------------


Shell ¦³¥t¤@­Ó¦WºÙ¥s°µ "©R¥O¦Cª½Ä¶¾¹" (command interpreter)
±q³o­Ó¦WºÙ·í¤¤ , §Ú­Ì´N¥i¥H¤F¸Ñ¨ì Shell ¹ê»Ú¤W¬°©R¥O¦CªºÂ½Ä¶©x
·í§Ú­Ì¦b´£¥Ü²Å¸¹«á¿é¤J¤@ªø¦êªº©R¥O , ¨Ã«ö¤U Enter ¤§«á , Shell
´N±N§Ú­Ì©Ò¿é¤JªºªF¦è , °µ¤@­Ó¾A·íªº¤ÀªR¤Î³B²z .


(2.2) Shell ­t³dªº¨Æ

¹ï¨t²Î°µ¥æ½Í©Êªº¨Ï¥Î . ¥]§t¤F¿é¥X¿é¤J¾É¦V ( °Ñ¦Ò 2.5 ) ,
ºÞ½u ( °Ñ¦Ò 2.6 ) Wildcard ªº®i¶}¤Î¤Ç°t ( °Ñ¦Ò 2.4 ) , ¥t¥~
ÁÙ¦³ Job Control( ±q SVR4 ¶}©l) , ÅܼÆÀô¹Ò³]©w© . ¸ÑĶ©R¥O ....
ÁÙ¦³¤@ÂI«Ü­«­n , Shell ¦³¥¦¦Û¤v¤º«Øªºµ{¦¡»y¨¥ , §Q¥Î¥¦ªº»yªk
§Ú­Ì¥i¥H¨Ó¼gµ{¦¡ , ¼g¥X¨Óµ{¦¡¥\¯à¨Ã¤£¹³¤@¯ëªºµ{¦¡»y¨¥ ( ¦p C
»y¨¥ ) ¨º»ò¦h , µM¦Ó , ¦b«Ü¦h±¡ªp¤U´N°÷¥Î¤F . ³o³¡¥÷¤]´N¬O¾ã
½g¤å³¹ªº­«ÂI .


(2.3) UNIX ¨t²Î¤W Shell ªººØÃþ

¦b DOS ¤¤ , ·Q¥²¦U¦ì¤@©w³£ª¾¹D¥¦ªº Shell ¬° command.com . ¯S§O
­n»¡©úªº¬O : " Shell ¬O¥i¥H³Q¸m´«±¼ªº ! " ©Ò¥H , ³\¦h¤H¦b DOS
¤¤ , ±`±`§â¥L­Ìªº Shell ¥Ñ command.com ´«¦¨ 4dos.com , ¥H±o¨ì
§ó¦hªº¥\¯à , ³o¤w¸g¬O«Ü¥­±`ªº¨Æ¤F . ¦b UNIX ¨t²Î¤¤¤]¬O¤@¼Ë , 
¨Ï¥Î chsh ³o­Ó©R¥O , §A¥i¥H¬D§A³ßÅwªº Shell ¨Ó¨Ï¥Î . ¦Xªkªº 
Shell ²M³æ³Q¦C¦b /etc/shells ³o­ÓÀɮפ¤ .

Shell ªººØÃþ¥i¥H¤À¬°¨â­Ó¤ä¬£ , ¤@¬°¥Ñ Bourne Shell ­l¥Í¦Ó¨Óªº
¥]¬A¤F sh (Bourne Shell) , ksh (Korn Shell) , bash (Bourne 
Again Shell) , zsh (Z Shell) ; ¥t¤@¤ä¬£¬° C Shell ­l¥Í¦Ó¨Óªº ,
¥]¬A¤F csh , tcsh . ²{¦b³\¦h¤H§@·~ªºÀô¹Ò±`±`¬O¦b csh ©Î tcsh
¤§¤U , ¤×¨ä¬O±q BSD ­l¥Í¦Ó¨Ó SunOS ªºÀô¹Ò .

§A¥i¥H¨Ï¥Î echo $SHELL ¨ÓÀòª¾§A²{¦b¨ì©³¨Ï¥Î¨º¤@ºØ Shell . ©Î
ªÌª½±µ¬Ý /etc/passwd ªº³Ì«á¤@­ÓÄæ¦ì .


(2.4) Wildcard ªº®i¶}¤Î¤Ç°t

      Wildcard ¦³¨Ç¤H§â¥¦Â½Ä¶¦¨ "¸U¥Î¦r¤¸" , ¤U­±©Ò¦CÁ|ªº 
      ¶µ¥Ø , ¨Ã¤£ºÉµM¨C¤@ºØ Shell ³£¤ä´© , ¦U¦ì­n¦Û¤v¸Õ¸Õ¬Ý .


(2.4.1) * : ¥Nªí¥ô·Nªº¦r¦ê ( ¦r¦ê¥i¥H¬OªÅªº )

            % ls 
            haha    haha1   haha2   memo1   memo13  memo2   memo23

            % ls haha*
            haha   haha1  haha2

            % ls memo*
            memo1   memo13  memo2   memo23

(2.4.2) ? : ¥Nªí¥ô·N¤@­Ó¦r¤¸

            % ls
            memo1   memo13  memo2   memo23

            % ls memo?
            memo1  memo2

            % ls memo1?
            memo13

(2.4.3) []: ¥Nªí²Å¦X[]¤¤©Ò¦CÁ|ªº¦r¤¸

            % ls
            haha    haha1   haha2   memo1   memo13  memo2   memo23

            % ls memo[12]
            memo1  memo2

            [a-e]bc ·|²Å¦X abc , bbc , cbc , dbc , ebc   
              

(2.4.4) [!]: [] ¤¤ªº¦r¤¸ , ­Y¥[¤F ! , «hªí¥Ü¤£²Å¦X[]¤¤©Ò¦CÁ|ªº¦r¤¸

            % ls
            haha    haha1   haha2   memo1   memo13  memo2   memo23

            % ls memo[!1]
            memo2

            [!a-z]bc ·|²Å¦X¤£¬O¥H¤p¼g­^¤å¦r¥À¶}ÀY , «á­±±µµÛ bc
            ªº¦r¦ê . ¦p·|²Å¦X : Cbc , 6bc µ¥ ......   


(2.4.5) {word1,word2....} : ¦p my_{dog,cat,pig} ·|²Å¦X my_dog
         my_cat , my_pig
   

(2.4.6) \ : ±µ¦b \ ¤§«áªº¯S®í¦r¤¸ , ¨ä¯S®íªº·N¸q·|³Q¨ú®ø
            ¨Ò¦p , ¦³¤@­ÓÀÉ®× , ¥¦ªº¦W¦r¯uªº¥s *abc , ¨º§Ú­Ì±o¥Î
            cat \*abc ¤~¯à§â *abc ¤¤ªº¤º®eÅã¥Ü¥X¨Ó .
 

(2.4.7) §ó¦hÃö©ó Wildcard ªº°Q½× :

   (I)  glob : ³oºØ Wildcard ¤Ç°tªº°Ê§@ , §Ú­ÌºÙ¬° " globbing "
        ¦b«Ü¦hºØ Shell ¤§¤¤³£¦³¤@­Ó¥s§@ noglob ªºÅÜ¼Æ , ¥i¥H§â
        Wildcard ®i¶}¤Ç°tªº°Ê§@Ãö±¼ .   

        % ls *bc
        abc  bbc  cbc  dbc
                
        % set noglob   <-- C Shell ¤¤³]©wÅܼƪº¤èªk
                                   ( ³]©wÅÜ¼Æ°Ñ¦Ò 2.7)   

        % ls *bc
        ls: *bc: No such file or directory

  (II)  * ¤£·|¥]§t . ¶}ÀYªºÀÉ®× , ­n²Å¦X¥H . ¬°¶}ÀYªºÀÉ®× , §A
        ¥i¥H¸Õ¸Õ .??* ©Î .[!\.]*  ( For Newer Bourne Shell )
        .[^.]*  ( For tcsh )


(2.5) ¿é¥X¿é¤J¾É¦V 


(2.5.1) Standard Input , Standard Output and Standard Error

¦b¬Y¤è­±¨Ó»¡ , §â¸ê®Æ¼g¨ì¤@­ÓÀɮפ¤»P¼g¨ì²×ºÝ¾÷¨Ã¨S¦³¤°»ò®t§O
¬Û¦Pªº , §â¸ê®Æ±qÀɮפ¤Åª¥X»P±qÁä½LŪ¥X¥ç¨S¦³¤°»ò®t§O .
¦b UNIX ¨t²Î¤¤ , ¼Ð·Ç¿é¥X¿é¤J ( Standard I/O ) ´£¨Ñ¤F¤@¨Ç¹w³]
ªº¿é¥X¿é¤J³]³Æ , ³o¨Ç´N¬O stdin , stdout , ¥H¤Î stderr .

stdin : ¤@¯ë»¡¨Ó , ´N¬O¨Ó¦Û§AÁä½Lªº¿é¤J , ¦ý³\¦h±¡ªp¤U , µ{¦¡
        ±`©¿²¤¤F stdin , ¦Óª½±µ¦b©R¥O¦Cªº°Ñ¼Æ¤¤®³ . ¦p :
        cat haha . haha ´N¥i¥H·í°µ stdin .
stdout : ¥¿±`°T®§¿é¥X , ¹w³]¬O²×ºÝ¾÷ . 
stderr : ¿ù»~°T®§¿é¥X , »P stdout ¤@¼Ë , ¹w³]¬O²×ºÝ¾÷ .

stdin ªºÀÉ®×´y­z­È ( file descriptor number ) ¬O 0 ,
stdout ¬O 1 , stderr ¬O 2 .


(2.5.2) ¿é¥X¿é¤J¾É¦V

Á|¤@­Ó³Ì²³æªº¨Ò¤l , §Ú­Ì¥Î ls -la ¥i¦C¥X¥Ø«e¥Ø¿ý¤U©Ò¦³ªº
¤º®e . µM¦Ó , ­Y§Ú­Ì·Q­n§â²×ºÝ¾÷¤Wªº¿é¥X©ñ¨ì¤@­ÓÀɮפ¤ ,
¨º§Ú­Ì­n¦p¦ó°µ©O ? ³o®É­Ô , §Ú­Ì´N­n§â­ì¨Ó²×ºÝ¾÷¤Wªº¿é¥X
(¤]´N¬O¹w³]ªº¼Ð·Ç¿é¥X)¾É¦V¦Ü¤@­ÓÀÉ®× . §Ú­Ì¥i¥H³o¼Ë§@ :

 ls -la > output_file

³o­Ó > ªº²Å¸¹´N¬O¾É¦V²Å¸¹ .


¤Uªí¬O¤@¯ë¸g±`¬Ý¨ìªº¿é¥X¿é¤J¾É¦V , prog ´N¬O program ªº·N«ä
¦Ó file ´N¬O¤@­ÓÀÉ®×:



      ¥\¯à                    sh,ksh,bash         csh,tcsh
--------------------------------------------------------------

§â¼Ð·Ç¿é¥X¾É¨ì¤@­ÓÀÉ®×        prog > file         prog > file

§â¼Ð·Ç¿é¥X¾É¨ìÀÉ®×´y­z­È n    prog >&n

§â­ì¨Ó¿é¥X¦ÜÀÉ®×´y­z­È m      prog m>&n
ªº¿é¥X»P¿é¥X¦ÜÀÉ®×´y­z­È n
ªº¿é¥X , ¤@°_¾É¦V¦ÜÀÉ®×´y
­z­È n

§â¼Ð·Ç¿ù»~¿é¥X¾É¨ì¤@­ÓÀÉ®×    prog 2> file

§â¼Ð·Ç¿é¥XÃö³¬                prog >&-

§â¼Ð·Ç¿é¥X¥H¤Î¼Ð·Ç¿ù»~¿é¥X    prog > file 2>&1    prog >& file
¾É¨ì¤@­ÓÀÉ®×

§â¼Ð·Ç¿é¥X¾É¨ì f1 , §â¼Ð·Ç   (prog > f1) 2>f2   (prog > f1) >& f2
¿ù»~¿é¥X¾É¨ì f2

--------------------------------------------------------------

§â¼Ð·Ç¿é¥X¾É¨ì¤@­ÓÀɮתº«á­±    prog >> file        prog >> file

§â¼Ð·Ç¿ù»~¿é¥X¾É¨ì¤@­ÓÀɮתº    prog 2>> file
«á­±

§â¼Ð·Ç¿é¥X¥H¤Î¼Ð·Ç¿ù»~¿é¥X¾É    prog >> file 2>&1   prog >>& file
¨ì¤@­ÓÀɮתº«á­±

--------------------------------------------------------------

§âÀÉ®×·í§@¼Ð·Ç¿é¤J            prog < file         prog < file

±qÀÉ®×´y­z­È n ªº¦a¤èŪ¨ú     prog <&n
·í§@ prog ªº¿é¤J           

§â¼Ð·Ç¿é¤JÃö³¬                prog <&-

--------------------------------------------------------------

§â file1 ·í¦¨ prog ªº¼Ð·Ç     prog < file1 > file2 
¿é¤J , ¨Ã§â¼Ð·Ç¿é¥Xªºµ²ªG
¦A¾É¦V¦Ü file2

--------------------------------------------------------------

±qÁä½Lªº¿é¤J·í§@ stdin , ª½     prog < file

    w > who_log

    §â w ³o­Ó«ü¥Oªº¿é¥X¾É¨ì¤@­Ó¥s°µ who_log ªºÀÉ®×

    cat file1 > file2
    ^^^^^^^^^
    §â cat file1 ªº¿é¥X¾É¨ì¤@­Ó¥s°µ file2 ªºÀÉ®×

(II) prog 2> file

     ¥ý¼g¤@­Ó¥s°µ test1.c ªº C »y¨¥µ{¦¡¦p¤U :

     #include 

     void main(void)
     {
       print("Standard Error Test");   /* ¬G·N¼g¿ù */
     }

     ±µµÛ¿é¤J  cc test1.c              <-- compile test1.c
     ³o®É§Ú­Ì·|¬Ý¨ìÃþ¦ü¤U­±ªº¿ù»~°T®§:
     /tmp/cca006131.o(.text+0x1e): undefined reference to `print'
         
     ±q¤W­±ªº±¡ªp¤¤ , §Ú­Ì¥i¥H¬Ý¨ì , ³o­Ó C »y¨¥µ{¦¡¥u¦³¤@­Ó¿ù»~
     ©Ò¥H±o¨ìªº¿ù»~°T®§¤]¤£¦h . µM¦Ó , §Ú­Ì­Y compile ¤@­Ó«Ü¤jªº
     µ{¦¡ , ¿ù»~¤]³\·|¦³¼Æ¦Ê­Ó¤]¤£¤@©w , ³o®É­Ô , ­Y§Ú­Ì¤£±Ä¥Î§â
     ¿ù»~¿é¥X¾É¦V¨ìÀɮתº¤èªk , ¨º»ò¿ù»~°T®§¦b²×ºÝ¾÷¤W¥ß¨è´N±²¥X
     ¥h¤F , ¨Ï¥ÎªÌ´NµLªk¬Ýªº§¹¥þ . ¤ñ¸û¦nªº¤èªk¬O§â¿ù»~°T®§¾É¨ì
     ¤@­ÓÀɮפ¤¦AºCºC¤ÀªR¤ñ¸û¦n . ©Ò¥H³o®É­Ô§Ú­ÌÀ³¸Ó³o¼Ë°µ :

     cc test1.c 2> errmsg

     ¦¹®É , ­ì¥»¦b²×ºÝ¾÷¤Wªº¿ù»~¿é¥X´N·|³Q¾É¨ì errmsg ³o­ÓÀɮפ¤
    
     ÁÙ¦³ , prog 2> /dev/null ¥i¥H§í¨î¿ù»~°T®§ªº¿é¥X , ¦]¬°¥¦§â
     ¼Ð·Ç¿ù»~¿é¥X¾É¨ì /dev/null ³o­Ó©U§£±í¤¤ , ³o­Ó¥\¯à»P¤W­±ªº
     prog >&- ¦³¬Û¦Pªº¦a¤è , ¥»¨ÓÀ³¸Ó¿é¥Xªº°T®§³£³QÀ£§í¤F . ¥u
     ¤£¹L¤@­Ó¬O§í¨î¿ù»~°T®§¿é¥X , ¤@­Ó¬O§í¨î¥¿±`°T®§¿é¥X . ¤£¹L
     prog 2>&- ´N¥i¥H¹F¨ì»P prog 2> /dev/null ¬Û¦Pªº®ÄªG .

(III) prog > file 2>&1

     §Ú­Ì¥i¥H¸Õ¸Õ¤U­±ªº©R¥O :

     find / -size +2000k > ~/output 2>&1

     ±µµÛ§A¥i¥H¦b§Aªº Home Directory ¤U§ä¨ì output ³o­ÓÀÉ®× , §A
     ¥i¥H¬Ý¬Ý¥¦ªº¤º®e . §A´N·|µoı , ¦³¨Ç¥Ø¿ý¹ï§A¨Ó»¡¬O
     Permission denied ªº , ³o¨Ç³£¬O¿ù»~°T®§ªº¿é¥X . §A¤]·|¬Ý¨ì
     ¦³¨ÇÀɮצW , ³o¨ÇÀɮ׳£¬O¤j©ó 2000k ªº , Äݩ󥿱`°T®§ªº¿é¥X
     ©Ò¥H , output ³o­ÓÀɮתº½T¥]§tµÛ¼Ð·Ç¿é¥X¥H¤Î¼Ð·Ç¿ù»~¿é¥Xªº
     °T®§ .

     ** ª`·N !!! SunOS ¤Wªº find ¬O¥H block ¬°³æ¦ì , ©Ò¥H , °²
     ¦p§A¦b SunOS ¤W¾Þ§@ , ¨º½Ð§â +2000k ªº k ¥h±¼ , ¦p¤U :

     find / -size +2000 > ~/output 2>&1
     

(IV) (prog > f1) 2>f2

     ¦A¤@¦¸ªº , §Ú­Ì¥Î¤W­±ªº©R¥O , ¦ý§ï¬° :

     (find / -size +2000k > ~/normal_out) 2>/tmp/error_out

     ¦b (III) ¤¤ , §Ú­Ì§â¥¿±`°T®§ªº¿é¥X»P¿ù»~°T®§ªº¿é¥X³£²V¦b
     ~/output ³o­ÓÀɮפ¤ . ±q¬Y­Ó¨¤«×¨Ó»¡ , ³o¤£¬O«Ü¦nªº§@ªk ,
     §Ú­Ì©Ò§Æ±æªº , ¬O§â¥¿±`°T®§ªº¿é¥X©ñ¦b¤@­ÓÀÉ®× , ¦Ó¿ù»~
     °T®§ªº¿é¥X©ñ¨ì¥t¤@­ÓÀÉ®× . ¦¹®É , §Ú­Ì´N­n±Ä¥Î (IV) ³o­Ó
     ¤èªk . ¦b¤W­±ªº©R¥O¤¤ , §Ú­Ì§â find ³o­Ó©R¥Oªº¥¿±`°T®§¿é¥X
     ¾É¨ì ~/normal_out ³o­ÓÀÉ®× , ¦Ó¿ù»~°T®§¿é¥X§Ú­Ì´N§â¥¦¾É¨ì
     /tmp/error_out ³o­ÓÀɮפ¤ . 
      
(V) ¦Ü©ó prog >> file  ,  prog 2>> file  ,  prog >> file 2>&1
    »P prog > file  ,  prog 2> file  ,  prog > file 2>&1
    ¥u¬O§â > ´«¦¨ >>  , ¦Ó¥¦ªº®t§O´N¥u¦b :  >> ¬O"ªþ¥["ªº·N«ä
    ¨Ã¤£¹³ > ·|§â­ì¨Ó¾É¦V¹L¥hªºÀɮײM°£ (°²¦p±ý¾É¦V¹L¥hªºÀÉ®×
    ¤w¸g¦s¦b , ¦Ó¥B noclobber ÅܼƨS¦³³Q³]©wªº¸Ü !·íµM , ­Y­ì¨Ó
    Àɮפ£¦s¦b , ¨º´N·|»s³y¥X·sªºÀÉ®×)

    ©Ò¥H , ¸Õ¸Õ¬Ý¤U­±ªº©R¥O´N¥i©ú¥Õ :

    ls -la /usr > file1
    ls -la /etc > file1
    cat file1       <-- §A¬Ý¨ìªº¬O /etc ¤Uªº¤º®e  
    
    ±µµÛ , ¦A¸Õ¸Õ

    ls -la /usr > file2
    ls -la /etc >> file2  <-- §â¿é¥Xªºµ²ªG"ªþ¥["¦b file2 «á
    cat file2       <-- §A¬Ý¨ìªº¬O /usr »P /etc ¤U©Ò¦³ªº¤º®e
     
(VI) prog < file

    ¦³¨Ç©R¥O , ¥¦­n³B²zªº¤º®e¬O­n¥Ñ¼Ð·Ç¿é¤J¤¤®³ªº . ¦p mail ³o
    ­Ó©R¥O , ­Y§Ú­Ì¦b´£¥Ü²Å¸¹¤UÁä¤J mail abc@cc.nctu.edu.tw
    ¦¹®É , §Ú­Ì´N±o¥ÑÁä½L¤W¿é¤J¤@¨Ç¸ê®Æ , ³Ì«á«ö Ctrl-d §@¬°µ²
    §ô . ¦¹®É , §Ú­Ì­è­è¿é¤Jªº¸ê®Æ´N·|¸g¹L mail ³B²z±H¥X¹q¤l¶l
    ¥ó . µM¦Ó , ³o¼Ë§@ªºÃa³B¬O , ¸U¤@§A¥´¿ù¤F¦r·Q­×§ï«e­±´X¦C
    ªº¤º®e , ´NÅܱo§xÃø¤F . ©Ò­Ì©Ò§Æ±æªº , ¬O«H¥óªº¤º®e¥ý¥Î
    ´¶³q¦n¥Îªº¤å®Ñ½s¿è¾¹¼g¦n , ¦A§â¼g¦nªºªF¦è±H¥X¥h . ¦¹®É , <
    ´N¬£¤W¥Î³õ , §Ú­Ì´N§â¼g¦nªºÀÉ®×·í§@¬O±q¼Ð·Ç¿é¤Jµ¹»Pªº¤º®e
    ¾É¦Vµ¹ prog . ©Ò¥H mail abc@cc.nctu.edu.tw < report
    report ´N¬Û·í©ó±qÁä½L¤W¿é¤Jªº¤º®e .


(VII) prog < file1 > file2

    ³o­Ó«¬¦¡¬O¥Ñ¨â­Ó¾É¦V²Å¸¹©Ò²Õ¦¨ , ¬Ý°_¨Ó¦³ÂI½ÆÂø , ¨ä¹ê¤@ÂI¤]
    ¤£ . ¥u­n§A©î¦¨¨â³¡¥÷¨Ó¬Ý : prog < file1 > file2
                                ^^^^^^^^^^^^            (i)
                                ^^^^^^^^^^^^^^^^^^^^    (ii)
    ²Ä (i) ³¡¥÷ : §â file1 ·í§@¬O prog ªº¼Ð·Ç¿é¤J
    ²Ä (ii) ³¡¥÷ : §â²Ä (i) ³¡¥÷ªº¿é¥Xµ²ªG , ¾É¦V¦Ü file2 ¤¤
    Á|­Ó¨Ò¤l :

    tr 'a-z' 'A-Z' < sour > dest

    ­º¥ý , tr 'a-z' 'A-Z' < sour  ·|§â sour ³o­ÓÀɮפ¤ªº¤p¼g¦r¤¸
    ¥þ³¡´«¦¨¤j¼g¦r¤¸ , ¦¹®É , °²¦p¨S¦³«á­± > dest ªº¸Ü , §Ú­Ì·|¦b
    ²×ºÝ¾÷¤W¬Ý¨ìÂà´««áªº¿é¥X . µM¦Ó , §Ú­Ì¨Ï¥Î > dest ¦A§â­ì¨ÓÀ³
    ¸Ó¦b²×ºÝ¾÷¤Wªº¿é¥X¾É¦V¨ì dest ³o­ÓÀɮפ¤ . ©Ò¥H , dest ´N·|
    ¬O sour ¸g¹LÂà´««áªº¤º®e .

(VIII) prog << c

    ³o­Ó«¬¦¡¬Ý°_¨Ó¦³ÂI©_©Ç , ¥¦©Ò§@ªº¨Æ´N¬O : ±q¼Ð·Ç¿é¤JŪ¨ú¸ê®Æ
    ¤@ª½¹J¨ì c ¬°¤î , µM«á§â³o¨Ç¸ê®Æ³£¥æµ¹ prog ³B²z .
    ³oºØ°Ê§@¦³­Ó¦WºÙ¥s "Here Document"
    ¤ñ¦p»¡¤U­±ªº¨Ò¤l :

    % mail veronica << End_Of_Letter
    > this is a test 
    > but ....
    > End_Of_Letter             <-- ­n³æ¿W¤@¦C

    ¥»¨Ó§Ú­Ì¿é¤J mail veronica ªº¸Ü , ¨º»ò§Ú­Ì´N±o±qÁä½L¤W¿é¤J
    ¸ê®Æ , ª½¨ì«ö¤U¤F Ctrl-d ¬°¤î . µM¦Ó , §Ú­Ì²{¦b«ü©w : ¤@
    ª½±q¼Ð·Ç¿é¤JŪ¨ú¸ê®Æ , ª½¨ì¹J¨£ End_Of_Letter ¬°¤î . ¤£¹L
    ¤W­±ªº¨Ò¤l¨Ã¤£±`¨£ . ¤ñ¸û±`¨£ªº¬O¤U­±³o­Ó¨Ò¤l :

    % cat << It_is_OK
    > This is Here Document Test
    > This Sample is quite typical
    > You will see the same style in some Shell Script
    > See You
    > It_is_OK

    ¦p¦¹§@¥i¥H¤@¦¸Åã¥Ü¤@¤j¬q°T®§ , ¦Ó¤£¥²«Ü³Â·Ðªº¥Î³\¦h¦C echo            
    ¨Ó°µ .


(2.6) ºÞ½u (Pipes)

ºÞ½u´N¬O¹F¦¨ "²Õ¦X©R¥O" ªº¤èªk , ·¥ºÝ­«­n ! ¥¦ªº«¬¦¡¬O³oºØ¼Ë¤l

  prog1 | prog2 

¨ä¤¤ , | ´N¬OºÞ½uªº²Å¸¹ , ¤W­±ªº·N«ä¬O : §â prog1 ªº¿é¥X , ·í
°µ prog2 ªº¿é¤J . §A¤]¥i¥H·Q¹³¦¨ : prog1 ¤Î prog2 ¬O¨â»O¾÷¾¹ ,
| ¬O¥¦­Ì¤§¶¡ªº¶Ç°e±a , ¸g¹L prog1 ³B²z¹LªºªF¦è , ¦A¥æµ¹ prog2
¥h¥[¤u . Á|´X­Ó¨Ò¤l :

  ls -la | more   <-- §â ls -la ªº¿é¥X¥æµ¹ more ¥h§@³B²z , ·Q
                      ·íµM¦Õ , more ·|§â¨Ó¦Û ls -la ªº¿é¥X§@
                      ¤À­¶³B²z .

  man ls | wc -l   <-- §â man ls ªº¿é¥X¥æµ¹ wc ¥h§@³B²z , wc
                       ¨Ï¥Î¿ï¶µ -l ¥i­pºâ¨Ó¦Û man ls ªº¿é¥X
                       ¦³¦h¤Ö¦C .

·íµM , §A¤]¥i¥H²Õ¦X¥X¨â­Ó¥H¤W©Î§ó¦hªººÞ½u :
     
  prog1 | prog2 | prog3

¦p:  who | cut -c1-8 | sort   <-- who ªº¿é¥X¥æµ¹ cut ³B²z ,
                                  cut -c1-8 ·|¨ú¥X¨C¦Cªº²Ä
                                  ¤@¨ì²Ä¤K­Ó¦r¤¸ , µM«á¦A§â
                                  ³o¨Ç¿é¥X¥æµ¹ sort °µ±Æ§Ç

©Ò¥H , " ¼ô±x¨C­Ó©R¥O­nªº¿é¤J¬O¤°»ò ? ¤S·|²£¥Í¤°»ò¿é¥X ? "
¬O¦³®Ä¨Ï¥ÎºÞ½uªº¤£¤Gªkªù ! ¦U¦ìÀ³¸Ó¤@Ãä¨Ï¥ÎºÞ½u , ¤@Ãä¥[±j
©R¥Oªº°ò¦ , ·í§A¼ô±x¨ì¤F¬Y¤@µ{«× , ´N¥i¥H¦Û¤v§Q¥ÎºÞ½u , ¿é
¥X¿é¤J¾É¦V¨Ó " ³Ð³y " ¥X·sªº¤u¨ã , UNIX ¦³½ì¥B­«­nªº¦a¤è´N
¦b³o¸Ì !!!
                                   
¦¹®É , §Ú­Ì¦b Chap 1 ©Ò´£ªº : " ­pºâ¥Ø«e¤u§@¥Ø¿ý¤U¦³¦h¤Ö´¶
³qªºÀÉ®× ? " °²¦p§A¹ï©R¥O¼ô±xªº¸Ü , §AÀ³¸Ó¥i¥H¦^µª¥X¨Ó¤F ,
¦Ó¥B¤èªk¤Ó¦hºØ¤F !

¹³§Ú¥i¥HÁ|¤@ºØ¤èªk¦p¤U (¤£­pºâ¥H . ¬°¶}ÀYªºÁôÂÃÀÉ) :

  ls -l | grep '^-' | wc -l 

¦U¦ì¥h¤ÀªR¬Ý¬Ý , ¬°¤°»ò¥i¥H­pºâ¥X¨Ó , ¨Ã¥B¥h·Q·Q¬Ý¥¦¬O¦p¦ó
¤u§@ªº ......


(2.7) ¤@¨ÇÀô¹ÒÅܼƪº«ü©w 
  
¦b Shell ¤¤ , ¦³¤@ÂI«Ü­«­nªº¬O , §Ú­Ì¦Û¤v¥i¥H³]©w¤@¨ÇÅÜ¼Æ ,
¨ä¤¤¦³¨ÇÅܼƥi¥H¼vÅT¾Þ§@Àô¹Òªº¦æ¬° , ©ÎªÌ¬O¼vÅTÀ³¥Îµ{¦¡ .
Á|­Ó¨Ò¤l¨Ó»¡¦n¤F , ¦U¦ì±`¥Îªº elm , ¥¦©Ò¨Ï¥Îªº¤å®Ñ½s¿è¾¹
´N·|¨ü¨ì EDITOR ³o­ÓÅܼƪº¼vÅT . °²¦p EDITOR ªº¤º®e¬O joe ,
¨º»ò elm ´N·|¨Ï¥Î joe ®³¨Ó·í¤å®Ñ½s¿è¾¹ , °²¦p EDITOR ªº¤º
®e¬O vi , «h¨Ï¥Î vi . ¬JµM§Ú­Ìª¾¹D¬Y¨ÇÅܼƥi¥H¼vÅTÀ³¥Îµ{¦¡
¬Æ¦Ü¾ãÅ骺¾Þ§@¦æ¬° , ¨º§Ú­Ì­n¦p¦ó³]©w³o¨ÇÅܼƩO ? ½Ð¬Ý¤Uªí


                sh,ksh,bash                csh,tcsh
-----------------------------------------------------------

«ü©wÅÜ¼Æ        var=value                  set var value 

«ü©wÀô¹Ò¾ãÅé    export var=value           setenv var value 
ÅܼÆ

-----------------------------------------------------------


¤Wªí¤¤ , var ¬OÅܼƦW , value ¬OÅÜ¼Æ­È ; ÁÙ¦³ 
¤W­±¨âºØ³]©w¬O¤£¤@¼Ëªº , ¦]¬° Shell ¤§¤¤ÁÙ¥i¥H¦A invoke ¤@
­Ó Subshell , var=value ¥u¯àºâ¬O³]©w°Ï°ì©ÊªºÅÜ¼Æ , ¥u¦b³]©w
ªº¨º­Ó Shell ¤§¤¤¦³®Ä , ¹ï©ó Subshell ´NµL®Ä¤F . 
¦Ó export var=value ´N¤£¤@¼Ë¤F , ¥¦¹ï©ó Subshell ¤]¦³®Ä .
§A¥i¥H°µ¤U­±ªº¹êÅç :

  % color=blue              <-- §â blue «ü©wµ¹ÅÜ¼Æ color , 
  % echo $color             <-- Åã¥ÜÅÜ¼Æ color ªº¤º®e
  blue              
  % sh                      <-- ¶}±Ò¤@­Ó subshell
  % echo $color             <-- Åã¥ÜÅÜ¼Æ color ªº¤º®e
                            <-- ¨S¦³ÅÜ¼Æ color ªº¤º®e
  %


  % export color=blue       <-- §â blue «ü©wµ¹Àô¹Ò¾ãÅéÅÜ¼Æ color
  % echo $color             <-- Åã¥ÜÅÜ¼Æ color ªº¤º®e
  blue
  % sh                      <-- ¶}±Ò¤@­Ó subshell
  % echo $color             <-- Åã¥ÜÅÜ¼Æ color ªº¤º®e
  blue                      <-- ¦³ÅÜ¼Æ color ªº¤º®e


«e­±¦b Wildcards ¦³´£¹L¤@­Ó noclobber ªºÅÜ¼Æ , ¦bÄÝ©ó Bourne
Shell ¨t¦Cªº Shell ¤¤ , §A¥i¥H¨Ï¥Î set -o noclobber ©ÎªÌ¬O
set +o noclobber ¨Ó¨Ï noclobber µo¥Í©Î¤£µo¥Í§@¥Î . ¨Ï¥Î set -o
¤£¥[ÅܼƦW¥i¬Ý¨ì¤@¨ÇÅܼƪº­È ( ¥u¯à¬Ý¨ì¨º¨Ç¬° on ©Î off ,
¹ïÀô¹Ò·|³y¦¨¼vÅTªºÅÜ¼Æ ) ¨ä¥¦ªºÅܼƥi¥Î set ª½±µ¬Ý¨ì .
¦b C Shell ¨t¦C¤¤ , ª½±µ¨Ï¥Î set noclobber ´N¥i¥H¤F .
¦Ü©ó¦³¨º¨ÇÅܼƥi³]©w , §A¥i¥H¥Î man ¬Ý¬Ý§A©Ò¨Ï¥Îªº Shell .




Chap 3 -- Shell Programming ¤¤ªº¸ê®Æªí¥Ü

ºI¦Û¥Ø«e¬°¤î , §Ú­Ì³£¬O³B©ó¦b´£¥Ü²Å¸¹«á¤U©R¥Oªº¶¥¬q . ¨Ã¨S
¦³ "¼gµ{¦¡" ªº·Pı . ¦b³o¤@³¹·í¤¤ , §Ú­Ì´N­n¶}©l¤¶²Ð Shell
Programming ¤¤ªº¸ê®Æªí¥Ü¤è¦¡


(3.1) ¤°»ò¬O Shell Script ?

°²¦p§A¨Ï¥Î UNIX ¤w¸g¦³¤@¬q®É¶¡ , ¨º§A¤@©w±`±`Å¥¨ì³o­Ó¦Wµü .
¬JµM«e­±´£¹L , Shell ¥»¨­´N¬O¤@­Ó interpreter , ¨º§Ú­Ì·íµM
¥i¥H¦b´£¥Ü²Å¸¹¤U "ª½±µ" ¼gµ{¦¡ªº ! ¥i¥H¬Ý¬Ý¤U­±ªº¨Ò¤l :

 % case 3 in
 > [1-5]) echo 'haha';;
 > [6-10]) echo 'lala';;
 > esac
 haha

§A¦Û¤v¤]¥i¥H¸Õ¸Õ¬Ý , ¤£¹L§A±o¨Ï¥Î Bourne Shell ¨t¦Cªº Shell
¦n¤F , §Ú­Ì¤w¸g¬Ý¨ì¥i¥H¦b´£¥Ü²Å¸¹¤U¼gµ{¦¡ , µM¦Ó , §Ú­Ì¨Ã¤£
³ßÅw³o¼Ë°µ . ¦]¬°¦b´£¥Ü²Å¸¹¤U­n­×§ïµ{¦¡«Ü³Â·Ð , ¤pªºµ{¦¡¤]´N
ºâ¤F , ¤jªºµ{¦¡§Ú·Q¨S¦³¤H·|³ßÅw³oºØ¤èªk . ©Ò¥H , ¦b¤@¯ëªº±¡
ªp¤U , §Ú­Ì¥i¥H¥ý¥Î¤å®Ñ½s¿è¾¹¼g¦n¤@­Óµ{¦¡¨Ã¦s¦¨¤@­ÓÀÉ®× , µM
«á¦A§â³o­ÓÀɮץ浹 Shell ¥h°õ¦æ , ¦Ó³o­ÓÀÉ®×´NºÙ¬° Shell
Script ! ¥ýµ¹¦U¦ì¬Ý¬Ý¤@­Ó³Ì²³æªº Shell Script :

  
  #!/bin/sh

  ps -a | more


¤W­±ªº¨â¦C¤º®e , §Ú§â¥¦©ñ¦b¤@­ÓÀɮפ¤ , µM«áª½±µ°õ¦æ¥¦´N¥i¥H.
¦ý¤£­n§Ñ°O , §A­n¹ï³o­ÓÀɮצ³Åª¥H¤Î°õ¦æªºÅv­­ .


(3.2) Shell Programming ªº¨â¤j­n¯À : ¸ê®Æ¤Î»yªk  

°²¦p§A¾Ç¹L°ª¶¥»y¨¥ , §AÀ³¸Ó¥i¥H¤F¸Ñ¨ì , ¨ä¹ê¨CºØ°ª¶¥»y¨¥ªº·§
©À³£®t¤£¦h , ¥¦­Ì¥u¬O»yªk¤£¦P , ¤]³\¸ê®Æªí¥Üªº¤èªk¤]¦³¤Ö³\ªº
®t§O . ¦ý¬O , ¾Ç·|¤F¤@ºØ¦A¥h¾Ç§OºØ¨Ã¤£ºâÃø .
Shell Programming ¤]¬O¤@¼Ë , ¥¦ÁÙ¬O¦³¤j®a¼ô±xªº»yªk¦p if , do
for , while µ¥µ¥ªºªF¦è . ¤ñ¸û¯S®íªº¬O¥¦ªº¸ê®Æ«¬ºA .
¤U­±´N¶}©l¶i¤J Shell Programming ªº¸ê®Æªí¥Ü . »yªk½Ð¬Ý Chap 4


(3.3) µù¸Ñ¤Î #!/bin/sh 

«Ü¦hµ{¦¡»y¨¥³£¦³¨äµù¸Ñ®æ¦¡ , ¦b¤@­Ó Shell Script ¤¤ , °²¦p§Ú
­Ì¬Ý¨ì¤@­Ó # ¸¹ , ¨º±q # ¸¹¶}©l¤@ª½¨ì¨º¦Cªºµ²§À³£¬Oµù¸Ñ .
µù¸Ñ¥u¬O´£°ªµ{¦¡ªº¥i¾\Ū«× , ¹ï Shell ¨Ó»¡¨Ã¤£·|°µ¸ÑĶªº°Ê§@
Á|¤@­Ó Shell Script ¦p¤U:

#!/bin/sh

#  
# Count_bash_user_number : report how many users use bash
#

grep -c '/bin/bash' /etc/passwd    # grep -c : print match
                                   # number


³o­Ó Shell Script ¤¤ , ¯u¥¿§@¨Æªº¥u¦³¤@¦C , ¨ä¥¦ # «á±µªº¤å
¦r³£¬Oµù¸Ñ . ¦ý¯S§O­nª`·Nªº¬O : #!/bin/sh ¤£¬Oµù¸Ñ , ÁöµM¥¦
¬O¥H # ¬°¶}ÀY , ¦ý¬O¥¦¦³¯S®íªº·N¸q . ¦b³Ì¦­ªº®É­Ô¦]¬°¥u¦³ sh
©Ò¥H¤]¨Ã¤£»Ý­n #!/bin/sh , ¦ý¬O«á¨Ó Shell ªººØÃþ¶V¨Ó¶V¦h , 
¦³¨Ç¤H¥Î csh , ¦³¨Ç¤H¥Î tcsh . ³o®É­Ô§Ú­Ì´N­n¯S§Oªº«ü¥X , ³o
­Ó Shell Script ¬O¥Î¨º¤@ºØ Shell ¼gªº . °²¦p§Aªº Shell Script
¬O¥H Borune Shell ªº»yªk¼g¦¨ªº , ¨º§A´N±o¥[¤W #!/bin/sh , °²
¦p¬O¥H C Shell ªº»yªk¼g¦¨ªº , ¨º§A±o¥[¤W #!/bin/csh . ³o¦C¤@
©w­n¥[¶Ü ? µª®×¬O¤£ºÉµM , ¦pªG§A¥Ø«e¨Ï¥Îªº Shell »P§A¼gªº
Shell Script ¨Ï¥Î¬Û¦Pªº»yªk , ¨º¥i¥H¤£¥[ . ¦ý¬O§ÚÁ|¤@­Ó¨Ò¤l:
°²¦p§A¥Îªº¬O tcsh , ¦ý«o¥Î sh ªº»Pªk¨Ó¼g Shell Script , ¦Ó¨S¦³
¦b Shell Script ªº²Ä¤@¦C¥[¤W #!/bin/sh , ¨º»ò·|µo¥Í¤°»ò±¡§Î?
«Ü²³æ , tcsh ·|¥H¬°§A¼gªº Shell Script ¬O¥Î tcsh ªº»yªk¼g¦¨
ªº , ©Ò¥H¦b¸ÑĶªº¹Lµ{¤¤´N·|¥X²{¿ù»~ . ¦ý¬O­Y§Ú­Ì¦³¥[ #!/bin/sh
¨º»ò , tcsh ´N·|¥s¥Î sh ¨Ó¸ÑͧAªº Shell Script , ¦ÛµM´N¤£·|
¦³¿ù»~²£¥Í .
§Úªº«ØÄ³¬O : "µL½×¦p¦ó , ½Ð©ú½Tªº¦b Shell Script ªº²Ä¤@¦C«ü¥X
³o­Ó Shell Script ¬O¥Î¨º¤@ºØ Shell ªº»yªk¼g¦¨ªº !"


(3.4) ÅܼÆ

(3.4.1) Åܼƪº«ü©w

¦p¦P¤j³¡¥÷ªºµ{¦¡»y¨¥¤@¼Ë , Shell Programming Language ¤¤¤]¦³
Åܼƪº¦s¦b , ¨º§Ú­Ì­n¦p¦ó«ü©w¤@­ÓÅܼƩO ? «Ü²³æ , ¦p¤U:

  variable=value

Á|´X­Ó¨Ò¤l :

  count=1

  X11_bin_path=/usr/X11/bin

¦ý¦b«ü©wÅÜ¼Æ®É , ¦³´XÂI­nª`·Nªº : ²Ä¤@ , µ¥¸¹ªº¥ª¥k¨âÃ䤣­n
¦³ªÅ®æ , Ä´¦p»¡ , ¤£¥i¼g¦¨ : color = blue , color= blue
color =blue , ¤@©w±o¼g¦¨ : color=blue . ²Ä¤G , ÅܼƨS¦³©Ò¿×
ªº "¸ê®Æ«¬ºA" . ·í§A«ü©wÅÜ¼Æ®É , Åܼƥu¬O³Q·í¦¨¦r¤¸ªº²Õ¦X¨Ó
¬Ý«Ý . ¦p¤W­±ªº¨Ò¤l : count=1 , count ©ñªº¬O³æ¯Âªº 1 , ¦Ó¤£
¹³ C »y¨¥¤¤©Ò¿× "¾ã¼Æ«¬ºAªº 1" ²Ä¤T , Åܼƫü©wªº°Ê§@¹ê»Ú¤W
¤]¥i¥H¦b´£¥Ü²Å¸¹«áª½±µ§@ . ( ¦p¦P 2.7 ©Ò´£¨ìªº )


(3.4.2) Åܼƪº¤º®e : $variable

¨Ï¥Î echo $variable ¥i¥HÅã¥ÜÅܼƪº¤º®e .
¹³­è­èªº¨Ò¤l , count=1 , ¨º»ò , ¨Ï¥Î echo $count ´N·|±o¨ì 1
¨Ï¥Î echo $X11_bin_path ´N·|±o¨ì /usr/X11/bin
©Ò¥H , §Ú­Ì¥i¥H¤F¸Ñ¨ì : $variable ¬OÅܼƪº¤º®e !
§Ú²{¦bµ¹¤@­Ó°ÝÃD , ¦U¦ì½m²ß¬Ý¬Ý : §â var1 ªº¤º®e³]©w¦¨ 10 ,
§â var2 ªº¤º®e³]©w¦¨ 20 , ±µµÛ§â var2 ªº¤º®e³]©wµ¹ var1 .

  var1=10
  var2=20
  var1=$var2
  echo $var1

¦A¹ê»Ú½m²ß¤@¤U , ¤U­±ªº¥|¦C»P¤W­±ªº¥|¦C¦³¦ó¤£¦P ?

  var1=10
  var2=20
  var1=var2
  echo $var1


(3.4.3) ÅܼƻP Wildcard

§A¥i¥H¦b´£¥Ü²Å¸¹¤U³o¼Ë¸Õ¸Õ : 

  list=*
  ls $list

¤W­±ªº¨â¦C , ­º¥ý§â * «ü©wµ¹ list , ©Ò¥H $list ´N¬O *
¨º ls $list ´N·|Åܦ¨ ls *

  five_char=?????
  ls $five_char

¤W­±¨â¦C·|§âªø«×¬°¤­­Ó¦r¤¸ªºÀɮצC¥X .


(3.4.4) ${variable}

¦³¤H¸Õ¤F (3.4.3) ¤¤ªº¨Ò¤l¤§«á´N·Q¨ì , §Ú­Ì¥i¤£¥i¥H³o¼Ë°µ :

  file=mydoc
  cp $file $filenew                   

§â mydoc Àɮ׽ƻs¤@¥÷ , ¨Ã§â·sÀɮתº¦WºÙ«á¥[¤W new Åܦ¨
mydocnew . °²¦p§A«ö·Ó¤W­±ªº¤èªk¨Ó§@ , ·|¦³¿ù»~²£¥Í .
³o¬O¦]¬° , $file ©TµM¬O mydoc ¨S¿ù , µM¦Ó $filenew «o¬O
¤@­Ó¤º®e¤£ª¾¹D¬O¤°»òªºÅÜ¼Æ . ©Ò¥H§Ú­ÌÀ³¸Ó³o¼Ë°µ :

  file=mydoc
  cp ${file} ${file}new

¨ä¤¤ ${file} ·|´«¦¨ mydoc , ${file}new ·|´«¦¨ mydocnew  


(3.5) ¤Þ¸¹ 

¦b Shell Programming ¤¤ , «Ü¯S®íªº¤@ÂI´N¬O¤Þ¸¹ , ¤Þ¸¹¦³¤TºØ
¤À§O¬° ' ' ³æ¤Þ¸¹  , " " Âù¤Þ¸¹ , ` ` ¤Ï³æ¤Þ¸¹ . ¥¦­Ì¤À§O¦b
Shell Programming ¤¤§êºt¤£¦P¦ý³£¬Û·í­«­nªº¨¤¦â . §Ú­Ì¤À§O±Ô
­z¦p¤U :

(3.5.1) ³æ¤Þ¸¹

³æ¤Þ¸¹³Ì¤jªº¥Î³B¬O : ¨Ï±o¨â­Ó³æ¤Þ¸¹¤§¶¡©Ò§¨ªº¤º®e«O«ù¤£ÅÜ .
¤ñ¦p»¡§A·Q¦L¥X : pig   cat      dog
¨º°²¦p§A³o¼Ë§@ : echo pig   cat     dog
¨º»òµ²ªG¤´¬O pig cat dog 
­n§ï¦¨ : echo 'pig   cat      dog'  ¤~¯à¹F¨ì¥Ø¦a

ÁÙ¦³ , ¦b³æ¤Þ¸¹¤¤ªº¯S®í²Å¸¹¤]·|¥¢¥h·N¸q : 

  % echo '* is all'    
  * is all
 
  % color=blue
  % echo 'Is $color beautiful?'
  Is $color beautiful?

  % echo '> < >> << [ ] "" & { }'
  > < >> << [ ] "" & { }

±q¤W­±ªº¨Ò¤l¤¤ , §Ú­Ì³£¥i¥H¬Ý¨ì , ¹³ * , ? , $variable µ¥
¥»¨ÓÀ³¸Ó·|³Q´À´«ªºªF¦è , ²{¦b³£­ì«Ê¤£°Êªº·Ó¦L .©Ò¥H , ³æ¤Þ¸¹
³q±`®³¨Ó¦L¥X¤@¬q©T©wªº°T®§ .

(3.5.2) Âù¤Þ¸¹

Âù¤Þ¸¹ªº¥Îªk»P³æ¤Þ¸¹¦³¤@¨Ç¤£¦P . §Ú­Ì´£¹L , ¦b¨â­Ó³æ¤Þ¸¹¤§¶¡©Ò
§¨ªº¤º®e³£·|­ì«Ê¤£°Ê . µM¦Ó , Âù¤Þ¸¹¤£¦P . ¦b¨â­ÓÂù¤Þ¸¹¤§¤¤
ªº¤º®e , ¦³¥H¤U´XºØ·|³Q´À´« :

 (I) $variable , ¥H¤Î¥ô¦ó $ «á¦³·N¸qªº¦r¤¸ (°Ñ¦Ò 3.7)

     ¤ñ¸û¥H¤Uªº¤£¦P :

     % color=blue 
     % echo $color
     blue
     % echo '$color'
     $color
     % echo "$color"
     blue

     % all_list=*
     % echo $all_list      <-- $all_list ´«¦¨ * ¸¹ 
     a.c b.c
     % echo '$all_list'    <-- ³æ¤Þ¸¹¤£´À´«
     $all_list
     % echo "$all_list"    <-- Âù¤Þ¸¹¤¤ªº $all_list ´«¦¨ *
     *                         Åܦ¨ echo "*" , ¦ýÂù¤Þ¸¹¤¤
                               ªº * ¸¹¤£·|¦A°µ´À´« . 

 (II) ¤Ï±×½u : \

     ¦b (2.4.6) ¤§¤¤´£¨ì , \ «áªº¦r¤¸ , ¨ä¯S®í·N¸q·|³Q¨ú®ø
     ¦b¤W­±´£¨ì , $variable ¦bÂù¤Þ¸¹¤§¤¤·|³Q´À´« . °²¦p§Ú
     ­Ì¯uªº·Q¦L¥X $ ¸¹ , ¨º»ò´N±o¦b $ ¸¹«e¥[¤W \ 

     % number=10
     % echo "your value is $number"
     your value is 10
     % echo "your value is \$number"  <-- ¨ú®ø $ ¤§¯S®í·N¸q
     your value is $number
     % echo "your value is \"$number\" "
     your value is "10" 

 (III) ¤Ï³æ¤Þ¸¹ : ` `  
     ( °Ñ¦Ò 3.5.3 )


(3.5.3) ¤Ï³æ¤Þ¸¹ 

¤Ï³æ¤Þ¸¹¬O¤@­Ó©¹¥kºJªº¤Þ¸¹ . ¨â­Ó¤Ï³æ¤Þ¸¹©Ò§¨ªº¤º®e·|¥ý°õ¦æ
Á|­Ó¨Ò¤l :

  % echo "Your current directory is `pwd` !"
  Your current directory is /home/jhhsu 

§Ú­Ì»¡¹L , Âù¤Þ¸¹¤§¤¤ªº¤º®e¤j¦h¤£°µ´À´« , °£¤F $variable ,
¤Ï±×½u , ¤Ï³æ¤Þ¸¹¤§¥~ . ¤W­±´N¬O¤@­Ó«Ü¦nªº¨Ò¤l . Âù¤Þ¸¹
¤¤ªº `pwd` ·|¥ý°õ¦æ , ±o¨ìªºµ²ªG¬O /home/jhhsu . ©Ò¥H ,
`pwd` ³Q /home/jhhsu ©Ò¨ú¥N , ¥þ¥yÂàÅܦ¨ :

  echo "Your current directory is /home/jhhsu"

¦ÛµM´N¦b²×ºÝ¾÷¤W¦L¥X Your current directory is /home/jhhsu

¦AÁ|¤@­Ó¨Ò¤l , «e­±¦b¾É¦V®É¦³¾Ç¹L : mail jhhsu < letter
³o¼Ë¥i¥H§â letter ³o­ÓÀÉ®×±Hµ¹ jhhsu . 
¦ý°²¦p§Ú­Ì·Q±H«Hµ¹¤@¤j¸s¤H©O ? ¹ê»Ú¤W§A¥i¥H elm ¤¤ alias
ªº¤èªk , ¤£¹L³o¦³ÂI³Â·Ð . §Ú´£¥X¤@­Ó«Üª½Ä±ªº¤èªk :

  mail `cat member` < letter

ÀÉ®× member ¤¤¨C¦C³£¼g¤W¦¬«H¤Hªº E-mail address , letter
¬O«H¥ó¤º®e . ¥¦¤u§@ªº¹Lµ{«Ü²³æ , `cat member` ¥ý°õ¦æ ,
±o¨ìªºµ²ªG¥i¯à¬O jhhsu veronica ghguo , ©Ò¥H¥þ¥yÅܬ° :

  mail jhhsu veronica ghguo < letter


(3.6) Åܼƪººâ¼Æ¹Bºâ

¦bÅܼƪººâ¼Æ¹Bºâ¤è­± , §Ú­Ì¥D­n¾aªº¬O expr ³o­Ó«ü¥O . ¦U¦ì
¥i¥H¥ý¦b´£¥Ü²Å¸¹¤U¸Õ¸Õ :

  % expr 30 + 20
  50
  % expr 30 - 20
  10
  % expr 30 \* 20     <-- * ¬O­¼¸¹ , ¦ý­n¥H¤Ï±×½u¥h°£¯S®í·N¸q
  600
  % expr 30 / 20      <-- ¥u·|¨ú¾ã¼Æ³¡¥÷
  1

±q¤W­±§Ú­Ì¥i¥H¬Ý¨ì , expr ªº½T¥i¥H§@¾ã¼Æªº¥|«h¹Bºâ . ¦ý§Ú­Ì´£
¹L , ÅܼƬO¨S¦³¸ê®Æ«¬§Oªº , ©Ò¥H expr ¥u¯à³B²zÅܼƤº®e¬°¥iµø
¬°¾ã¼ÆªºÅÜ¼Æ . ¦p :

  % var1=10
  % expr $var1 + 1        <-- §â var1 ¥[ 1 

¹³¤U­±´N¿ù¤F :

  % var1=10         
  % var2=20
  % expr var1 + var2      <-- var1 ¤Î var2 ¤£¬O¤º®e , $var1
  expr: non-numeric argument   $var2 ¤~¬O

¤W­±­n§ï¦¨ :

  % var1=10         
  % var2=20
  % expr $var1 + $var2  
  
¤U­±¬OµL·N¸qªº¨Ò¤l :

  % var1=red
  % var2=green
  % expr $var1 + $var2    <-- expr ¤£¯à³B²z red + green

¨º°²¦p§Ú­Ì­n§â¬Y¤@Åܼƪº¤º®e¥[¤@¦A©ñ¦^¥h©O ?
¦p¦P Pascal ¤¤ªº i:=i+1 , C »y¨¥¤¤ªº i=i+1 ¨º­n¦p¦ó§@ ?   
«Ü²³æ , ¦p¤U :

  % i=`expr $i + 1`  

µ¥¸¹¥kÃ䪺¤Ï³æ¤Þ¸¹·|¥ý°õ¦æ , expr §â i ¥[ 1 µM«á¦A§â±o¨ì
ªºµ²ªG«ü©wµ¹ i
 

(3.7) ©R¥O¦C°Ñ¼Æªº¶Ç»¼

³]­p¤@­Ó Shell Script , ¨ú±o©R¥O¦Cªº¤Þ¼Æ¬O¬Û·í­«­nªº . Á|­Ó
¨Ò¤l , §A·Q¼g¤@­Ó Shell Script ¥s°µ plus . plus »Ý­n¨â­Ó°Ñ¼Æ
µM«á§â³o¨â­Ó°Ñ¼Æ¬Û¥[ªºµ²ªG¦L¥X . ¨º§AÀ³¸Ó¦p¦ó°µ©O ? ¤S¦³®É­Ô
§Ú­Ì­n§PÂ_¨Ï¥ÎªÌ°Ñ¼Æªº­Ó¼Æ¬O¤£¬O¥¿½T , ´N¹³¤W­± plus , Á`±o
­n¦³¨â­Ó°Ñ¼Æ . ³o¨Ç³£­n¾a°Ñ¼Æªº¯S®íªí¥Ü¨Ó¹F¦¨ .

(3.7.1) $n ¬O²Ä n ­Ó°Ñ¼Æªº¤º®e ,  n=0,1,2,3,4,5,6,7,8,9

¦b Shell Åܼƫü©w¤¤ , §A¤£¯à³o¼Ë°µ :  1=first  , ¦]¬°¼Æ¦r¦³
¨ä¯S®í·N¸q . ¹³ $1 ´N¬O²Ä 1 ­Ó°Ñ¼Æªº¤º®e , $2 ¬O²Ä 2 ­Ó , ¾l
Ãþ±À . ¨º²Ä n ­Ó°Ñ¼Æªº¤º®e¦³¥Î¶Ü ? ´N¥Î¤W­± plus ¨Ó»¡©ú¦n¤F .
¥ý¥Î¤å®Ñ½s¿è¾¹¼g¤@­Ó Shell Script , ¨Ã©R¦W¬° plus ¦p¤U :

  #!/bin/sh

  echo `expr $1 + $2`

¦]¬°¤@¯ë¤Hªº umask ­È±`¬O 022 , »s³y¥X¨ÓªºÀɮ׳£¬O¨S¦³°õ¦æÅv­­
©Ò¥H§Ú­Ì±o¥Î chmod u+x plus ¨Ó¨Ï plus ¦³°õ¦æªºÅv­­ .
±µµÛ§A¥i¥H¦b´£¥Ü²Å¸¹¤U¿é¤J :
 
  plus 3 5   
 
¨º±o¨ìªºµª®×´N·|¬O 8 .

¦AÁ|¤@­Ó¨Ò¤l : §Ú­Ì­n­pºâ¬Y­Ó¥Ø¿ý¤U¦³¦h¤Ö­ÓÀÉ®× . ¦Ó§Ú­Ì§Æ±æ³o
­Ó¥Ø¿ý¬O¥Ñ¨Ï¥ÎªÌ¦b©R¥O¦Cªº°Ñ¼Æ©Òµ¹»Pªº . ¨º§Ú­Ì¥i¥H³o¼Ë¼g :

  #!/bin/sh

  ls $1 | wc -l

¥H«á¨Ï¥ÎªÌ¥u­n¿é¤J³o­Ó Shell Script ªº¦WºÙ , «á­±±µµÛ¬Y¥Ø¿ý¦W ,
¨º»ò´N¥i¥H­pºâ¥X¦³¦h¤ÖÀÉ®× . ( ³o­Ó Shell Script §â¥Ø¿ý¤]·í¦¨
ÀÉ®×¨Ó¬Ý«Ý )

ÁÙ¦³ , $0 ´N¬O§A°õ¦æ©R¥Oªº¦WºÙ

(3.7.2) $# ¥Nªí°Ñ¼Æ­Ó¼Æ  

¤W­±ªº plus 3 5  , ¨ä¤¤ 3 ¬O²Ä¤@­Ó°Ñ¼Æ , 5 ¬O²Ä¤G­Ó°Ñ¼Æ , §Ú­Ì
§â¤W­±ªº plus ³o­Ó Shell Script ¥[¥HÂX¥R , Åܦ¨ :

  #!/bin/sh

  echo "There are $# arguments"
  echo "The Answer is `expr $1 + $2`"

³o­Ó¨Ò¤l§Q¥Î¨ì§Ú­Ì©Ò¥Ø«e©Ò¾Ç¹Lªº¤£¤Öª¾ÃÑ , ¥]§t :

Âù¤Þ¸¹¤¤ , $ ¸¹·|³Q´À´« . ¤S¦]¬°§Ú­Ì¦³ 3 5 ¨â­Ó°Ñ¼Æ , ©Ò¥H $#
³Q´«¦¨ 2 . ¦]¦Ó¦L¥X There are 2 arguments .

Âù¤Þ¸¹¤¤ , ¨â­Ó¤Ï³æ¤Þ¸¹¤§¤¤©Ò§¨ªºªF¦è·|¥ý°õ¦æ . ©Ò¥H ,
`expr $1 + $2` ´«¦¨ `expr 3 + 5` ³Ì«á±o¨ìµ²ªG 8 . ¦]¦Ó¦L¥X
The Answer is 8 .

Á¿¨ì³o¸Ì , °²¦p¦U¦ì¬Ý¤£À´¤W­±ªº Shell Script , ¨º¥i¨£¹ï¤Þ¸¹
ªºÀ³¥ÎÁÙ¤£¤Ó¼ô , §Ú«ØÄ³­«¬Ý (3.5) , ¨Ã¦h¥[½m²ß .

§Ú­Ì²{¦b¦A¼g¤@­Ó Shell Script , ­t³dÅã¥Ü¦³¦h¤Ö­Ó°Ñ¼Æ , ¨Ã¥B
§â«e¤T­Ó°Ñ¼ÆÅã¥Ü¥X¨Ó :

  #!/bin/sh

  echo "There are $# arguments"
  echo "argument1 is $1"
  echo "argument2 is $2"
  echo "argument3 is $3"

®³³o­Ó Shell Script ¨Ó¸Õ¸Õ :

  % argtest red green blue
  There are 3 arguments
  argument1 is red
  argument2 is green
  argument3 is blue

  % argtest 'a b c'
  There are 1 arguments
  argument1 is a b c
  argument2 is 
  argument3 is 

  % argtest "* <> ?" 
  There are 1 arguments
  argument1 is * <> ?
  argument2 is 
  argument3 is 

  % argtest *     
  There are 64 arguments
  argument1 is a.c
  argument2 is c.c
  argument3 is e.c

  % argtest `cat friend_list`
  There are 3 arguments
  argument1 is veronica
  argument2 is jhhsu
  argument3 is ghguo

(3.7.3) $* ¥Nªí©Ò¦³ªº°Ñ¼Æ

§â­è­èªº Shell Script ¦A¥[¥HÂX¥R¦p¤U :

  #!/bin/sh

  echo "There are $# arguments"
  echo "argument1 is $1"
  echo "argument2 is $2"
  echo "argument3 is $3"
  echo "all arguments : $*"

®³³o­Ó Shell Script ¨Ó¸Õ¸Õ¬Ý :

  % argtest a b c
  There are 3 arguments
  argument1 is a
  argument2 is b
  argument3 is c
  all arguments : a b c

  % argtest 'a b c'
  There are 1 arguments
  argument1 is a b c
  argument2 is 
  argument3 is 
  all arguments : a b c

  % argtest "a b c"
  There are 1 arguments
  argument1 is a b c
  argument2 is 
  argument3 is 
  all arguments : a b c

  % argtest *
  There are 7 arguments
  argument1 is haha
  argument2 is haha1
  argument3 is haha2
  all arguments : haha haha1 haha2 memo1 memo13 memo2 memo23

(3.7.4) °Ñ¼Æªº²¾°Ê shift

«e­±´£¹L , $n ¬O²Ä n ­Ó°Ñ¼Æªº¤º®e , ¦ý§Ú­Ì­n¯S§Oª`·Nªº¬O , n
¥²»Ý¤p©ó 10 , ¤]´N¬O»¡ , ¤£¥i¯à¦³ $10 ³o¼ËªºªF¦è . ¨º°²¦p§Ú
­Ì°Ñ¼Æªº­Ó¼Æ«Ü¦h , ¶W¹L¤F 10 ­Ó , ¦Ó¤S·Q¨ú±o¶W¹L 10 ­Ó«áªº°Ñ
¼Æ , ­n¦p¦ó°µ ? µª®×´N¦b shift .
shift ¬O¤@­Ó³æ¯Âªº©R¥O , ¥¦§â $n ªº¤º®e©ñ¨ì $n-1 ¤¤ . ¦p $2
©ñ¨ì $1 , $3 ©ñ¨ì $2 ...... ¦ý $1 ¨Ã¤£·|©ñ¨ì $0 , ¦Ó¬O¥Ã»·ªº
®ø¥¢ . ¬Ý¤U­±ªº Shell Script ¤Î°õ¦æµ²ªG :

  #!/bin/sh

  echo "There are $# arguments"
  echo "all argument : $*"  
  shift
  echo "There are $# arguments"
  echo "all argument : $*"  
  shift
  echo "There are $# arguments"
  echo "all argument : $*" 
  shift
  echo "There are $# arguments"
  echo "all argument : $*" 

  % argtest a b c d e f g h i j 

  There are 10 arguments
  all argument : a b c d e f g h i j
  There are 9 arguments
  all argument : b c d e f g h i j
  There are 8 arguments
  all argument : c d e f g h i j
  There are 7 arguments
  all argument : d e f g h i j

©Ò¥H±q¤W­±ªº¨Ò¤l±oª¾ , ¨C shift ¤@¦¸ , §Ú­Ì´N¥i¥H¦b $9 ªº¦a¤è
±o¨ì­ì¨Óªº²Ä 10 ­Ó°Ñ¼Æ¤º®e . ¦p¦¹¤@¨Ó , ­n¨ú±o²Ä 10 ­Ó¥H«áªº°Ñ
¼Æ´N¤@ÂI¤]¤£§xÃø¤F . ÁÙ¦³ , $1 ÁöµM·|¦b shift «á³Q¥á±¼ , ¦ý°²
¦p $1 ¥H«áÁÙ­n¥Î¨ìªº¸Ü , §Ú­Ì¤´µM¥i¥H¦b shift «e±N¥¦«O¯d°_¨Ó :
    .
    .
    .
  temp=$1 
  shift
    . 
    .
    .                 
                 


 
Chap 4 -- Shell Programming ¤¤ªº»yªk


¦b Chap 3 ¾Ç§¹¤§«á , ¬Û«H¦U¦ì¤w¸g¥i¥H¼g¤@¨Ç¤pªºµ{¦¡ . ¦ý¬OÁ`
¦n¹³¤Ö¤F¨Ç¤°»ò ? ¤£¿ù , ³o¨Ç¥i»¡¬O¨CºØ Programming Language
¤¤ªºÆF»î : »yªk ! »yªk¥]§t¤F±ø¥óÅ޿誺§PÂ_ , °j°é , ¨ç¼Æ©I¥s
µ¥ ......¦³¤F³o¨Ç , Shell Programming Language ¤~ºâ§¹¾ã .


(4.1) if µ²ºc

  if [ ´ú¸Õ±ø¥ó ]         
  then
     .
     .
  fi
  
§Ú­Ì¥i¥H«Ü»´©öªº¬Ý¨ì , if »P fi ¤§¶¡´N¬O¨å«¬ªº if µ²ºc
°²¦p´ú¸Õ±ø¥ó¦¨¥ß , ´N§@ then »P fi¤§¶¡©Ò§¨ªº¨Æ±¡ . 
ÁÙ¦³¨ä¥¦³\³\¦h¦hªº¬yµ{±±¨î³£­n¥Î¨ì "´ú¸Õ±ø¥ó" , ¦bÄ~Äò
¤¶²Ð³o¨Ç¬yµ{±±¨î¤§«e , §Ú­Ì±o¥ý¤¶²Ð´ú¸Õ±ø¥ó .


(4.2) ´ú¸Õ±ø¥ó 

´ú¸Õ±ø¥ó¤jÅé¤W¥i¤À¬° (I) ¦r¦ê´ú¸Õ  (II) ¾ã¼Æ´ú¸Õ 
                     (III) ÀÉ®×´ú¸Õ  

(I) ¦r¦ê´ú¸Õ :

  string1 = string2       #  string1 µ¥©ó string2
  string1 != string2      #  string1 ¤£µ¥©ó string2
  string                  #  string is not null
  -n string               #  string is not null
  -z string               #  string is null
    
  «e­±´£¹L , ÅܼƳ]©w¥i¯à¹³³oºØ¼Ë¤l :  name=veronica
  ¨º°²¦p§Ú­Ì­n§â name »P¬Y¤@¦r¦ê°µ¬Ûµ¥¤ñ¸û , À³¸Ó³o¼Ë°µ :

    "$name" = veronica
    
  °²¦p­n§@¤£¬Ûµ¥¤ñ¸û , À³¸Ó³o¼Ë°µ :

    "$name" != veronica
  
  ¬Ý¤U­±ªº Shell Script :

    #!/bin/sh

    name=veronica

    if [ "$name" = veronica ]
    then
      echo 'equal'
    fi

    if [ "$name" != veronica ]
    then
      echo 'not equal'
    fi
 
  °õ¦æµ²ªG :

    % strcmp
    equal

  ¤ÀªR¤W­±ªº Shell Script , ­º¥ý , §â veronica «ü©wµ¹ name
  ¦¹®É $name ´N¬O veronica . °õ¦æ¨ì if [ "$name" = veronica ]
  "$name" ´N·|´«¦¨ veronica , ©Ò¥HÅܦ¨ :

    if [ veronica = veronica ]     <-- ¦r¦ê¬Ûµ¥¤ñ¸û¦¨¥ß

  ¦]¬°¤ñ¸û¦¨¥ß¤F , ©Ò¥H´N°µ then ¦Ü fi ¤§¤¤ªº¨Æ , ¤]´N¬OÅã¥Ü
  equal .
  
  ±µµÛ°õ¦æ if [ "$name" != veronica ] , ¦A¤@¦¸ªº , "$name"
  ³Q´«¦¨ veronica , ©Ò¥H : if [ veronica != veronica ]
  ´ú¸Õ±ø¥ó¤£¦¨¥ß . not equal ±N¤£·|³QÅã¥Ü¥X¨Ó .
      
  ¦Ü©ó string , -z string , -n string «h¥i¥H´ú¸Õ¬O§_¬°ªÅ¦r¦ê
  ¬Ý¤U­±ªº Shell Script :

    #!/bin/sh

    myaddr=                        # myaddr is null    
    youaddr=taipei                 # youraddr is not null 

    if [ -z "$myaddr" ]            # ´ú¸Õ±ø¥ó¦¨¥ß
    then
      echo 'my string is null'
    fi

    if [ -n "$myaddr" ]            # ´ú¸Õ±ø¥ó¤£¦¨¥ß
    then
      echo 'my string is not null'
    fi

    if [ -z "$youaddr" ]           # ´ú¸Õ±ø¥ó¤£¦¨¥ß
    then
      echo 'your string is null'
    fi

    if [ -n "$youaddr" ]           # ´ú¸Õ±ø¥ó¦¨¥ß
    then
      echo 'your string is not null'
    fi

  °õ¦æµ²ªG :

    % isstrnull
    my string is null
    your string is not null
   

(II) ¾ã¼Æ´ú¸Õ

  §Ú­Ì´¿´£¹L , ÅܼƨèS¦³©Ò¿×ªº¸ê®Æ«¬§O , ¨º¬°¤°»ò·|¦³¾ã¼Æ
  ´ú¸Õ©O ? ³o¬O¦]¬° , ¾ã¼Æ´ú¸Õ¤¤ , Åܼƪº¤º®e³Q·í¦¨¾ã¼Æ¨Ó¬Ý
  «Ý . ¦p : money=30 , ¤@¯ë±¡ªp¤U , money ¬O©ñµÛ 30 ³o­Ó¦r¦ê
  ¦ý¦b¾ã¼Æ´ú¸Õ¤¤ , money ³Qµø¬°¾ã¼Æªº 30 .

  ¾ã¼Æªº´ú¸Õ¦p¤U :

  int1 -eq int2            #  int1 = int2    µ¥©ó   
  int1 -ge int2            #  int1 >= int2   ¤j©óµ¥©ó
  int1 -gt int2            #  int1 > int2    ¤j©ó
  int1 -le int2            #  int1 <= int2   ¤p©óµ¥©ó
  int1 -lt int2            #  int1 < int2    ¤p©ó
  int1 -ne int2            #  int1 != int2   ¤£µ¥©ó
  
  §Ú­ÌÁ|¤@­Ó¨Ò¤l :

    #!/bin/sh

    if [ "$#" -eq 2 ]              # °²¦p°Ñ¼Æ­Ó¼Æµ¥©ó 2   
    then
      echo 'The number of arguments is two'
    fi

  °õ¦æµ²ªG :

    % digi
    % digi a b
    The number of arguments is two
    % digi a  
    % digi "abc" 'def'
    The number of arguments is two
   
  ¾ã¼Æªº¤ñ¸û±`¥Î¦b¾ã­Ó Shell Script ªº¶}ÀY , ¤×¨ä¬O¨º¨Ç¶·­n
  °Ñ¼Æªº Shell Script . ´N¥H«e plus ³o­Ó Shell Script ¦Ó¨¥
  plus »Ý­n¨â­Ó°Ñ¼Æ , ¨º§Ú­Ì«K¥i¥H¦b Shell Script ªº¤@¶}ÀY
  ´NÀˬd¨Ï¥ÎªÌ©Òµ¹ªº°Ñ¼Æ­Ó¼Æ¬O¤£¬O¨â­Ó , °²¦p¬O , ¤~°µ¨â­Ó
  °Ñ¼Æ¬Û¥[ªº°Ê§@ , ­Y°Ñ¼Æ­Ó¼Æ¤£µ¥©ó¨â­Ó , ´NÅã¥Ü°T®§µ¹¨Ï¥Î
  ªÌ , ¨Ã¥B²æÂ÷ , ¤£Ä~Äò°µ , ¾ã­Ó Shell Script ¦p¤U :

    #!/bin/sh

    if [ "$#" -ne 2 ]               # °²¦p°Ñ¼Æ­Ó¼Æ¤£µ¥©ó 2     
    then
      echo 'plus needs two arguments'
      exit                          # ²æÂ÷¾ã­Ó Shell Script
    fi

    echo `expr $1 + $2`             # Åã¥Ü°Ñ¼Æ 1 ¥[°Ñ¼Æ 2
                                    # ªº­È

  °õ¦æµ²ªG :
   
    % plus2
    plus needs two arguments
    % plus2 3 5
    8

 
(III) ÀÉ®×´ú¸Õ

  §Ú­Ì¦b Shell Script ¤¤¤]¥i¥H°µÀÉ®×´ú¸Õ :

  -d file              # Àɮ׬O§_¬°¤@­Ó¥Ø¿ý
  -f file              # Àɮ׬O§_¬°¤@­Ó´¶³qÀÉ®×
  -r file              # Àɮ׬O§_¬°¥iŪ
  -s file              # Àɮתø«×¬O§_¤£¬O 0
  -w file              # Àɮ׬O§_¬°¥i¼g¤J
  -x file              # Àɮ׬O§_¬°¥i°õ¦æ
  
  ­Y§Ú­Ì­n´ú¸Õ /etc/passwd ¬O§_¦s¦b , ¨Ã¥B¬O´¶³qÀɮתº¸Ü :

    if [ -f /etc/passwd ]     # ¦]¬° /etc/passwd ¦s¦b , ¦Ó¥B
                              # ¥¦¬O¤@­Ó´¶³qÀÉ®× , ©Ò¥H´ú¸Õ
                              # ·|¦¨¥ß

    if [ -x /etc/passwd ]     # ¦]¬° /etc/passwd ¤£¬O¥i°õ¦æ
                              # ÀÉ , ©Ò¥H´ú¸Õ¤£·|¦¨¥ß


(4.3) ©R¥O´ú¸Õ

¹ê»Ú¤W , ©R¥O¤]¥i¥H·í§@´ú¸Õªº±ø¥ó , ³o¬O¦]¬° , §Ú­Ì¨C°õ¦æ
§¹¤@­Ó©R¥O , Á`·|¦³¶Ç¦^­È , ³o­Ó¶Ç¦^­È°²¦p¬O 0 , «h¥Nªí
©R¥O°õ¦æ¦¨¥\ , °²¦p¬°«D 0 ªº­È , «h¥Nªí©R¥O°õ¦æ¥¢±Ñ .
¬Ý¬Ý¤U­±ªº Shell Script :
 
  #!/bin/sh

  if w | grep "^jhhsu" >&-
  then
    echo $?
  fi

  if w | grep "^veronica" > /dev/null
  then
    echo 'veronica is online'
  fi

  ³o­Ó Shell Script ­È±o¦n¦n¬ã¨s , ­º¥ý , $? ¥Nªí¤W­Ó©R¥Oªº
  ¶Ç¦^­È . °²¦p¦b³o­Ó¨t²Î¤º jhhsu ¥¿¦b½u¤W , ¦Ó veronica ¨Ã
  ¤£¦b½u¤W . ¨º¨â¦¸ echo $? ªºµ²ªG±N·|¬O 0 »P 1 , ¤À§O¥Nªí
  ¦¨¥\»P¤£¦¨¥\ . ÁÙ¦³ , °²¦p if ©Ò´ú¸Õªº¬O©R¥O , ¨º¨Ã¤£»Ý­n
  [  ] ¸¹ . «e­±¬°¤F¤è«K , ¥H¤Î¬Ý°_¨Ó¦³µ²ºc¤Æ , §Ú§â if ªºµ²ºc
  ¼g¦¨ :


    if [ ´ú¸Õ±ø¥ó ]
    then
       .
       .
    fi

  
  ¦ý¹ê»Ú¤W , ­ì¨Óªºµ²ºcÀ³¸Ó¬O³oºØ¼Ë¤l :


    if test_command
    then
       .
       .
    fi

  
  ¤]´N¬O»¡ , if «á±µªº¥²¶·¬O¤@­Ó´ú¸Õ©R¥O , ¦Ó¤£¬O [ ´ú¸Õ±ø¥ó ]
  ©Ò¥H , §Ú­Ì±o¥Î test ³o­Ó©R¥O¨Ó°õ¦æ§Ú­Ìªº´ú¸Õ±ø¥ó . ´N¹³¤U­±
 
    if test "$1" -gt 10
    
  ¦ý¬O , test ´ú¸Õ±ø¥ó ¤]¥iª½±µ´«¦¨ [ ´ú¸Õ±ø¥ó ] , ©Ò¥H§Ú´N¼g
  ¦¨ if [ ´ú¸Õ±ø¥ó ]
  ¤U­±¥ª¥k¨âÃ䪺 Shell Script ¬O§¹¥þ¬Ûµ¥ªº :

                                  | 
    #!/bin/sh                     |   #!/bin/sh
                                  |
    if [ "$#" -ne 2 ]             |   if test "$#" -ne 2
    then                          |   then
      echo 'needs two arguments'  |     echo 'needs two arguments'
      exit                        |     exit
    fi                            |   fi
                                  |              
    echo `expr $1 + $2`           |   echo `expr $1 + $2` 
                                  |

  >&- »P /dev/null ¥i°Ñ¦Ò (2.5.2) , grep ¥i°Ñ¦Òªþ¿ý¤G


(4.4) ²Õ¦X´ú¸Õ±ø¥óªºÅÞ¿è¹Bºâ¤l 

¦U¦ì¦b¬Ý§¹ (4.3) «á , ­Y§A­ì¥»¹ïºÞ½u , ¾É¦Vµ¥µ¥ªº½ÒÃD¦³¤@©w
ªº»{ÃÑ , ¨º§A¤w¸g¥i¥H¼g¥X»á¬°¦³¥Îªº Shell Script ¤F .
¦b (4.4) , §Ú­ÌÁÙ­n¤¶²Ð¤TºØÅÞ¿è¹Bºâ¤l not , and »P or

(I) ! ¥Nªí¤Ï­±ªºÅÞ¿è : not

  ¤]³\§A¤w¸gµo²{¤F , ¦b (4.2) ¤¤ , ¤£ºÞ¬O¦r¦êªº´ú¸Õ©ÎªÌ¬O¾ã¼Æ
  ªº´ú¸Õ , ³£¦³¤Ï­±ªºÅÞ¿è¦s¦b :

    string1 = string2         # ¦r¦ê1 »P¦r¦ê2 ¬Ûµ¥  
    string1 != string2        # ¦r¦ê1 »P¦r¦ê2 ¤£¬Ûµ¥

    int1 -gt int2             # ¾ã¼Æ1 ¤j©ó ¾ã¼Æ2
    int1 -le int2             # ¾ã¼Æ1 ¤p©óµ¥©ó ¾ã¼Æ2

  ¦ý¦bÀɮתº´ú¸Õ¤è­± , «o¨S¦³¤Ï­±ªºÅÞ¿è . ¦¹®É , §Ú­Ì´N­n¾a
  ! ¨Ó¹F¦¨¤Ï­±ªº´ú¸Õ , ¦p :

    if [ -f /etc/passwd ]     # /etc/passwd ¬O´¶³qÀÉ®×¶Ü ?
    if [ ! -f /etc/passwd ]   # /etc/passwd ¤£¬O´¶³qÀÉ®×¶Ü ?

  ·íµM , ¦b¦r¦ê©Î¾ã¼Æ¤ñ¸û¤è­± , §A¤]¥i¥H¤£¥Î­ì¨Ó´N¤w¸g¦³ªº¹B
  ºâ¤l , ¦Ó§ï¥Î ! ¥H¥Nªí¤Ï­±ªºÅÞ¿è . ½Ð¬Ý¤U­±ªº Shell Script

    #!/bin/sh

    if [ ! "$1" -gt 10 ]      # °²¦p²Ä¤@­Ó°Ñ¼Æªº­È¤£¤j©ó 10
    then
      echo 'argument is less than or equal to 10'
    fi
 
  °õ¦æµ²ªG :

    % unary 3
    argument is less than or equal to 10
    % unary 11
   
(II) -a ¥NªíÅÞ¿è¤Wªº and

  Á¿¨ì¥Ø«e¬°¤î , §Ú­Ìªº¤ñ¸û³£¶È­­©ó¤@­Óªí¥Ü¦¡ , ¹³¬Y¤@Åܼƪº
  ¤º®e¬O§_µ¥©ó¤@­Ó¦r¦ê , ©Î¬O¬Y¤@Åܼƪº¤º®e¬O§_¤j©ó¤@­Ó¾ã¼Æ
  ¨º°²¦p§Ú­Ì·Q°µ¦p¦¹ªº´ú¸Õ : " ¤@­Ó¼Æ¦r¬O§_¤j©ó 10 ¦Ó¥B¤p©ó
  100 , ¤]´N¬O¤¶©ó 10 ¨ì 100 ¤§¶¡ " ¨º§Ú­Ì´N±o¥Î -a ¨Ó¹F¦¨ .
  ½Ð¬Ý¤U­±ªº Shell Script :
  
    #!/bin/sh

    if [ "$1" -gt 10 -a "$1" -lt 100 ]  # 10 < °Ñ¼Æ¤@ < 100 ?
    then
      echo '10 < argument < 100'
    fi

  §Ú­Ì¥i¥H§â¤W­± [  ] ¤¤ªº´ú¸Õ±ø¥ó¬Ý¦¨ :

    ²Ä¤@­Ó°Ñ¼Æ¤j©ó10 ¥B ²Ä¤@­Ó°Ñ¼Æ¤p©ó100  
    
  ¦³¨Ç¤H·|·Q : §Ú¬O¤£¬OÀ³¸Ó¥Î¬A¸¹¨Ó½T«O¹BºâÀu¥ýÅvªº¶¶§Ç , ¨ä¹ê
  ¥i¥H¤£¥² , ¦]¬° -a ¤ñ -gt ©Î -lt ªºÀu¥ýÅv§C , ¤]´N¬O»¡ ,
  "$1" -gt 10 »P "$1" -lt 100 ·|¤À§O¥ý¹Bºâ§¹«á¤~°µ and ªº°Ê§@ .
  °²¦p§A¦³"Àu¨}"ªº¼gµ{¦¡²ßºD , ¨º§A¤´µM¥i¥H¥[¤W¬A¸¹ , ¥u¬O , 
  ­n¥H¤Ï±×½u¨Ó¥h°£¬A¸¹ªº¯S®í·N¸q , ¦p¤U :

    if [ \( "$1" -gt 10 \) -a \( "$1" -lt 100 \) ]

(III) -o ¥NªíÅÞ¿è¤Wªº or

  »P and ¤£¦Pªº , or ¥u­n¦³¤@¶µ¦¨¥ß´N¥i¥H¤F . ¤ñ¦p»¡ :

    if [ "$1" -le 10 -o "$1" -ge 90 ]

  ªí¥Ü´ú¸Õ²Ä¤@­Ó°Ñ¼Æ¬O§_²Å¦X¤p©óµ¥©ó10 ©Î ²Å¦X¤j©ó 90 ¨ä¤¤¤§¤@
  ªº±Ô­z . ¥u­n²Å¦X¨ä¤¤¥ô¤@¥y±Ô­z , ±ø¥ó´N¦¨¥ß .  

  ¦b¤ñ¸û½ÆÂøªºÅ޿褤 , or »P and ¦³¦P®É¦s¦bªº¥i¯à . ¦¹®É , ¨ì©³
  ½ÖªºÀu¥ýÅv¤ñ¸û°ª©O ? µª®×¬O and , Á|­Ó¨Ò¤l¦p¤U :

    if [ "$1" -le 10 -o "$1" -gt 50 -a "$1" -lt 100 ]

                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^
                                ³o³¡¥÷¥ý°µ 

         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                  ¦A°µ³o³¡¥÷
            
  °²¦p§A·Q§ïÅÜ and »P or ¤§¶¡ªºÀu¥ýÅv , ½Ð¨Ï¥Î¬A¸¹ . 


(4.5) §ó¦hªº if ¬yµ{±±¨î

·í§Ú­Ì¾Ç§¹´ú¸Õ±ø¥ó¤§«á , ¬yµ{±±¨î´N«Ü²³æ¤F , ¦b (4.1)
¤¤ , §Ú­Ì¤w¸g¬Ý¹L¤F if ªºµ²ºc , ²{¦b§Ú­Ì¨Ó¬Ý¬Ý¨ä¥¦ªºµ²ºc
©Ò¦³ªº if µ²ºc³£¥H fi °µµ²§À , ¦U¦ì¥i¥H§â if ¦Ü fi ¬Ý¦¨
¤@­Ó°Ï¶ô .


(I) if test_command
    then
       .
       .
    fi

    ³o­Óµ²ºc (4.1) ¤w´£¹L , ¤£¦AÂØ­z
      
(II) if test_command
     then
        . 
        .
     else
        .
        .
     fi

    ³o­Óµ²ºc«Ü²³æ , °²¦p test_command ¦¨¥ß , ¨º´N°µ then
    ¨ì else ¤§¶¡ªº¨Æ ; °²¦p test_command ¤£¦¨¥ß , ¨º´N°µ
    else ¨ì fi ¤§¶¡ªº¨Æ . ¤U­±¬O¤@­Ó²³æªº¨Ò¤l .

      #!/bin/sh

      if [ "$1" -ge 0 ]
      then         
        echo 'positive'
      else         
        echo 'negative'
      fi

    °õ¦æµ²ªG :

      % mytest 10               # 10 ¤j©ó 0
      positive
      % mytest -5               # -5 ¤p©ó 0
      negative


(III) if test_command1
      then
         .
         .
      elif test_command2
      then
         .
         .
         .
      elif test_commandn
      then
         .
         .
      else
         . 
         .
      fi     

     ¤W­±ªºµ²ºc¤]«Ü²³æ , °²¦p test_command1 ¦¨¥ß , ´N°µ
     then »P elif test_command2 ¤§¶¡ªº¨Æ . °²¦p test_command1
     ¤£¦¨¥ß , ´N´ú¸Õ test_command2 ¬Ý¦¨¤£¦¨¥ß , °²¦p¤£¦¨¥ß
     ´NÄ~Äò´ú¸Õ¤U¥h . °²¦p©Ò¦³ªº´ú¸Õ³£¤£¦¨¥ß , ´N·|°õ¦æ else
     »P fi ¤§¶¡ªº¨Æ . ¤U­±¬O¤@­Ó¨å«¬ªº Shell Script :

       #!/bin/sh

       time=`date | cut -c12-13`
       
       if [ "$time" -gt 0 -a "$time" -lt 12 ]
       then
         echo 'Good Morning'
       elif [ "$time" -ge 12 -a "$time" -lt 17 ]
       then
         echo 'Good Afternoon'
       else
         echo 'Good Evening'
       fi

     ­º¥ý , date | cut -c12-13 ¥ý°õ¦æ , date ¿é¥X¥Ø«e®É¶¡ ,
     ¦ý§Ú­Ì¨Ã¤£­n¥þ³¡ªº¿é¥X , ¥u­n²Ä12¤Î²Ä13­Ó¦r¤¸ , ¤]´N¬O
     ¥Ø«e¬O´XÂI , ©Ò¥H§Ú­Ì§â date ªº¿é¥X¥HºÞ½u¥æµ¹ cut ³o­Ó
     ©R¥O¥h°Å¤U²Ä12¤Î²Ä13­Ó¦r¤¸ , µM«á§â³o¨â­Ó¦r¤¸³]µ¹ time
     ±µµÛ¶i¤J±ø¥ó´ú¸Õ . ¤@¶}©l¥ý´ú¸Õ¬O§_¹sÂI¨ì¤Q¤GÂI¤§¶¡ ,
     °²¦p¬O , ´NÅã¥Ü Good Morning , ¨Ã²æÂ÷ if µ²ºc . °²¦p¤£
     ¦b¹sÂI¨ì¤Q¤GÂI¤§¶¡ , ¨º´N¬Ý¬Ý¬O¤£¬O¦b¤Q¤GÂI¨ì¤Q¤CÂI¤§¶¡
     °²¦p¬O , ´NÅã¥Ü Good Afternoon , ¨Ã²æÂ÷ if µ²ºc , °²¦p
     ¤S¤£¬O¦b¤Q¤GÂI¨ì¤Q¤CÂI¤§¶¡ , ´NÅã¥Ü Good Evening

      
(4.6) case µ²ºc 


     case value in
     pattern_1)  .
                 .
                 .;;
     pattern_2) 
                 .
                 .
                 .;;
      ...

     pattern_n)  .
                 .
                 .;;
     esac

    
case µ²ºc¬O¥H case ¬°¶}ÀY , ¥H esac ¬°µ²§ô . ¨ä¤¤ , §Ú­Ì
¯à¦Û¥Ñ«ü©wªº , ¥]§t value , pattern ¥H¤Î­Y²Å¦X pattern «h
§@¨º¨Ç¨Æ . case ªº¤u§@­ì²z«Ü²³æ , ¥¦§â value ªº­È»P¤U­±ªº
pattern °µ¤ñ¸û , °²¦p¹J¨ì²Å¦Xªº , ´N°µ pattern ¤§«áªº¤º®e
ª½¨ì¹J¨£¤@­Ó ;; ¸¹¬°¤î . ¦U¦ì¤@©w­nª`·N , ¨C­Ó pattern µ²§ô
³£¤@©w­n¦³¤@­Ó ;; ¸¹ , §_«h·|¦³¿ù»~ . 
value ´N¬O¤@­ÓÅÜ¼Æ , pattern ¬O¤@­Ó²Å¦Xªº¼Ëª© . ¥ý¬Ý¤@­Ó
Shell Script , ³o­Ó Shell Script ±q°Ñ¼Æ±o¨ì¤@­Ó¼Æ¦r , ¨Ã§â
³o­Ó¼Æ¦rÂন¬Û¹ïÀ³ªº­^¤å :

  
  #!/bin/sh

  if [ "$#" -ne 1 ]
  then
    echo 'Usage : transnum '
    exit 
  fi

  case "$1" in

  0) echo 'zero';;
  1) echo 'one';;
  2) echo 'two';;
  3) echo 'three';;
  4) echo 'four';;
  5) echo 'five';;
  6) echo 'six';;
  7) echo 'seven';;
  8) echo 'eight';;
  9) echo 'nine';;
  *) echo 'must a single digit';; 

  esac   


°õ¦æµ²ªG :

  % transnum 4
  four
  % transnum 18
  must a single digit
  % transnum veronica
  must a single digit

¦b¤W­±ªº Shell Script ¤¤ , value ¬O²Ä¤@­Ó°Ñ¼Æ , ¦Ó pattern
ªº­È¤À§O¬° 0,1,2,3,4,5,6,7,8,9,* . ©Ò¥H , ·í°õ¦æ¨ì case ³o
­Óµ²ºc®É , ²Ä¤@­Ó°Ñ¼Æ´N»P¤U­±¤@­Ó­Ó pattern °µ¤ñ¸û , ª½¨ì
¹J¨£²Å¦Xªº pattern , ´N°µ pattern «á­±ªº¨Æ . ¤ñ¸û¯S®íªº¬O ,
pattern ­Y¬O * ¸¹ , «hªí¥Ü³£¤£²Å¦X©Ò­n°µªº¨Æ . ¹³¤W­± , §Ú
­Ì¥u±µ¨ü¤@¦ì¼Æ¦r , °²¦p§Aµ¹»Pªº¬O¨â¦ì¼Æ¦r¥H¤W , ©Î¬O¦r¦ê ;
¬JµM³£¤£²Å¦X 0 ¨ì 9 ªº pattern , ¨º´N·|Åã¥Ü¤@¬q¿ù»~°T®§ .
ÁÙ¦³ , pattern ¥i¥H¤ñ¸û½ÆÂø , ¦p¤U­±ªº®æ¦¡³£¬O¥i¥Hªº :

  [a-z]         <-- ²Å¦X¤p¼g¦r¤¸
  [0-9]         <-- ²Å¦X 0,1,2,3,4,5,6,7,8,9
  ?             <-- ²Å¦X¥ô¦ó¤@­Ó¦r¤¸

§A¤]¥i¥H§â¨â­Ó pattern ¥H | °µÅ޿誺 or , ¬Ý¤U­±ªº¨Ò¤l


  #!/bin/sh

  if [ "$#" -ne 1 ]
  then
    echo 'need a animal name'
  fi

  case "$1" in

  ant | cat ) echo 'I hate this';;
  bird | dog ) echo 'I like this';;

  esac


°õ¦æµ²ªG :

  % testani ant
  I hate this
  % testani bird
  I like this
  % testani cat 
  I hate this
  % testani dog
  I like this

  
(4.7) while µ²ºc


  while test_command
  do
       .
       .
  done
  

while µ²ºc¬Û·í²³æ , ¥¦¥i»¡¬O¤@ºØ°j°éªº«¬¦¡ , ¥u­n test_command
¦¨¥ß , ´N·|¤@ª½°µ do »P done ¤§¶¡©Ò§¨ªº¨Æ . ¤U­±ªº Shell Script
·|Åã¥Ü 0 ¨ì 100 


  #!/bin/sh

  var=0                               # §â var ªºªì©l­È³]¬° 0

  while [ "$var" -le 100 ]            # ·í $var ¤p©óµ¥©ó 100
  do
    echo -n "$var"                    # echo -n ¬°Åã¥Ü¦ý¤£´«¦æ
    var=`expr $var + 1`               # §â var ªº­È¥[ 1 
  done


°²¦p§Ú­Ì·QµL±ø¥ó§@µL½a°j°é , ¨º§A¥i¥H¬Ý¬Ý¤U­±ªº Shell Script ,
¥¦·|¦b²×ºÝ¾÷¤W±q 0 ¶}©l¦L , ª½¨ì§A«ö¤U Ctrl-c ¬°¤î


  #!/bin/sh

  var=0

  while test 0               # ª`·N , test_command ¬° test 0         
  do
    echo -n "$var"
    var=`expr $var + 1`
  done


¥»¨Ó¦b§Ú­Ìªº·Qªk¤¤ , test «áÀ³¸Ó¬O±µ¤@­Ó´ú¸Õ±ø¥ó , ´N¹³ :

  test "$var" -lt 100

test 0 ¬O¤°»ò·N«ä ? ¨ä¹ê«Ü²³æ , ´ú¸Õ±ø¥ó°²¦p¦¨¥ß , ¨º´N
·|¬O 0 , °²¦p¤£¦¨¥ß , ¨º´N·|¬O 1 . ©Ò¥H , ¹³ $var ­Y¤p©ó 100
¨º»ò , test "$var" -lt 100  ´N·|³Q´«¦¨  test 0  . 
©Ò¥H , §Ú­Ì©Ò¬Ý¨ìªº :

  while test 0           <-- «í¦¨¥ß , ©Ò¥H¬°¤@µL½a°j°é
  do
       .
       .
  done 
  

(4.8) until µ²ºc


  until test_command
  do
       .
       .
  done


»P while ¤£¦Pªº , until «á­±±µªº test_command ­n¤£¦¨¥ß¤~·|
¤@ª½°µ do »P done ¤§¶¡§¨ªº¨Æ , ¤@¦ý test_command ¦¨¥ß¤F ,
¾ã­Ó until µ²ºc´Nµ²§ô .
Á|¤W­±ªºÅã¥Ü 0 ¨ì 100 ªº¨Ò¤l , °²¦p§Ú­Ì­n§â­ì¨Óªº while µ²ºc
§ï¦¨ until µ²ºc , ¨º§Ú­Ìªº·Qªk¥²µM¬O : ¤@ª½¥[ 1 , ª½¨ì¤j©ó
100 ¬°¤î . ¨º¾ã­Ó Shell Script ¦p¤U :


  #!/bin/sh

  var=0

  until [ "$var" -gt 100 ]      # ª½¨ì¤j©ó 100 ¬°¤î   
  do
    echo -n "$var"
    var=`expr $var + 1` 
  done


Åý§Ú­Ì¦n¦n¤ñ¸û while »P until :


                                |
  #!/bin/sh                     |   #!/bin/sh
                                |
  var=0                         |   var=0   
                                |
  while [ "$var" -le 100 ]      |   until [ "$var" -gt 100 ]
  do                            |   do
    echo -n "$var"              |     echo -n "$var"  
    var=`expr $var + 1`         |     var=`expr $var + 1` 
  done                          |   done
                                |


°µ¦P¼Ë¤@¥ó¨Æ , ¦ý¬O¥¦­Ìªº´ú¸Õ±ø¥ó«o­è¦n¬Û¤Ï . while ¬O¤p©óµ¥©ó
100 , ¦Ó until «o¬O¤j©ó 100 . ±q³o¸Ì , §Ú­Ì¬Ý¨ì¤F while »P
until ªº¤¬¸É©Ê .
until µ²ºc¦³¥Îªº¦a¤è¬O¦b©ó : ¥¦¥i¥H¥Î¨Óµ¥«Ý¬Y¨Æ¥óªºµo¥Í , ¬Ý¤U
­±ªº Shell Script :


  #!/bin/sh

  if [ "$#" -ne 1 ]                     # °²¦p°Ñ¼Æ­Ó¼Æ¤£µ¥©ó 1
  then
    echo 'Usage: scanuser username'
    exit
  fi

  until who | grep "^$1" > /dev/null
  do
    sleep 60
  done

  echo "$1 has logged on"


¤W­±¬O¤@­Ó»á¬°¦³¥Îªº Shell Script , §Ú¬Û«H¦U¦ì¥i¥H¬Ý±oÀ´«e´X¦C
¯S§O­n¸ÑÄÀªº¬O until ªºµ²ºc . ¦b³o­Ó Shell Script ¤¤ , §Ú­Ì
·Q°µªº¨Æ¬O : ¨C 60 ¬íÀˬd¤@¦¸ , ¬Ý¬Ý¬Y user ¬O¤£¬O¦b¨t²Î¤¤ .

  until who | grep "^$1" > /dev/null

¤W­±³o¦C¬Ý°_¨Ó«Ü½ÆÂø , ¨ä¹ê¥u­n§A¼ô±x©R¥O¤Î¾É¦V,ºÞ½u , ¨º¹ê¦b
¨S¦³¤°»ò¯«¯µªº . §Ú­Ìª¾¹D , until test_command ¬O¥u­n 
test_command ¤£¦¨¥ß , ´N¤@ª½°µ do »P done ¤§¶¡ªº¨Æ . 

  who | grep "^$1" > /dev/null

§â who ªº¿é¥X¥æµ¹ grep ¥h§ì¥X¬Ý¬Ý¦³¨S¦³²Ä¤@­Ó°Ñ¼Æªº¤H¦W , ¨Ã
§âÀ³¸Ó¥¿±`¿é¥Xªº°T®§¥áµ¹ /dev/null ³o­Ó©U§£µ© .
°²¦p¨S¦³²Ä¤@­Ó°Ñ¼Æªº¤H¦W , ´N°õ¦æ sleep 60  ( sleep 60 ¬O¼È
°± 60 ¬íªº·N«ä ) , °²¦p¦³²Ä¤@­Ó°Ñ¼Æªº¤H¦W , ´N·|²æÂ÷ until
µ²ºc , ¨Ã¥BÅã¥Ü¨º­Ó¤H¤w¸gñ¤J¨t²Î .
§Ú­Ì¥i¥H§â³o­Ó Shell Script ¥H­I´º°õ¦æ , §A·|µoı¥¦¯uªº¦³¥Î .


(4.9) for µ²ºc 


  for var in word1 word2 ..... wordn
  do
       .
       .
  done


½Ð¦U¦ìª`·N , Shell Programming ¤¤ªº for »P¤@¯ëµ{¦¡»y¨¥ªº for
¦³«Ü¤jªº¤£¦P . §Ú­Ì¯à«ü©wªº¥]§t var , word1 , word2 ......
( word1 word2 .... wordn ¬°¤F¤è«K , §Ú§â¥¦ºÙ¬° word list )
¥H¤Î do »P done ¤§¶¡©Ò°µªº¨Æ . §Ú­ÌÁÙ¬O¥ý¬Ý¤@­Ó¨Ò¤l :


  #!/bin/sh 

  for i in 1 2 peter bob
  do
    echo "$i"
  done


°õ¦æµ²ªG :

  % fortest
  1
  2
  peter
  bob


§Ú­Ì©Ò¬Ý¨ìªº¬O , for ¨C°õ¦æ¤@¦¸ , ´N§â«á­±ªº¸ê®Æ«ü©wµ¹ var
¹³²Ä¤@¦¸°õ¦æ®É , 1 ³Q«ü©wµ¹ i , ²Ä¤G¦¸°õ¦æ®É , 2 ³Q«ü©wµ¹ i
²Ä¤T¦¸°õ¦æ®É , peter ³Q«ü©wµ¹ i , ²Ä¥|¦¸°õ¦æ®É , bob ³Q«ü©w
µ¹ i . ¦n¤F , ²{¦b§Ú­Ì§âµJÂI©ñ¦b word1 word2 ..... wordn ¤W
¥¦­Ì¬O¤£¬O¦³¤°»òÅܤƩO ? ¦b³o¸Ì , §Ú­n´£¥X´XºØ :


(I) ¨Ï¥Î©R¥O»s§@¥X word list

¦U¦ìÁÙ°O±o (3.5.3) ¤¤ mail µ¹«Ü¦h¤Hªº¨Ò¤l¶Ü ? 

  mail `cat member` < letter

§Ú­Ìª¾¹D , `cat member` ·|³Q´«¦¨¹³ jhhsu veronica peter bob 
ªº«¬¦¡ , ¨º¤£¬O­è¦n²Å¦X§Ú­Ìªº word list ¶Ü ? ¦]¦¹ , §Ú§â
¥¦¥H for ¨Ó§ï¼g :

  
  #!/bin/sh

  for person in `cat member`
  do
    mail $person < letter
  done
 

©Ò¥H¦U¦ì¥i¥H¬Ý¨ì , ¥u­n©R¥O°õ¦æµ²ªG·|²£¥Í word list , ¨º©È
¬O¥u¦³¤@­Ó word ¤]¦n , §Ú­Ì³£¥i¥H§â¥¦©ñ¦b in ªº«á­± , ¨Ã¥H
¤Ï³æ¤Þ¸¹¬A°_¨Ó . ¦b³o³¡¥÷ , ¹B¥Îªº¥©§®´N±o¬Ý§A¹ï©R¥Oªº¼ô±x
µ{«×¦Ó©w¤F , ¨Ã¥B¥i¥H¦A¥ÎºÞ½u²Õ¦X¥X§ó½ÆÂøªº©R¥O .
  

(II) §â°Ñ¼Æ·í¦¨ word list

¦b³o¸Ì­n¤¶²Ð¤@­Ó·sªº²Å¸¹ $@ , ¥¦»P $* Ãþ¦ü , ³£¬O¥Nªí©Ò¦³
ªº°Ñ¼Æ . ¤£¦Pªº¬O , $@ ·|§â¨C­Ó°Ñ¼Æ¥[¤WÂù¤Þ¸¹ . ©Ò¥H , §Ú
­Ì¥i¥H·Q¦¨ : $* ¥Nªí $1 $2 $3 .... ¦Ó $@ ¥Nªí "$1" "$2" "$3"
¤ñ¸û¤U­±¨â­Ó Shell Script :

                           | 
  #!/bin/sh                |        #!/bin/sh  
                           |
  for arg in $*            |        for arg in $@
  do                       |        do
    echo $arg              |          echo $arg
  done                     |        done
                           |
                           |
°õ¦æµ²ªG :                 |  °õ¦æµ²ªG : 
                           |
  % arg1 'a b' c           |    % arg2 'a b' c
  a                        |    a b
  b                        |    c
  c                        |


¤U­±ÁÙ¬O¥H±H«H°µ¨Ò¤l , ¦ý¦¹®É , ¦¬«H¤H§Ú­Ì¤£¼g¦bÀɮפ¤ , ¦Ó
ª½±µ¥Ñ©R¥O¦C¤¤ªº°Ñ¼Æ«ü©w :

  #!/bin/sh

  for person in $@
  do
    mail $person < letter
  done




Chap 5 -- Ū¨ú¸ê®Æ , ©I¥s¨ç¼Æ , °»¿ù

(5.1) read ¥Î¨ÓŪ¨ú¸ê®Æ

ºI¦Ü¥Ø«e¬°¤î , §Ú­ÌÅܼƪº¨Ó·½¦³¨â­Ó¦a¤è , ¤@¬O¨Ó¦Û°Ñ¼Æ , ¤@¬O
¨Ó¦Ûª½±µ¦b Shell Script ¤¤ª½±µ«ü©w . ¨ºÅܼƯण¯à¦b Shell 
Script °õ¦æ®É¤~Ū¨ú©O ? ¦¹®É´N­n¥Î read . read ªº®æ¦¡¬° :

  read variable

¥¦·|§âŪ¨ú¨ìªº¸ê®Æ©ñ¨ì variable ¤¤ . Á|¤@­Ó¤p¤pªº¨Ò¤l :


  #!/bin/sh

  echo -n 'Input number1 --> '
  read number1
  echo -n 'Input number2 --> '
  read number2

  echo `expr $number1 + $number2`
 

°õ¦æµ²ªG :


  % plus3
  Input number1 --> 5
  Input number2 --> 10
  15


¤W­±³o­Ó Shell Script ¥i¥H¥Ñ¨Ï¥ÎªÌ¥ô·N¿é¤J¨â­ÓÅÜ¼Æ , read
¤À§O§â¥¦­Ì©ñ¨ì number1 ¤Î number2 , ³Ì«á¦A§â number1 ¤Î
number2 ¥[°_¨Ó .
§Ú¦AÁ|¤@­Ó¨Ò¤l , §A¥i¥H¥Î read ¨Ó»s°µ¥XÃþ¦ü¿ï³æªºªF¦è :

      
  #!/bin/sh

  cat << End_of_menu

  ------------------------
  |                      |
  | You have 4 choice :  |
  |                      |
  | 1. plus  +           | 
  |                      | 
  | 2. minus  -          |
  |                      |
  | 3. multiple  *       |
  |                      |
  | 4. divide  /         |
  |                      |
  ------------------------

  End_of_menu

  echo -n 'Input your choice --> '
  read choice
  echo -n 'Input number1 -->'
  read number1
  echo -n 'Input number2 -->'
  read number2

  case $choice in
  1) echo `expr $number1 + $number2`;;
  2) echo `expr $number1 - $number2`;;
  3) echo `expr $number1 \* $number2`;;
  4) echo `expr $number1 / $number2`;;
  esac
  

¤W­±¬O¤@­Ó¿ï³æ¦¡ªº­pºâ¾÷ , ¥¦¥i¥H¿ï¾Ü§A­n§@ªº¹Bºâ , ¨ÃŪ¨ú
¨â­Ó¼Æ¦r¨Ó·í¹Bºâ¤¸ . ³o­Ó Shell Script ¿Ä¦X¤F§Ú­Ì¦b (2.5.2)
¤¤ªº cat << c ªºÆ[©À , ¯S§O­nª`·Nªº¬O , ¦b¤W­±ªº Shell Script
¤¤ , End_of_menu ¤@©w­n¿W¥ß¤@¦C , ¦Ó¥B¤@©w­n¦b¨º¦Cªº¶}ÀY .
±µµÛ , read choice §â§Ú­Ì­n°µªº¥|«h¹BºâºØÃþ ( 1 ¥Nªí¥[ , 2
¥Nªí´î , 3 ¥Nªí­¼ , 4 ¥Nªí°£ ) ©ñ¦b choice ¤¤ . ¦A¨Ó , Ū¤J
¨â­Ó¼Æ¦r¨Ó·í¹Bºâ¤¸ . ³Ì«á , ¶i¤J¤@­Ó case ªºµ²ºc . ¦b case
¤¤®Ú¾Ú choice ªº­È¨Ó°µ¤£¦Pªº¹Bºâ .


(5.2) ©I¥s¨ç¼Æ

¦bµ{¦¡¼g§@ªº«¬ºA¤W , µ²ºc©Êªºµ{¦¡ªº½T¤ñÂø¶ÃµL³¹ªºµ{¦¡­n¦n .
¦]¦¹ , ¨Ï¥Î¨ç¼ÆÅܦ¨¤F¤@¶µ¤£¥i©Î¯Êªº§Þ¥© , ¦Ó¥B¥i¥H§â¾ã­Ó
µ{¦¡©î¦¨¼Æ­Ó³¡¥÷¤À§O¼g§@ . ¦b Bourne Shell Programming 
¤¤ , §Ú­Ì¤]¥i¥H¨Ï¥Î¨ç¼Æ , ¨ç¼Æªº®æ¦¡¦p¤U :


  function_name()
  {
    command
    command
      .
      .
  }


§Ú­Ì§â¤W­±¥[´î­¼°£ªº¨Ò¤l¥H¨ç¼Æªº§Î¦¡¦A¼g¤@¹M :

  #!/bin/sh

  plus()
  {
    echo 'Plus Function'
    echo `expr $number1 + $number2`
  }

  minus()
  {
    echo 'Minus Function'
    echo `expr $number1 - $number2`
  }

  multi()
  {
    echo 'Multiple Function'
    echo `expr $number1 \* $number2`
  }

  div()
  {
    echo 'Divide Function'
    echo `expr $number1 / $number2`
  }

  main_select()
  {
    cat << '  End_of_menu'

    ------------------------
    |                      |
    | You have 4 choice :  |
    |                      |
    | 1. plus  +           |
    |                      |
    | 2. minus  -          |
    |                      |
    | 3. multiple  *       |
    |                      |
    | 4. divide  /         |
    |                      |
    ------------------------

    End_of_menu


    echo -n 'Input your choice --> '
    read choice
    echo -n 'Input number1 -->'
    read number1
    echo -n 'Input number2 -->'
    read number2

    case $choice in
    1)plus;;
    2)minus;;
    3)multi;;
    4)div;;
    *)echo 'Invalid choice'
      exit;;
    esac
  }

  main_select                       # µ{¦¡±q³o¸Ì¶}©l
 

¨Ï¥Î³oºØ¨ç¼Æ¼g§@¦³´XÂI­nª`·N : 

(I) ¤U­±ªº±¡§Î , ¥ªÃä¥i¥H¥¿½Tªº°õ¦æ , ¥kÃä«o¤£¦æ

    a_func()                |      a_func  
    {                       |
      b_func                |      a_func()
    }                       |      {
                            |        b_func 
    b_func()                |      }
    {                       |
                            |      b_func()
    }                       |      {
                            |
    a_func                  |      }


(II) ©R¥O¦C¤U°Ñ¼Æªº¶Ç»¼¥²¶·¥ý§â³o¨Ç°Ñ¼Æ«ü©wµ¹¥t¤@­ÓÅܼÆ
     µM«á¤~¯à¥¿½Tªº¤u§@ . ¬Ý¤U­±ªº¨Ò¤l :

     #!/bin/sh

     main()
    {
      echo $1                # error ?
      echo $2                # error ?
    }

    main

    ¤W­±ªº¨Ò¤l¬Ý°_¨Ó¨S¿ù , ¦ý¹ê»Ú¤W¨Ã¤£¯à work , §A¥i¯à­n
    §ï¦¨¤U­±ªº¼Ë¤l :

    #!/bin/sh

    main()
    {
      echo $number1
      echo $number2
    }

    number1=$1
    number2=$2
    main
    

(5.3) Shell Script ªº°»¿ù

¨Ï¥Î sh -x shell_script_name  ¥i¥H¹ï¤@­Ó Shell Script °µ
°»¿ùªº°Ê§@ . °²¦p§Aªº Shell Script ¤£¯à¥¿±`ªº°õ¦æ , ©ÎªÌ¬O
°õ¦æªºµ²ªG¤£²Å¦X§A©Ò¹w®Æªº . ¥X¿ùªº¦a¤è¥i¯à¬°¤U¦C´X¶µ¤§¤@ :

(I) ½ÐÀˬd Shell Script ¬O§_¦³¥iŪ¤Î¥i°õ¦æÅv­­ .

(II) ½Ðª`·N , Shell Programming Language ¤£¬O§¹¥þ¦Û¥Ñ»yªk
     ´N¹³ if [ "$#" -ne 1 ]  ´N¤£¯à¼g¦¨ if ["$#" -ne 1]
     ¤]¤£¯à¼g¦¨ if[ "$#" -ne 1 ] , ³o¨Ç­n¯S§Oª`·N . °²¦p
     °õ¦æ®É¦³¿ù»~°T®§ , §A­n¸Ô¥[Àˬdµ{¦¡ªº»yªkµ²ºc . ¸Ó
     ªÅ®æªº¦a¤è­n¦³ªÅ®æ .

(III) ­n¤F¸Ñ , $variable ¤~¬OÅܼƪº¤º®e , §A«Ü¦³¥i¯à§â
      variable ·í¦¨Åܼƪº¤º®e .

(IV) ÁÙ¦³ , §A¥i¯à«÷¿ù¦r¤F , ³o¬O«Ü±`¨£ªº .

(V) ¦³¨Ç±¡ªp¤U , ÅܼƤ¤ªº¤º®e¨Ã¤£¬O§A¹w´Áªº , ¥H­P³y¦¨
    ¿ù»~ . ¦¹®É§A¥i¥H¦bµ{¦¡¤¤¥iºÃªº¦a¤è¾A®Éªº¥[¤W¤@¨Ç
    °»¿ùÂI , §â³o¨ÇÅܼƤº®eÅã¥Ü¥X¨Ó¬Ý¬Ý .

(V) ³Ì«á , ÅÞ¿è¤Wªº¿ù»~¬O«ÜÃø§ä¨ìªº , §A¥i¯à¤]­nª`·N .



ªþ¿ý¤@ : Shell Summary
-------------------------------------------------------------------


## Åܼƪº«ü©w :

variable=value              

¦¹®É , variable ¬O³Q·í¦¨¦r¦ê¬Ý«Ý .

¦p : NNTPSERVER=news.csie.nctu.edu.tw 

     ¨ä¤¤ , NNTPSERVER ¬O variable ; news.csie.nctu.edu.tw ¬O value


## Åܼƪº¤º®e :

$variable


## ¹ï shell script §@°»¿ù°õ¦æªº°Ê§@ :

sh -x [your_shell_script]

¦p : sh -x search_string 

     ¨ä¤¤ , search_string ³o­Ó shell script
     ¥²»Ý¦³ read ¤Î execute ªºÅv­­


## shell script ¤¤ªº¯S®í²Å¸¹ :

$# °Ñ¼Æ­Ó¼Æ
$n ²Ä n ­Ó°Ñ¼Æ
$* ©Ò¦³ªº°Ñ¼Æ
$@ »P $* ¤@¼Ë , °£¤F¨C­Ó°Ñ¼Æ³£¥[¤W "  "
$? ¤W¤@­Ó©R¥O¶Ç¦^ªº­È
$$ ¥Ø«e¦¹ shell ªº pid   // ·í§A¦b script ¤¤­n creat ¤@­ÓÀÉ , ¦ý¤£§Æ±æ
                         // ³o­ÓÀɮצW¬O©T©w®É ( ¤×¨ä¬O¦³¨â­Ó¤H¦P®É¨Ï¥Î
                         // ³o­Ó shell script ) Á`¤£¯à creat ªºÀɦW¨ú¦¨
                         // ¤@¼Ë , ³o®É­Ô , $$ ´N¥i¬£¤W¥Î³õ


## ¹ï¾ã¼Æ§@¤ñ¸ûªº¹Bºâ¤l :

int1 -eq int2            //    int1 = int2
int1 -ge int2            //    int1 >= int2
int1 -gt int2            //    int1 > int2
int1 -le int2            //    int1 <= int2
int1 -lt int2            //    int1 < int2
int1 -ne int2            //    int1 != int2


## ¹ï¦r¦ê§@¤ñ¸ûªº¹Bºâ¤l :

string1 =string2
string1 !=string2
string               // string is not null
-n string            // string is not null
-z string            // string is null


## ¹ïÀÉ®×§@´ú¸Õªº¹Bºâ¤l :

-d file              // if file is a directory
-f file              // if file is a ordinary file
-r file              // if file is readonly 
-s file              // if file has nonzore length
-w file              // if file is writeable
-x file              // if file is excuteable 


## ÅÞ¿è¹Bºâ¤l :

!    // negation
-a   // logic AND
-o   // logic OR


## Ū¨ú¨Ï¥ÎªÌ¿é¤Jªº¸ê®Æ :

read variable


## °j°é , ¤ÏÂаõ¦æ :


(1) while :
    
    while test_command
    do
      command
      command
        .
        .
    done


(2) until :

    until test_command
    do
      command
      command
        .
        .
    done  

         
(3) for :

    for var in word1 word2 ..... wordn
    do
      command
      command
        .
        .
    done


## ¿ï¾Ü©Ê±ø¥ó :


(1) case :

    case value in
    pattern_1) command
               command
                 . 
                 .
               command;;
    pattern_2) command
                 .
                 .
               command;;
      ...

    pattern_n) command
                 .
                 .
               command;;
    esac        


(2) if :

    «¬¦¡¤@ :
    

    if test_command
    then
      command
      command
        .
        .
    fi          


    «¬¦¡¤G :


    if test_command
    then
      command
      command
        .
        .
    else
      command
      command
    fi
    

    «¬¦¡¤T :


    if test_command1
    then
      command
        . 
        .
    elif test_command2
    then
      command
        .
        .
    elif test_command3
    then
      command
        .
        .
    else
      command
        .
        .
    fi  
  

## special two command logic :

cmd1 && cmd2    // cmd2 is excuted when cmd1 is true (return 0)
cmd1 || cmd2    // cmd2 is excuted when cmd1 is false



Example :

---------------------- ²Ä¤@­Ó°Ñ¼Æ»P¦r¦ê¤ñ¸û -----------------

#!/bin/sh

echo $1

if [ "$1" = 'y' ]
then
  echo 'Yeah! You are right!'
fi

if [ "$1" = 'n' ]
then
  echo 'Ooop! You are wrong!'
fi


°õ¦æµ²ªG :

%scom y
y
Yeah! You are right!
%scom n
n
Ooop! You are wrong!


---------------------- Del_From_Inode -----------------------


#!/bin/sh

if [ "$#" -ne 1 ]
then
  echo 'Usage : del_from_inode '
  exit 1
fi

find . -inum "$1" -ok rm '{}' \;


---------------------- ¦r¦ê¤ñ¸ûªº¨Ò¤l -----------------------


#!/bin/sh

if [ "$#" -lt 1 ]
then
  echo 'again!'
  exit 1
fi

if [ "$1" = 'lala' ]
then
  echo 'lala is haha'
else
  echo 'unknown!!!'
fi


°õ¦æµ²ªG :

%para3
again!
%para3 lala
lala is haha
%para3 dada
unknown!!!


--------------- ­pºâ¬Y¤@¥Ø¿ý©³¤U¦³¦h¤ÖÀɮשΥؿý ------------

#!/bin/sh

if [ "$#" -ne 2 ]
then
  echo 'Usage : count_report  '
  exit
fi

case "$2" in

 f)

  file=0
  for f in `find $1 -depth 1 -type f`
  do
    file=`expr ${file} + 1`
  done
  echo "Total files is ${file}"
  ;;


 d)

  directory=0
  for f in `find $1 -depth 1 -type d`
  do
    directory=`expr ${directory} + 1`
  done
  directory=`expr ${directory} - 1`
  echo "Total directories is ${directory}"
  ;;

esac

---------- ¤@­Ó¤ñ¸ûªøªº¨Ò¤l ( ¥i°õ¦æ¦ý¥\¯à¨Ã¤£§¹¾ã :p ) -----------

#!/bin/sh

COMPILER=cc

pause_until_enter()
{
  echo 
  echo 'Press enter to continue ......'
  read enter_key
}

exit_shell_script()
{
  sleep 1
  clear
  exit
}

error_handle()
{
  if [ $? -ne 0 ]
  then
    echo "***** Some error occur , Please check ~/$$.err *****"
    echo -n "Display ~/$$.err now ? (y/n) --> "
    read error_select
    if [ $error_select = 'y' ]
    then
      cat ~/$$.err | more
      pause_until_enter
      case $main_select in
      1) modify_now;;
      esac
    fi
  fi
}  

modify_now()
{
  echo -n 'Modify your source code now ? (y/n) --> '
  read modify_now
  if [ $modify_now = 'y' ]
  then
    $EDITOR $source_code_name
  fi
}

read_source_code_name()
{
  echo -n 'Enter source codes name --> '
  read source_code_name
}

read_out_exe_file_name()
{
  echo -n 'Input executable filename , Press enter for a.out --> '
  read out_exe_file_name
 
  if [ "$out_exe_file_name" = ''  ]
  then
    echo 'Use default name : a.out'
  fi
}

read_library_name()
{
  echo -n 'Enter your library name --> '
  read library_name
}

read_obj_name()
{
  echo -n 'Enter your obj name --> '
  read obj_name
}

build_exe()
{
  read_source_code_name
  read_out_exe_file_name
  echo -n 'Link library? (y/n) --> '
  read link_lib_choice
  
  if [ "$link_lib_choice" = 'y' ]
  then
    echo -n 'Enter library name --> '
    read lib_name
  else
    lib_name=
  fi
  
  echo -n 'Creat symbol table for debugger? (y/n) --> '
  read debug_choice 

  if [ "$debug_choice" = 'y' ]
  then
    $COMPILER -g -o ${outfile}.out $source_code_name $lib_name > ~/$$.err 2>&1
    error_handle 
  else
    $COMPILER -o ${outfile}.out $source_code_name $lib_name > ~/$$.err 2>&1
    error_handle
  fi 
}  

compile_only()
{
  read_source_code_name
  $COMPILER -c $source_code_name
}  

list_lib_content()
{
  read_library_name
  ar t $library_name | more
  pause_until_enter
}

add_obj_into_lib()
{
  read_library_name
  read_obj_name

  if [ -f $library_name ]
  then
    ar q $library_name $obj_name
  fi
}  

read_config()
{
  sed -n 1,1p comenv.conf
  pause_until_enter
}


main_menu()
{
  clear
  cat << '  main_menu_end'

  Main Menu
------------------------------

  1. Compile Source Code

  2. Library Maintain

  3. Execute File  

  4. Configuration

  5. Exit

  main_menu_end

  echo -n 'Enter your choice --> '
  read main_select

  case $main_select in
  0);;
  1) compile_menu;;
  2) maintain_menu;;
  3) execute_menu;;
  4) config_menu;;
  5) exit_shell_script;;
  *) main_menu;;
  esac
}

compile_menu()
{
  clear
  cat << '  compile_menu_end'

  Compile Menu
------------------------------
 
  1. Build Excutable File

  2. Compile Only

  3. Back To Main Menu

  4. Exit

  compile_menu_end

  echo -n 'Enter your choice --> '
  read compile_select

  case $compile_select in
  1) build_exe;;
  2) compile_only;;
  3) main_menu;;
  4) exit_shell_script;;
  *) compile_menu;;
  esac
}

maintain_menu()
{
  clear
  cat << '  maintain_menu_end'

  Library Maintain
------------------------------

  1. List library content  
  
  2. Add objfile into library  

  3. Remove objfile from library

  4. Back to Main Menu

  5. Exit

  maintain_menu_end

  echo -n 'Enter your choice --> '
  read maintain_select

  case $maintain_select in
  1) list_lib_content;;
  2) add_obj_into_lib;;
  3) remove_obj_from_lib;;
  4) main_menu;;
  5) exit_shell_script;;
  esac
} 

execute_menu()
{
  echo -n 'Enter execute file name --> '
  read execute_file_name
  $execute_file_name
  pause_until_enter
}

config_menu()
{
  clear
  cat << '  config_menu_end'

  Configuration Menu
------------------------------

  1.View Configuration File
  
  2.Change Configuration

  config_menu_end

  echo -n 'Enter your choice --> '
  read config_select

  case $config_select in
  1) read_config;;
  2);;
  esac
}

while test 0
do
  main_menu
done




ªþ¿ý¤G : grep ²¤¶
-------------------------------------------------------------------

grep -- ±qÀɮרC¤@¦C¤¤§ä¥X¯S©wªº¼ËªO®æ¦¡

grep [options] regular_expressions [files]

  options :

  -b  ¦L¥X²Å¦Xªº¨º¤@¦C¬O¦b¾ã­ÓÀɮפ¤ªº²Ä´X­Ó byte .
 
  -c  ¥u¦L¥X¦@¦³¦h¤Ö¦C²Å¦X regular_expressions .

  -h  ·í§Ú­Ì±q³\¦hÀɮפ¤§ä´M¾A¦Xªº±ø¥ó®É , °²¦p§ä¨ì¤F , ´N·|¦L¥X¬O¦b
      ¨º­ÓÀɮפ¤§ä¨ìªº . µM¦Ó , °²¦p§Ú­Ì¥[¤F -h ³o­Ó option . ¨º»ò ,
      ¿é¥Xªºµ²ªG´N¤£·|§i¶D§Ú­Ì , ¬O¦b¨º­ÓÀɮפ¤§ä¨ì²Å¦Xªº¼ËªO .

  -i  ©¿²¤ regular_expressions ¤¤¤j¤p¼gªº®t§O .              
 
  -l  ¥u¦L¥X¦b¨º­ÓÀɮפ¤¦³§ä¨ì , ¦Ó¤£¦L¥XÀɮפ¤²Å¦Xªº¼Ëª© .

  -n  ¦L¥X²Å¦Xªº¼ËªO¬O¦bÀɮפ¤ªº²Ä´X¦C . 

  -s  §í¨î¿ù»~°T®§ , ¹³¤£¦s¦bªºÀÉ®×°Õ , ©ÎªÌ¬O¤£¯àŪªºÀÉ®× .

  -v  ¦L¥X¤£²Å¦X regular_expressions ªº¨º¨Ç¦C .

  example :

  ±q test1 ³o­ÓÀɮפ¤ , §ä¥X§t¦³ app ªº¦C :
                      
     % grep 'app' test1

  ±q passwd ³o­ÓÀɮפ¤§ä¥X¨ì©³¦³¦h¤Ö¤H¨Ï¥Î tcsh :

     % grep -c '/bin/tcsh' /etc/passwd

  ±q¥Ø«eªº¥Ø¿ý¤U , §ä¥X¥ô¤@¦C¶}ÀY¨ã¦³ #include ªºÀÉ®× :

     % grep -l '^#include' *

  ±q test2 ³o­ÓÀɮפ¤ , §ä¥X¨º¨Ç¤£§t class ªº¦C :

     % grep -v 'class' test2

  ¦C¥X¤£§t pattern ªºÀÉ®× :

     % grep -c pattern files | grep :0 | cut -d":" -f1  



regular expressions  ¥¿³Wªí¥Ü¦¡
-------------------------------------------------------------
  
 . ¥i²Å¦X¥ô·N¤@­Ó¦r¤¸ ( ¥]§tªÅ¥Õ¦r¤¸ )

 [] ¥i²Å¦X¤è¬A©·¤¤¦CÁ|ªº¦r¤¸

 [^ regular_expressions] ¤£²Å¦X regular_expression 

 * »P¹s­Ó©Î§ó¦h­Ó * «eªº¦r¤¸§k¦X

 .* ²Å¦X¹s©Î§ó¦h­Ó¦r¤¸

 ^regular_expressions  ²Å¦X¦b¨C¤@¦C¶}ÀYªº regular_expressions


¤U­±¬O regular expressions ªº¤@¨Ç¨Ò¤l


  regular expressions     match      
---------------------------------------------------------------

  ring                    ring , spring , ringing , stringing
                          ^^^^     ^^^^   ^^^^        ^^^^  
  
  .alk                    walk , talk ,  alk , skialk
                          ^^^^   ^^^^   ^^^^     ^^^^

 [bB]ill                  bill , Bill , biller
                          ^^^^   ^^^^   ^^^^

 number[5-9]              number7 , number90
                          ^^^^^^^   ^^^^^^^

 [^ a-z]                  a21 , c1 , 123
                           ^^    ^   ^^^
 
 ab*                      acc , ab , abb , abc
                          ^^^   ^^   ^^^   ^^^

 ab.*                     ab , abb , abbc
                          ^^   ^^^   ^^^^

 ^T                       ²Å¦X¥H T ¬°¶}ÀYªº¨C¤@¦C ; This line
                                                    ^

°Ñ¦Ò¸ê®Æ :
----------------------------------------------------------------

Shell :

1.  Title: Unix Shell Programming
    Authors: Stephen Kochan and Patrick Wood
    Publisher: Hayden
    Edition: 1990
    ISBN: 0-672-48448-X

2.  Title: The Unix C Shell Field Guide
    Authors: Gail Anderson and Paul Anderson
    Publisher: Prentice Hall
    Edition: 1986
    ISBN: 0-13-937468-X


General Unix Texts :

1.  Title: Unix Power Tools
    Authors: Jerry Peek, Tim O'Reilly and Mike Loukides (and other
    Publisher: O'Reilly / Bantam                       contributors)
    Edition: 1993
    ISBN: 0-553-35402-7


2.  Title: Unix in a Nutshell
    Authors: Daniel Gilly and O'Reilly staff
    Publisher: O'Reilly
    Edition: 2nd ed. 1992 (for System V and Solaris 2)
    ISBN: 1-56592-001-5


Programming :

1.  Title: Advanced Programming in The Unix Environment
    Author: Richard Stevens
    Publisher: Addison-Wesley
    Edition: 1992
    ISBN: 0-201-56317-7


Other :

1. UNIX FAQ



¦p¦óÁpµ¸§@ªÌ :

  ¦a§} : ¥æ³q¤j¾Ç¤QªÙ315R 

  E-mail : jhhsu@csie.nctu.edu.tw 
           u8217017@cc.nctu.edu.tw

°²¦p±zµo²{¤å³¹¤¤¦³¥ô¦ó¿ù»~¤§³B , ½Ð³qª¾§@ªÌ .
ÁÙ¦³ , ŪªÌªº«ØÄ³»P§åµû¤]«D±`ªºÅwªï .