30Àå. µð¹ö±ë

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.

¹ö±× ÀÖ´Â ½ºÅ©¸³Æ®ÀÇ Áõ»óÀ» ¿ä¾àÇØ º¸¸é,

  1. syntax error ¸Þ¼¼Áö¸¦ ³»¸é¼­ Á״´Ù

  2. Á×Áö´Â ¾ÊÁö¸¸ »ý°¢Çß´ø ´ë·Î µ¿ÀÛÇÏÁö ¾Ê´Â´Ù(·ÎÁ÷ ¿¡·¯, logic error).

  3. Á×Áöµµ ¾Ê°í »ý°¢Çß´ø ´ë·Î µ¿ÀÛÇÏÁö¸¸, ó¸®Çϱ⠱î´Ù·Î¿î ºÎÈ¿°ú(side effect)°¡ ÀÖ´Ù(·ÎÁ÷ Æøź, logic bomb).

Á¦´ë·Î µ¿ÀÛÇÏÁö ¾Ê´Â ½ºÅ©¸³Æ® µð¹ö±ë¿¡ ¾µ ¼ö ÀÖ´Â ¹æ¹ýÀ¸·Î´Â

  1. Áß¿äÇÑ ºÎºÐ¿¡ echo ¹®À¸·Î º¯¼ö°ªÀ» Âï¾î¼­ ¾î¶»°Ô µ¹¾Æ°¡°í ÀÖ´ÂÁö »ìÆì º»´Ù.

  2. Áß¿äÇÑ ºÎºÐ¿¡ tee ÇÊÅ͸¦ °É¾î¼­ ÇÁ·Î¼¼½º³ª µ¥ÀÌŸ È帧À» È®ÀÎÇØ º»´Ù.

  3. -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 ¿¡·¯ ¸Þ¼¼Áö¸¦ Ãâ·ÂÇØ ÁÙ °ÍÀÔ´Ï´Ù.

  4. ½ºÅ©¸³Æ®ÀÇ ¾ÆÁÖ Áß¿äÇÑ ÁöÁ¡¿¡¼­ º¯¼ö³ª Á¶°ÇÀ» Å×½ºÆ® Çϱâ À§Çؼ­ "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
  5. exit Àâ¾Æä±â(trapping at exit).

    ½ºÅ©¸³Æ®¿¡¼­ exit¸¦ ¾²¸é ÇÁ·Î¼¼½º Á¾·á¸¦ ÀǹÌÇÏ´Â 0¹ø ½Ã±×³ÎÀ» ³¯·Á¼­ ÀÚ±â ÀÚ½ÅÀ» Á¾·á½Ãŵ´Ï´Ù. [1] exit¸¦ Àâ¾Æä¼­(trap) °­Á¦·Î º¯¼ö°ªÀ» "Ãâ·Â"Çϵµ·Ï ÇÏ´Â µîÀÇ À¯¿ëÇÑ ÀÛ¾÷À» ÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ·¸°Ô ÇÏ·Á¸é trap ¸í·É¾î°¡ ½ºÅ©¸³Æ®ÀÇ Ã¹ ¹ø° ¸í·É¾î¿©¾ß ÇÕ´Ï´Ù.

½Ã±×³Î Àâ¾Æä±â(Trapping signals)

trap

½Ã±×³ÎÀ» ¹Þ¾ÒÀ» ¶§ÀÇ µ¿ÀÛÀ» ÁöÁ¤ÇØÁִµ¥, µð¹ö±ë¿¡ À¯¿ëÇÏ°Ô ¾µ ¼ö ÀÖ½À´Ï´Ù.

Âü°í: ½Ã±×³ÎÀ̶õ °£´ÜÈ÷ ¸»Çؼ­ ÇÁ·Î¼¼½º¿¡°Ô º¸³»´Â ¸Þ¼¼ÁöÀÔ´Ï´Ù. Ä¿³ÎÀÌ º¸³»µç ´Ù¸¥ ÇÁ·Î¼¼½º°¡ º¸³»µçÁö°£¿¡ ÁÖ¾îÁø µ¿ÀÛ(º¸ÅëÀº Á¾·á)À» Ç϶ó°í ¸»ÇØ ÁÖ´Â °ÍÀÔ´Ï´Ù. ¿¹¸¦ µé¸é, ½ÇÇàÁßÀÎ ÇÁ·Î±×·¥¿¡ 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·Î ÇÒ´çµÅ ÀÖ½À´Ï´Ù.