23.2. Áö¿ª º¯¼ö¿Í Àç±Í ÇÔ¼ö(Local Variables and Recursion)

Àç±Í ÇÔ¼ö´Â Áö¿ª º¯¼ö¸¦ ½á¼­ ±¸ÇöÇÒ ¼ö ÀÖ½À´Ï´Ù.

Áö¿ª º¯¼ö

Áö¿ªÀûÀ¸·Î ¼±¾ðµÈ º¯¼ö´Â ¼±¾ðµÈ °÷ÀÌ Æ÷ÇԵǾî ÀÖ´Â ÄÚµå ºí·°¿¡¼­¸¸ º¸ÀÌ°Ô µË´Ï´Ù. Áï, Áö¿ªÀû "Åë¿ë ¹üÀ§"(local scope)¸¦ °®½À´Ï´Ù. ÇÔ¼ö¿¡ ÀÖ¾î Áö¿ª º¯¼ö´Â ¿ÀÁ÷ ±× ÇÔ¼ö ºí·° ¾È¿¡¼­¸¸ Àǹ̸¦ °®½À´Ï´Ù.

¿¹ 23-8. Áö¿ª º¯¼öÀÇ ¿µ¿ª(Local variable visibility)

#!/bin/bash

func ()
{
  local a=23
  echo
  echo "ÇÔ¼ö ¾È¿¡¼­ a = $a"
  echo
}  

func

# ÀÌÁ¦ Áö¿ª º¯¼öÀÎ 'a'°¡ ÇÔ¼ö ¹Û¿¡¼­µµ º¸ÀÌ´ÂÁö »ìÆìº¸ÁÒ.

echo "ÇÔ¼ö ¹Û¿¡¼­ a = $a"  # ¾Æ´ÏÁÒ. 'a'´Â Àü¿ªÀûÀ¸·Î Á¢±ÙÇÒ ¼ö ¾ø½À´Ï´Ù.
echo

exit 0

Áö¿ª º¯¼ö¸¦ ¾²¸é Àç±Í ÇÔ¼ö [1] ¸¦ ¾µ¼ö ÀÖÁö¸¸, ÀÌ ¹æ¹ýÀº ÀϹÝÀûÀ¸·Î ¾µµ¥ ¾øÀÌ ¸¹Àº ÀÛ¾÷·®À» ÇÊ¿ä·Î Çϱ⠶§¹®¿¡ ½© ½ºÅ©¸³Æ®¿¡¼­´Â ¾²Áö ¾Êµµ·Ï ±ÇÀåÇÕ´Ï´Ù. [2]

¿¹ 23-9. Áö¿ª º¯¼ö¸¦ ¾´ Àç±Í ÇÔ¼ö

#!/bin/bash

#               factorial
#               ---------


# bash °¡ Àç±Í ÇÔ¼ö¸¦ Áö¿øÇÒ±î¿ä?
# À½, ±×·¸±ä ÇÏÁö¸¸ Àç±Í ÇÔ¼ö¸¦ ¾²·Á¸é ¸Ó¸®°¡ µÚÁ×¹ÚÁ× µÉ °Ì´Ï´Ù.


MAX_ARG=5
E_WRONG_ARGS=65
E_RANGE_ERR=66


if [ -z "$1" ]
then
  echo "»ç¿ë¹ý: `basename $0` number"
  exit $E_WRONG_ARGS
fi

if [ "$1" -gt $MAX_ARG ]
then
  echo "¹üÀ§ Ãʰú(ÃÖ´ë 5)."
  # Çö½ÇÀûÀ¸·Î À̰ͺ¸´Ù ´õ Å« ¹üÀ§¸¦ ¿øÇÑ´Ù¸é
  # ½ÇÁ¦ ÇÁ·Î±×·¡¹Ö ¾ð¾î·Î ´Ù½Ã ÀÛ¼ºÇϱ⠹ٶø´Ï´Ù.
  exit $E_RANGE_ERR
