bash ½©¿¡´Â µð¹ö°Åµµ ¾ø°í µð¹ö±×¿ë ¸í·É¾îµîµµ ¾ø½À´Ï´Ù. ¹®¹ý ¿¡·¯(syntax error)³ª ½ºÅ©¸³Æ®°¡ ¹ñ¾î ³»´Â ¾ÏÈ£°°Àº ¿¡·¯ ¸Þ¼¼ÁöµéÀº ºñ±â´ÉÀûÀÎ ½ºÅ©¸³Æ®¸¦ µð¹ö±ëÇϴµ¥ ¾Æ¹« µµ¿òµµ ÁÖÁö ¸ø ÇÕ´Ï´Ù.
½ºÅ©¸³Æ® Ãâ·Â:
./test23: [37: command not found |
¹¹°¡ À߸ø µÈ°É±î¿ä?(ÈùÆ®: if ´ÙÀ½¿¡)
¸¸¾à¿¡ ½ºÅ©¸³Æ®°¡ ½ÇÇàÀº µÆÁö¸¸ »ý°¢Çß´ø ´ë·Î µ¿ÀÛÇÏÁö ¾Ê´Â´Ù¸é ¾î¶»°Ô ÇÒ±î¿ä? ÀÌ·± °ÍµéÀ» ¸ðµÎ ·ÎÁ÷ ¿¡·¯¶ó°í ÇÕ´Ï´Ù.
예 3-98. test24, ´Ù¸¥ ¹ö±× ÀÖ´Â ½ºÅ©¸³Æ®
#!/bin/bash # ÇöÀç µð·ºÅ丮¿¡¼ ÆÄÀÏ À̸§¿¡ ºó ÄÀÌ µé¾î°£ ¸ðµç ÆÄÀϵéÀ» # Áö¿ì·Á°í Çϴµ¥, ¾È µË´Ï´Ù. ¿Ö ±×·²±î¿ä? badname=`ls | grep ' '` # echo "$badname" rm "$badname" exit 0 |
예 3-98¿¡¼ ¹¹°¡ À߸ø µÆ´ÂÁö ¾Ë¾Æº¸·Á¸é echo "$badname"°¡ µé¾î ÀÖ´Â ÁÙÀÇ ÁÖ¼®À» Ç®¾î º¸¼¼¿ä. echo ¹®Àº ¿©·¯ºÐÀÌ ¹Ù¶ó´ø ´ë·Î ±× °ªÀ» ¾ò¾ú´ÂÁö ¾Ë°Ô ÇØ ÁÝ´Ï´Ù.
¹ö±× ÀÖ´Â ½ºÅ©¸³Æ®ÀÇ Áõ»óµéÀ» ¿ä¾àÇØ º¸¸é,
syntax error ¿¡·¯ ¸Þ¼¼Áö¸¦ ³»¸é¼ Á״´Ù.
Á×Áö´Â ¾ÊÁö¸¸ »ý°¢Çß´ø ´ë·Î µ¿ÀÛÇÏÁö ¾Ê´Â´Ù(·ÎÁ÷ ¿¡·¯(logic error)).
Á×Áöµµ ¾Ê°í ¿¹»óÇÑ ´ë·Î µ¿ÀÛÇÏÁö¸¸ ó¸®Çϱ⠱î´Ù·Î¿î ºÎÈ¿°ú(side effect)°¡ ÀÖ´Ù. (·ÎÁ÷ ÆøÅº(logic bomb)).
Á¦´ë·Î µ¹Áö ¾Ê´Â ½ºÅ©¸³Æ®¸¦ µð¹ö±ëÇÒ ¶§ ¾µ ¼ö ÀÖ´Â ¹æ¹ýÀ¸·Î´Â
¾ÆÁÖ Áß¿äÇÑ ºÎºÐ¿¡ echo ¹®À¸·Î º¯¼ö °ªÀ» Âï¾î¼ ¾î¶»°Ô µ¹¾Æ °¡°í ÀÖ´ÂÁö »ìÆì º»´Ù.
Áß¿äÇÑ ºÎºÐ¿¡ tee ÇÊÅ͸¦ ½á¼ ÇÁ·Î¼¼½º³ª µ¥ÀÌŸ È帧À» È®ÀÎÇØ º»´Ù.
-n -v -x ¿É¼ÇÀ» °Ç´Ù.
sh -n scriptname´Â ½ºÅ©¸³Æ®¸¦ µ¹¸®Áö´Â ¾Ê°í ´Ü¼øÈ÷ ¹®¹ý ¿¡·¯(syntax error)¸¸ È®ÀÎÇÕ´Ï´Ù. ½ºÅ©¸³Æ® ¾È¿¡¼ set -nÀ̳ª set -o noexecÀ» ÇØµµ °°Àº µ¿ÀÛÀ» ÇÕ´Ï´Ù. Á¶½ÉÇÒ Á¡Àº ¿©±â¿¡ °É¸®Áö ¾Ê°í ±×³É ³Ñ¾î°¡´Â ¹®¹ý ¿¡·¯µµ ÀÖ´Ù´Â °ÍÀÔ´Ï´Ù.
sh -v scriptname´Â °¢ ¸í·É¾î¸¦ ½ÇÇàÇϱâ Àü¿¡ ±× ¸í·É¾î ÀÚü¸¦ º¸¿©ÁÝ´Ï´Ù(echo). ½ºÅ©¸³Æ® ¾È¿¡¼ set -vÀ̳ª set -o verbose¸¦ ÇØµµ °°Àº µ¿ÀÛÀ» ÇÕ´Ï´Ù.
sh -x scriptname´Â °¢ ¸í·É¾îÀÇ °á°ú¸¦ °£´ÜÇÑ ÇüÅ·Πº¸¿©ÁÝ´Ï´Ù. ½ºÅ©¸³Æ® ¾È¿¡¼ set -xÀ̳ª set -o xtrace¶ó°í ÇØµµ °°Àº µ¿ÀÛÀ» ÇÕ´Ï´Ù.
½ºÅ©¸³Æ®¿¡ set -u³ª set -o nounsetÀ» ³Ö¾îµÎ¸é, ¼±¾ð ¾È µÇ°í ¾²ÀÌ´Â º¯¼ö¿¡ ´ëÇØ¼ unbound variable ¿¡·¯ ¸Þ¼¼Áö¸¦ Ãâ·ÂÇØ ÁÙ °ÍÀÔ´Ï´Ù.
Á¾·á½Ã Àâ¾ÆÃ¤±â(trapping at exit)
½ºÅ©¸³Æ®¿¡¼ exit ¸í·É¾î´Â ½ÇÁ¦·Î 0¹ø ½Ã±×³ÎÀ» ³¯¸³´Ï´Ù. Áï, ÇÁ·Î¼¼½º¸¦ Áß´ÜÇÑ´Ù´Â ¶æÀε¥ ½ºÅ©¸³Æ® ÀÚ±â ÀÚ½ÅÀ» Á¾·á½ÃŰ°Ô µË´Ï´Ù. exitÀÇ µ¿ÀÛÀ» ³¬¾Æ ä´Â °ÍÀº ¶§¶§·Î À¯¿ëÇÏ°Ô ½á¸ÔÀ» ¼ö°¡ Àִµ¥, ¿¹¸¦ µé¾î, º¯¼ö°ªÀ» °Á¦·Î "Âï°Ô" ÇѴٵ簡 Çϵµ·Ï ÇÒ ¼ö ÀÖ½À´Ï´Ù. trapÀº ½ºÅ©¸³Æ®ÀÇ Ã¹¹øÂ° ¸í·É¾î¿©¾ß ÇÕ´Ï´Ù.
½Ã±×³ÎÀ» ¹Þ¾ÒÀ» ¶§ÀÇ µ¿ÀÛÀ» ÁöÁ¤Çϴµ¥, µð¹ö±ë¿¡ À¯¿ëÇÏ°Ô ¾µ ¼ö ÀÖ½À´Ï´Ù.
참고: ½Ã±×³Î´Â °£´ÜÇÏ°Ô ¸»Çؼ ÇÁ·Î¼¼½º¿¡°Ô º¸³»´Â ¸Þ¼¼ÁöÀÔ´Ï´Ù. Ä¿³ÎÀÌ º¸³»µç ´Ù¸¥ ÇÁ·Î¼¼½º°¡ º¸³»µçÁö°£¿¡ ÁÖ¾îÁø µ¿ÀÛ(º¸ÅëÀº Á¾·áÇÏ´Â °ÍÀ̰ÚÁö¿ä)À» Ç϶ó°í ¸»ÇØ ÁÖ´Â °ÍÀÔ´Ï´Ù. ¿¹¸¦ µé¾î¼, Control-C¸¦ ´·¯¼ µ¹°í ÀÖ´Â ÇÁ·Î±×·¥¿¡°Ô »ç¿ëÀÚ ÀÎÅÍ·´Æ®(INT ½Ã±×³Î)¸¦ º¸³»´Â °Íó·³ ¸»ÀÔ´Ï´Ù.
trap 2 # ÀÎÅÍ·´Æ® ¹«½ÃÇϱâ(ƯÁ¤ ÇൿÀÌ ÁöÁ¤µÇÁö ¾Ê¾ÒÀ½) trap 'echo "Control-C °¡ ¹«½ÃµÇ¾ú½À´Ï´Ù."' 2 |
예 3-99. Á¾·á½Ã Àâ¾ÆÃ¤±â(Trapping at exit)
#!/bin/bash trap 'echo Variable Listing --- a = $a b = $b' EXIT # EXIT ´Â ½ºÅ©¸³Æ®¸¦ Á¾·áÇÒ ¶§(exit) ¹ß»ýµÇ´Â ½Ã±×³ÎÀÇ À̸§ÀÔ´Ï´Ù. a=39 b=36 exit 0 # 'exit' ¸í·É¾î¸¦ ÁÖ¼® ó¸®Çصµ °á°ú°¡ °°À½¿¡ ÁÖÀÇÇϽñ⠹ٶø´Ï´Ù. # ¿Ö³ÄÇϸé, ½ºÅ©¸³Æ® ÆÄÀÏ¿¡ µé¾î ÀÖ´Â ¸ðµç ¸í·É¾î¸¦ ´Ù ½ÇÇàÇÏ°í ³ª¸é # ¾î·µç ½ºÅ©¸³Æ®´Â Á¾·á(exit)Çϱ⠶§¹®ÀÔ´Ï´Ù. |
예 3-100. Control-C¸¦ ´©¸£°í ³ª¼ ±ú²ýÀÌ Ã»¼ÒÇϱâ
#!/bin/bash # logon.sh # ¿©·¯ºÐÀÌ ¾ÆÁ÷µµ ·Î±×ÀÎÇØ ÀÖ´ÂÁö¸¦ È®ÀÎÇØ ÁÖ´Â ¾ÆÁÖ °£´ÜÇÑ ½ºÅ©¸³Æ® TRUE=1 LOGFILE=/var/log/messages # $LOGFILE Àº ÀÐÀ» ¼ö ÀÖ¾î¾ß ÇÕ´Ï´Ù(chmod 644 /var/log/messages). TEMPFILE=temp.$$ # ÀÌ ½ºÅ©¸³Æ®ÀÇ ÇÁ·Î¼¼½º ID·Î "À¯ÀÏÇÑ" Àӽà ÆÄÀÏ À̸§À» ¸¸µì´Ï´Ù. KEYWORD=address # ·Î±×ÀÎÀ» ÇÏ°Ô µÇ¸é /var/log/messages ¿¡ "remote IP address xxx.xxx.xxx.xxx" °¡ µ¡ºÙ¿© Áý´Ï´Ù. ONLINE=22 USER_INTERRUPT=13 trap 'rm -f $TEMPFILE; exit $USER_INTERRUPT' TERM INT # ½ºÅ©¸³Æ®°¡ control-c¿¡ ÀÇÇØ¼ ÀÎÅÍ·´Æ®¸¦ ¹Þ¾ÒÀ» °æ¿ì¿¡ Àӽà ÆÄÀÏÀ» Áö¿öÁÝ´Ï´Ù. echo while [ $TRUE ] # ¹«ÇÑ ·çÇÁ do tail -1 $LOGFILE> $TEMPFILE # ½Ã½ºÅÛ ·Î±× ÆÄÀÏÀÇ ¸¶Áö¸· ÁÙÀ» Àӽà ÆÄÀÏ·Î ÀúÀåÇÕ´Ï´Ù. search=`grep $KEYWORD $TEMPFILE` # ¼º°øÀûÀÎ ·Î±×ÀÎÀ» ³ªÅ¸³»´Â "IP address" ¶õ ¹®±¸°¡ µé¾î ÀÖ´ÂÁö È®ÀÎ if [ ! -z "$search" ] # ºó ÄÀÌ µé¾î ÀÖÀ» ¼ö Àֱ⠶§¹®¿¡ Àοë(quote)À» ÇØÁÝ´Ï´Ù. then echo "On-line" rm -f $TEMPFILE # Àӽà ÆÄÀÏÀ» Áö¿ó´Ï´Ù. exit $ONLINE else echo -n "." # ¿¬¼ÓÀûÀÎ Á¡µéÀÌ ÂïÈ÷µµ·Ï -n ¿É¼ÇÀ» ½á¼ ´º¶óÀÎÀ» ¹«½ÃÇØ ÁÝ´Ï´Ù. fi sleep 1 done # ÁÖÀÇ: KEYWORD º¯¼ö¸¦ "Exit"·Î ¹Ù²Ù¸é ·Î±×ÀÎ µÈ »óÅ¿¡¼ °©ÀÛ½º·± ·Î±×¾Æ¿ôÀ» # ¾Ë¾Æ³¾ ¼ö ÀÖ½À´Ï´Ù. # ¿¬½À¹®Á¦: À§ÀÇ ÁÖÀÇ»çÇ×´ë·Î ½ºÅ©¸³Æ®¸¦ ¹Ù²Ù°í ¿¹»Ú°Ô ´Ùµë¾î º¸¼¼¿ä. exit 0 |
참고: trap '' SIGNAL (µÎ °³ÀÇ ºÙ¾î ÀÖ´Â µû¿ÈÇ¥) ´Â ½ºÅ©¸³Æ®ÀÇ ³ª¸ÓÁö µÞ ºÎºÐ¿¡¼ SIGNALÀ» ¹«½ÃÇÏ°Ô ¸¸µì´Ï´Ù. trap SIGNALÀº SIGNALÀ» ´Ù½Ã ¹ÞÀ» ¼ö ÀÖ°Ô ÇØÁÝ´Ï´Ù. ÀÌ´Â ´Þ°©Áö ¾ÊÀº ÀÎÅÍ·´Æ®·ÎºÎÅÍ ½ºÅ©¸³Æ®ÀÇ Áß¿äÇÑ ºÎºÐÀ» º¸È£ÇØ ÁÝ´Ï´Ù.
trap '' 2 # 2¹ø ½Ã±×³ÎÀº Control-CÀε¥, ¹«½ÃÇÒ°Ì´Ï´Ù. command command command trap 2 # Control-C¸¦ ´Ù½Ã ¹Þ¾ÆµéÀÌ°Ô ÇÕ´Ï´Ù. |