Bash ½©¿¡´Â µð¹ö°Åµµ ¾ø°í µð¹ö±ë¿ë ¸í·É¾îµµ ¾ø½À´Ï´Ù. ½ºÅ©¸³Æ®ÀÇ ¹®¹ý ¿¡·¯³ª ¸í¹éÇÑ ¿ÀÀÚ(typos)µîÀÌ ¸¸µé¾î ³»´Â ¾ÏÈ£°°Àº ¿¡·¯ ¸Þ¼¼ÁöµéÀº Á¦´ë·Î µ¿ÀÛÇÏÁö ¾Ê´Â ½ºÅ©¸³Æ®¸¦ µð¹ö±ëÇϴµ¥ ¾Æ¹« µµ¿òµµ µÇÁö ¾Ê½À´Ï´Ù.
¿¹ 30-1. ¹ö±× ÀÖ´Â ½ºÅ©¸³Æ®
#!/bin/bash # ex74.sh # ¹ö±× ÀÖ´Â ½ºÅ©¸³Æ®. a=37 if [$a -gt 27 ] then echo $a fi exit 0 |
½ºÅ©¸³Æ®ÀÇ Ãâ·Â:
./test23: [37: command not found |
À§ÀÇ ½ºÅ©¸³Æ®´Â ¹¹°¡ À߸øµÈ °É±î¿ä?(ÈùÆ®: if ´ÙÀ½À» Àß »ìÆ캸¼¼¿ä)
½ºÅ©¸³Æ®°¡ ½ÇÇàÀº µÇÁö¸¸ »ý°¢Çß´ø´ë·Î µ¿ÀÛÇÏÁö ¾Ê´Â´Ù¸é ¾î¶»°Ô ÇÒ±î¿ä? ÀÌ·± °ÍÀ» º¸Åë, ·ÎÁ÷ ¿¡·¯¶ó°í ÇÕ´Ï´Ù.
¿¹ 30-2. test24, ¹ö±×°¡ ÀÖ´Â ´Ù¸¥ ½ºÅ©¸³Æ®
#!/bin/bash # ÇöÀç µð·ºÅ丮¿¡¼ ÆÄÀÏ À̸§¿¡ ºó ÄÀÌ µé¾î°£ ¸ðµç ÆÄÀϵéÀ» #+ Áö¿ì·Á°í Çϴµ¥ ¾È µË´Ï´Ù. ¿Ö ±×·²±î¿ä? badname=`ls | grep ' '` # echo "$badname" rm "$badname" exit 0 |
¿¹ 30-2¿¡¼ ¹¹°¡ À߸ø µÆ´ÂÁö ¾Ë¾Æº¸·Á¸é echo "$badname"ÀÌ ÀÖ´Â ÁÙÀÇ ÁÖ¼®À» Ç®¾î º¸¼¼¿ä. echo ¹®Àº ¿©·¯ºÐÀÌ ¹Ù¶ó´ø °ªÀ» Á¦´ë·Î ¾ò¾ú´ÂÁö ¾Æ´Âµ¥ À¯¿ëÇÏ°Ô ¾²ÀÔ´Ï´Ù.
ÀÌ·¸°Ô Ưº°ÇÑ °æ¿ì¿¡, rm "$badname"À̶ó°í ÇÏ¸é ¿øÇÏ´Â °á°ú¸¦ ¾òÁö ¸øÇϴµ¥ ¿Ö³ÄÇÏ¸é ¿©±â¼´Â $badnameÀÌ Äõ¿ìÆ® µÇ¸é ¾È µÇ±â ¶§¹®ÀÔ´Ï´Ù. $badnameÀ» Äõ¿ìÆ® ÇØÁÖ¸é rmÀÌ ´ÜÁö ÇÑ °³ÀÇ ÀÎÀÚ(ÇϳªÀÇ ÆÄÀϸí°ú ÀÏÄ¡)¸¦ °®µµ·Ï ÇØ ÁÝ´Ï´Ù. ºÎºÐÀûÀÎ ÇØ°áÃ¥Àº $badnameÀÇ Äõ¿ìÆ®¸¦ ¾ø¾Ö°í, $IFS°¡ ´º¶óÀÎ ¹®ÀÚ¸¸À» °®µµ·Ï IFS=$'\n'¶ó°í ÇØÁÖ¸é µË´Ï´Ù. ÇÏÁö¸¸, ´õ °£´ÜÇÏ°Ô ÇÏ·Á¸é ÀÌ·¸°Ô ÇÏ¸é µË´Ï´Ù.
# ºó ÄÀÌ µé¾î ÀÖ´Â ÆÄÀϸíÀ» Áö¿ì´Â ¾Ë¸ÂÀº ¹æ¹ý. rm *\ * rm *" "* rm *' '* # Thank you. S.C. |
¹ö±× ÀÖ´Â ½ºÅ©¸³Æ®ÀÇ Áõ»óÀ» ¿ä¾àÇØ º¸¸é,
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¶ó°í Çصµ °°Àº µ¿ÀÛÀ» ÇÕ´Ï´Ù.
-n °ú -v Ç÷¡±×¸¦ °°ÀÌ ¾²¸é ¾ÆÁÖ ÁÁ½À´Ï´Ù. sh -nv scriptname À̶ó°í ÇÏ¸é ¹®¹ý üũ¸¦ ¾ÆÁÖ ÀÚ¼¼ÇÏ°Ô ÇØÁÝ´Ï´Ù.
sh -x scriptname´Â °¢ ¸í·É¾îÀÇ °á°ú¸¦ °£´ÜÇÑ ÇüÅ·Πecho ½ÃÄÑ ÁÝ´Ï´Ù. ½ºÅ©¸³Æ® ¾È¿¡¼ set -x³ª set -o xtrace¶ó°í Çصµ ¶È°°½À´Ï´Ù.
½ºÅ©¸³Æ®¿¡ set -u³ª set -o nounsetÀ» ³Ö¾îµÎ¸é, ¼±¾ð ¾øÀÌ ¾²ÀÌ´Â º¯¼öµé¿¡ ´ëÇؼ unbound variable ¿¡·¯ ¸Þ¼¼Áö¸¦ Ãâ·ÂÇØ ÁÙ °ÍÀÔ´Ï´Ù.
½ºÅ©¸³Æ®ÀÇ ¾ÆÁÖ Áß¿äÇÑ ÁöÁ¡¿¡¼ º¯¼ö³ª Á¶°ÇÀ» Å×½ºÆ® Çϱâ À§Çؼ "assert" ÇÔ¼ö ¾²±â.(ÀÌ ¾ÆÀ̵ð¾î´Â C ¿¡¼ ºô·Á¿Ô½À´Ï´Ù.)
¿¹ 30-3. "assert"·Î Á¶°ÇÀ» Å×½ºÆ®Çϱâ
#!/bin/bash # assert.sh assert () # Á¶°ÇÀÌ °ÅÁþÀ̶ó¸é, { #+ ¿¡·¯ ¸Þ¼¼Áö¸¦ ³»°í ½ºÅ©¸³Æ®¸¦ Á¾·á. E_PARAM_ERR=98 E_ASSERT_FAILED=99 if [ -z "$2" ] # ¸Å°³º¯¼ö°¡ ¸Â°Ô ³Ñ¾î¿ÀÁö ¾Ê¾ÒÀ½. then return $E_PARAM_ERR # ±×³É ³Ñ¾î°¨. fi lineno=$2 if [ ! $1 ] then echo "Assertion failed: \"$1\"" echo "File $0, line $lineno" exit $E_ASSERT_FAILED # else # return # ½ºÅ©¸³Æ®¸¦ °è¼Ó ½ÇÇà½ÃÅ´. fi } a=5 b=4 condition="$a -lt $b" # ¿¡·¯ ¸Þ¼¼Áö¸¦ ³»°í ½ºÅ©¸³Æ®¸¦ Á¾·á. # "condition"À» ´Ù¸¥ °ÍÀ¸·Î ¹Ù²ãº¸°í #+ ¾î¶»°Ô µÇ´ÂÁö »ìÆ캸¼¼¿ä. assert "$condition" $LINENO # "assert"°¡ ½ÇÆÐÇÏÁö ¾ÊÀ» °æ¿ì¿¡¸¸ ´ÙÀ½ ºÎºÐÀÌ ½ÇÇàµË´Ï´Ù. # ´Ù¸¥ ¸í·É¾îµé. # ... exit 0 |
exit Àâ¾Æä±â(trapping at exit).
½ºÅ©¸³Æ®¿¡¼ exit¸¦ ¾²¸é ÇÁ·Î¼¼½º Á¾·á¸¦ ÀǹÌÇÏ´Â 0¹ø ½Ã±×³ÎÀ» ³¯·Á¼ ÀÚ±â ÀÚ½ÅÀ» Á¾·á½Ãŵ´Ï´Ù. [1] exit¸¦ Àâ¾Æä¼(trap) °Á¦·Î º¯¼ö°ªÀ» "Ãâ·Â"Çϵµ·Ï ÇÏ´Â µîÀÇ À¯¿ëÇÑ ÀÛ¾÷À» ÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ·¸°Ô ÇÏ·Á¸é trap ¸í·É¾î°¡ ½ºÅ©¸³Æ®ÀÇ Ã¹ ¹ø° ¸í·É¾î¿©¾ß ÇÕ´Ï´Ù.
½Ã±×³Î Àâ¾Æä±â(Trapping signals)
½Ã±×³ÎÀ» ¹Þ¾ÒÀ» ¶§ÀÇ µ¿ÀÛÀ» ÁöÁ¤ÇØÁִµ¥, µð¹ö±ë¿¡ À¯¿ëÇÏ°Ô ¾µ ¼ö ÀÖ½À´Ï´Ù.
Âü°í: ½Ã±×³ÎÀ̶õ °£´ÜÈ÷ ¸»Çؼ ÇÁ·Î¼¼½º¿¡°Ô º¸³»´Â ¸Þ¼¼ÁöÀÔ´Ï´Ù. Ä¿³ÎÀÌ º¸³»µç ´Ù¸¥ ÇÁ·Î¼¼½º°¡ º¸³»µçÁö°£¿¡ ÁÖ¾îÁø µ¿ÀÛ(º¸ÅëÀº Á¾·á)À» Ç϶ó°í ¸»ÇØ ÁÖ´Â °ÍÀÔ´Ï´Ù. ¿¹¸¦ µé¸é, ½ÇÇàÁßÀÎ ÇÁ·Î±×·¥¿¡ Control-C¸¦ ´·¯¼ »ç¿ëÀÚ ÀÎÅÍ·´Æ®(INT ½Ã±×³Î)¸¦ º¸³¾ ¼ö ÀÖ½À´Ï´Ù.
trap '' 2 # ¾Æ¹« µ¿ÀÛµµ ÁöÁ¤ÇÏÁö ¾Ê°í ´Ü¼øÈ÷ 2¹ø ÀÎÅÍ·´Æ®(Control-C)¸¦ ¹«½ÃÇÕ´Ï´Ù. trap 'echo "Control-C´Â ¹«½ÃµË´Ï´Ù."' 2 # Control-C°¡ ´·ÈÀ» ¶§ÀÇ ¸Þ¼¼Áö. |
¿¹ 30-4. exit Àâ¾Æä±â(Trapping at exit)
#!/bin/bash trap 'echo Variable Listing --- a = $a b = $b' EXIT # EXIT ´Â ½ºÅ©¸³Æ®°¡ Á¾·áµÉ ¶§ ¹ß»ýÇÏ´Â ½Ã±×³ÎÀÇ À̸§ÀÔ´Ï´Ù. a=39 b=36 exit 0 # ½ºÅ©¸³Æ® ÆÄÀÏ¿¡ µé¾î ÀÖ´Â ¸ðµç ¸í·É¾î¸¦ ´Ù ½ÇÇàÇÏ°í ³ª¸é #+ ¾î·µç ½ºÅ©¸³Æ®°¡ Á¾·áµÇ±â ¶§¹®¿¡, 'exit' ¸í·ÉÀ» ÁÖ¼® ó¸®Çصµ #+ °á°ú°¡ °°À½¿¡ ÁÖÀÇÇϱ⠹ٶø´Ï´Ù. |
¿¹ 30-5. 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" ] # ºó ÄÀÌ µé¾î ÀÖÀ» ¼ö Àֱ⠶§¹®¿¡ Äõ¿ìÆ® ÇÊ¿ä. then echo "On-line" rm -f $TEMPFILE # Àӽà ÆÄÀÏ Áö¿ì±â. exit $ONLINE else echo -n "." # ¿¬¼ÓÀûÀÎ Á¡µéÀÌ ÂïÈ÷µµ·Ï -n ¿É¼ÇÀ¸·Î #+ echo °¡ ´º¶óÀÎÀ» ¹«½ÃÇϵµ·Ï ÇÔ. fi sleep 1 done # ÁÖÀÇ: KEYWORD º¯¼ö¸¦ "Exit" ·Î ¹Ù²Ù¸é ·Î±×ÀÎ »óÅ¿¡¼ °©ÀÛ½º·´°Ô ·Î±×¾Æ¿ôÀÌ #+ µÆ´ÂÁö¸¦ È®ÀÎÇØ º¼ ¼ö ÀÖ½À´Ï´Ù. # ¿¬½À¹®Á¦: À§ÀÇ ÁÖÀÇ»çÇ×´ë·Î ½ºÅ©¸³Æ®¸¦ ¹Ù²Ù°í ¿¹»Ú°Ô ´Ùµë¾î º¸¼¼¿ä. exit 0 # Nick Drage °¡ ´Ù¸¥ ¹æ¹ýÀ» Á¦¾ÈÇØ ÁÖ¾ú½À´Ï´Ù: while true do ifconfig ppp0 | grep UP 1> /dev/null && echo "connected" && exit 0 echo -n "." # ¿¬°áµÉ ¶§±îÁö Á¡(.....)À» Ãâ·Â. sleep 2 done # ¹®Á¦Á¡: ÀÌ ½ºÅ©¸³Æ®¸¦ ³¡³»±â¿¡´Â Control-C ¸¦ ´©¸£´Â °Í¸¸À¸·Î ºÎÁ·ÇÕ´Ï´Ù. # (Á¡ÀÌ °è¼Ó ¿¡Äڵ˴ϴÙ.) # ¿¬½À¹®Á¦: ÀÌ ¹®Á¦¸¦ ÇØ°áÇØ º¸¼¼¿ä. # Stephane Chazelas µµ ´Ù¸¥ ¹æ¹ýÀ» Á¦¾ÈÇØ ÁÖ¾ú½À´Ï´Ù: CHECK_INTERVAL=1 while ! tail -1 "$LOGFILE" | grep -q "$KEYWORD" do echo -n . sleep $CHECK_INTERVAL done echo "On-line" # ¿¬½À¹®Á¦: À§¿¡¼ ¼³¸íÇÑ °¢ ¹æ¹ýµéÀÇ ÀåÁ¡°ú ´ÜÁ¡À» »ý°¢ÇØ º¸¼¼¿ä. |
Âü°í: trap ¸í·É¾î¿¡ DEBUG ÀÎÀÚ¸¦ ÁÖ¸é ½ºÅ©¸³Æ®ÀÇ ¸ðµç ¸í·É¾î ´ÙÀ½¿¡ ÁÖ¾îÁø µ¿ÀÛÀ» ¼öÇàÇϵµ·Ï ÇÕ´Ï´Ù. ÀÌ´Â º¯¼ö¸¦ ÃßÀûÇÏ´Â µîÀÇ ÀÏÀ» °¡´ÉÄÉ ÇÕ´Ï´Ù.
¿¹ 30-6. º¯¼ö ÃßÀûÇϱâ
#!/bin/bash # ¿Å±äÀÌ: ÀÌ ½ºÅ©¸³Æ®°¡ Á¦´ë·Î µ¿ÀÛÇÏ·Á¸é #!/bin/bash2 ·Î ¹Ù²ãÁà¾ß µË´Ï´Ù. trap 'echo "ÃßÀûÇÒ º¯¼ö> \$variable = \"$variable\""' DEBUG # ¸Å ¸í·É¾î¸¶´Ù $variable ÀÇ °ªÀ» ¿¡ÄÚÇØ ÁÝ´Ï´Ù. variable=29 echo "\"\$variable\" Àº $variable ·Î ÃʱâȵÊ." let "variable *= 3" echo "\"\$variable\" Àº 3ÀÌ °öÇØÁü." # "echo $variable" À» ¸¹ÀÌ ½á¼ ½ºÅ©¸³Æ®°¡ ²Ã»ç³ª¿ÍÁö°í #+ ½Ã°£À» ¸¹ÀÌ Àâ¾Æ¸Ô´Â º¹ÀâÇÑ ½ºÅ©¸³Æ®¿¡ #+ "trap 'commands' DEBUG" ¸¦ ¾²¸é ¾ÆÁÖ À¯¿ëÇÏ°ÚÁÒ. # ÀÌ »ç½ÇÀ» ¾Ë·ÁÁØ Stephane Chazelas ¿¡°Ô °¨»ç¸¦ Ç¥ÇÕ´Ï´Ù. exit 0
Âü°í: trap '' SIGNAL(µÎ °³ÀÇ ºÙ¾î ÀÖ´Â ÀÛÀº µû¿ÈÇ¥)À̶ó°í ÇÏ¸é ½ºÅ©¸³Æ® ³ª¸ÓÁö ºÎºÐ¿¡¼ SIGNALÀ» ¸ø ¾²°Ô ÇÕ´Ï´Ù. trap SIGNALÀ̶ó°í Çϸé SIGNALÀ» ´Ù½Ã ¹ÞÀ» ¼ö ÀÖ°Ô ÇØ ÁÝ´Ï´Ù. ÀÌ´Â ´Þ°©Áö ¾ÊÀº ÀÎÅÍ·´Æ®·ÎºÎÅÍ ½ºÅ©¸³Æ®ÀÇ Áß¿äÇÑ ºÎºÐÀ» º¸È£ÇØ ÁÝ´Ï´Ù.
trap '' 2 # 2¹ø ½Ã±×³ÎÀº Control-C Àε¥ ÀÌÁ¦ ¾È ¸ÔÈü´Ï´Ù. command command command trap 2 # Control-C °¡ ´Ù½Ã ¸Ô°Ô ÇÕ´Ï´Ù. |
[1] | °ü½ÀÀûÀ¸·Î 0¹ø ½Ã±×³ÎÀº exit·Î ÇÒ´çµÅ ÀÖ½À´Ï´Ù. |