fi  

fact ()
{
  local number=$1
  # "number"¸¦ Áö¿ª º¯¼ö·Î ¼±¾ðÇØ ÁÖÁö ¾ÊÀ¸¸é Á¦´ë·Î µ¿ÀÛÇÏÁö ¾Ê½À´Ï´Ù.
  if [ "$number" -eq 0 ]
  then
    factorial=1    # 0 ÀÇ ÆÑÅ丮¾ó = 1.
  else
    let "decrnum = number - 1"
    fact $decrnum  # Àç±Í ÇÔ¼ö È£Ãâ.
    let "factorial = $number * $?"
  fi

  return $factorial
}

fact $1
echo "$1 ÀÇ ÆÑÅ丮¾óÀº $? ÀÔ´Ï´Ù."

exit 0

½ºÅ©¸³Æ®¿¡¼­ Àç±Í ÇÔ¼ö¸¦ ¾²´Â ¿¹Á¦ÀÎ ¿¹ A-11µµ Âü°íÇϼ¼¿ä. ½ºÅ©¸³Æ®¿¡¼­ ¾²ÀÌ´Â Àç±Í ÇÔ¼ö´Â ƯÈ÷, ¸®¼Ò½º¸¦ ¸¹ÀÌ Àâ¾Æ ¸Ô°í ¼Óµµ°¡ ´À¸®±â ¶§¹®¿¡ ÀϹÝÀûÀ¸·Î ½ºÅ©¸³Æ®¿¡´Â Àû´çÇÏÁö ¾Ê½À´Ï´Ù.

ÁÖ¼®

[1]

Herbert Mayer´Â Àç±Í ÇÔ¼ö¸¦ "¶È°°Àº ¾Ë°í¸®ÁòÀ» ´õ °£´ÜÇÏ°Ô ½á¼­ Ç¥ÇöÇÏ´Â °Í"À̶ó°í Á¤ÀÇÇß½À´Ï´Ù. Àç±Í ÇÔ¼ö¶õ ÀÚ±â ÀÚ½ÅÀ» ºÎ¸£´Â ÇÔ¼ö¸¦ ¸»ÇÕ´Ï´Ù.

[2]

Àç±Í°¡ ³Ê¹« ¸¹ÀÌ ÀϾ¸é ½ºÅ©¸³Æ®°¡ ¼¼±×ÆúÆ®(segfault)¸¦ ³»¸é¼­ Á×À» ¼öµµ ÀÖ½À´Ï´Ù.
#!/bin/bash

recursive_function ()		   
{
(( $1 < $2 )) && f $(( $1 + 1 )) $2;
#  ù¹øÂ° ¸Å°³º¯¼ö°¡ µÎ¹øÂ°º¸´Ù ÀÛÀº µ¿¾È
#+ ù¹øÂ° ¸Å°³º¯¼ö¸¦ Çϳª Áõ°¡½Ã۰í ÀÚ½ÅÀ» ´Ù½Ã ºÎ¸§.
}

recursive_function 1 50000  # 50,000 ¹øÀÇ Àç±Í°¡ ÀϾ!
# ´ç¿¬È÷ ¼¼±×ÆúÆ®°¡ ³ª°ÚÁÒ.

# Àç±Í°¡ ÀÌ·¸°Ô ¸¹ÀÌ ÀϾ¸é ½ºÅÿ¡ ÇÒ´çµÈ ¸Þ¸ð¸®¸¦ ¸ðµÎ ½á¹ö¸®±â ¶§¹®¿¡
# C ÇÁ·Î±×·¥ÀÌ¶óµµ ¼¼±×ÆúÆ®°¡ ³¯ ¼ö ÀÖ½À´Ï´Ù.

# Thanks, S.C.

exit 0  # ÀÌ ½ºÅ©¸³Æ®´Â Á¤»óÀûÀ¸·Î Á¾·áÇÏÁö ¸ø ÇÕ´Ï´Ù.