3.19. ÇÔ¼ö

¾î´À Á¤µµ Á¦ÇÑÀº ÀÖÁö¸¸ bashµµ "½ÇÁ¦" ÇÁ·Î±×·¡¹Ö ¾ð¾îµéó·³ ÇÔ¼ö¸¦ Áö¿øÇÕ´Ï´Ù. ÇÔ¼ö¶õ ¼­ºê ·çƾÀ¸·Î, ¾î¶² µ¿ÀÛµéÀÌ ±¸ÇöµÈ ÄÚµå ºí·°À̰í, ƯÁ¤ÇÑ ÀÏÀ» ¼öÇàÇÏ´Â "ºí·¢ ¹Ú½º"ÀÔ´Ï´Ù. ¹Ýº¹ÀûÀÎ Äڵ尡 Àִٰųª, Á¶±×¸¸ ºÎºÐ¸¸ ¹Ù²î¸ç °è¼Ó ½ÇÇàµÇ´Â ÀÛ¾÷ÀÌ ÀÖ´Ù¸é, ÇÔ¼ö ¸¸µå´Â°ÍÀ» °í·ÁÇØº¸´Â °ÍÀÌ ÁÁ½À´Ï´Ù.

function function-name {
command...
}

ȤÀº

function-name () {
command...
}

µÎ ¹øÂ° ÇüÅ´ C ÇÁ·Î±×·¡¸Óµé¿¡°Ô ¾ÆÁÖ ¹Ý°©°Ô ´Ù°¡¿Ã °ÍÀÔ´Ï´Ù.

C ÇÔ¼ö ¹®¹ý°ú ´õ¿í ºñ½ÁÇÏ°Ô ¿ÞÂÊ Áß°ýÈ£¸¦ ´ÙÀ½ ÁÙ¿¡ ³õ¾Æµµ µË´Ï´Ù.

function-name ()
{
command...
}

ÇÔ¼ö´Â ÇÔ¼ö À̸§À» ºÒ·¯¼­ °£´ÜÇÏ°Ô ½ÇÇà½Ãų ¼ö ÀÖ½À´Ï´Ù.

ÇÔ¼ö´Â ÇÔ¼ö°¡ ºÒ¸®±â Àü¿¡ Á¤ÀǵǾî¾ß ÇÕ´Ï´Ù. ¿¹¸¦ µé¾î C¿¡¼­ ó·³ ¹Ì¸® "¼±¾ð"ÇÏ´Â ¹æ¹ýÀº ¾ø´Ù´Â °Í¿¡ ÁÖÀÇÇϽñ⠹ٶø´Ï´Ù.

예 3-80. °£´ÜÇÑ ÇÔ¼ö

#!/bin/bash

funky ()
{
  echo funky ÇÔ¼öÀÔ´Ï´Ù.
  echo funky ÇÔ¼ö¸¦ ºüÁ®³ª°©´Ï´Ù.
}

# ÁÖÀÇ: ÇÔ¼ö´Â ºÒ¸®±â Àü¿¡ Á¤ÀǵǾî ÀÖ¾î¾ß µË´Ï´Ù.

# ÀÌÁ¦ ÇÔ¼ö¸¦ ºÎ¸¨½Ã´Ù.

funky

exit 0

´õ º¹ÀâÇÑ ÇÔ¼öµéÀº ÀÎÀÚ¸¦ ¹ÞÀ» ¼öµµ ÀÖ°í Á¾·á °ªÀ» °¡Áú ¼öµµ ÀÖ½À´Ï´Ù.

function-name $arg1 $arg2

ÇÔ¼ö´Â ÇÔ¼ö ³»ºÎ¿¡¼­ ÀÎÀÚ¸¦ À§Ä¡·Î ÀνÄÇÕ´Ï´Ù(À§Ä¡ ÀÎÀÚÀΰÍó·³). Áï, $1, $2µîµîÀ¸·Î ÂüÁ¶ÇÕ´Ï´Ù.

예 3-81. ÀÎÀÚ¸¦ ¹Þ´Â ÇÔ¼ö

#!/bin/bash

func2 () {
   if [ -z $1 ]
   # ÀÎÀÚ°¡ ÀÖ´ÂÁö È®ÀÎ
   then
     echo "ÇÔ¼ö·Î ¾Æ¹« ÀÎÀÚµµ ³Ñ¾î¿ÀÁö ¾Ê¾Ò½À´Ï´Ù."
     return 0
   else
     echo "ù¹øÂ° ÀÎÀÚ´Â $1 ÀÔ´Ï´Ù."
   fi

   if [ $2 ]
   then
     echo "µÎ¹øÂ° ÀÎÀÚ´Â $2 ÀÔ´Ï´Ù."
   fi
}
   
func2
# ÀÎÀÚ ¾øÀÌ ºÎ¸£°í
echo

func2 first
# ÀÎÀÚ¸¦ Çϳª¸¸ ³Ñ±â°í
echo

func2 first second
# µÎ°³¸¦ ³Ñ°Üº¸ÁÒ
echo

exit 0

참고: ´Ù¸¥ ÇÁ·Î±×·¡¹Ö ¾ð¾îµé°ú´Â ´Ù¸£°Ô, ½© ½ºÅ©¸³Æ®´Â ÀÎÀÚ¸¦ ¿ÀÁ÷ °ª¿¡ ÀÇÇØ ÇÔ¼ö·Î ³Ñ±âµµ·Ï Á¦ÇÑÇÕ´Ï´Ù. ¸¸¾à¿¡ ½ÇÁ¦·Î´Â Æ÷ÀÎÅÍÀÎ º¯¼ö À̸§ÀÌ ³Ñ¾î°£´Ù¸é ¹®ÀÚ¿­·Î ÇØ¼®ÀÌ µÇ±â ¶§¹®¿¡ ¿ø·¡ ÀÎÀÚ¿¡ ´ëÇÑ ¿ªÂüÁ¶°¡ ºÒ°¡´ÉÇØÁý´Ï´Ù. ÇÔ¼ö´Â ÀÎÀÚ¸¦ ¹®ÀÚ ±×´ë·Î ÇØ¼®ÇÕ´Ï´Ù.

Á¾·á »óÅÂ(exit status)

ÇÔ¼ö´Â Á¾·á »óÅÂ(exit status)¶ó°í ÇÏ´Â °ªÀ» ¸®ÅÏÇÕ´Ï´Ù. Á¾·á »óÅ´ return ¹®¿¡ ÀÇÇØ¼­ ºÐ¸íÇÏ°Ô Ç¥Çö µÉ ¼ö ÀÖ°í ÇÔ¼öÀÇ ¸¶Áö¸· ¸í·É¾îÀÇ Á¾·á »óÅ·Π´ë½Å ³ªÅ¸³¾ ¼öµµ ÀÖ½À´Ï´Ù(¼º°øÀ̶ó¸é 0, ½ÇÆÐ¶ó¸é 0ÀÌ ¾Æ´Ñ °ª). $? ¸¦ ÂüÁ¶ÇÔÀ¸·Î½á Á¾·á »óŰªÀ» ¾Ë¾Æ³¾ ¼ö ÀÖ½À´Ï´Ù.

return

ÇÔ¼ö¸¦ ³¡³À´Ï´Ù. return ¹®Àº Á¤¼ö ÀÎÀÚ¸¦ ºÙ¿©¼­ ¾µ ¼öµµ ÀÖ°í, ±×³É ´Üµ¶À¸·Î ¾µ ¼öµµ Àִµ¥ ÀÎÀÚ¸¦ ºÙÀ̸é ÇÔ¼ö¸¦ ºÎ¸¥ÂÊ¿¡ ÇÔ¼öÀÇ "Á¾·á »óÅÂ"¸¦ ¾Ë·ÁÁÝ´Ï´Ù. ÀÌ Á¾·á »óÅ´ $? º¯¼ö¿¡ ÇÒ´çÀÌ µË´Ï´Ù.

예 3-82. ¼ýÀÚ¸¦ ·Î¸¶ ¼ýÀÚ·Î ¹Ù²Ù±â

#!/bin/bash

# ¾Æ¶óºñ¾Æ ¼ýÀÚ¸¦ ·Î¸¶ ¼ýÀÚ·Î ¹Ù²Ù±â
# 0 - 200 »çÀÌÀÇ ¼ýÀÚ¸¸ ó¸®ÇÕ´Ï´Ù.
# Á¶ÀâÇϱä ÇÏÁö¸¸ µ¿ÀÛÀº ÇÕ´Ï´Ù.

# ó¸® °¡´ÉÇÑ ¼ýÀÚÀÇ ¹üÀ§¸¦ ´Ã¸®°Å³ª ½ºÅ©¸³Æ®ÀÇ ±â´ÉÀ» Çâ»ó½ÃŰ´Â °ÍÀº
# µ¶ÀÚ ¿©·¯ºÐÀ» À§ÇØ ¿¬½À¹®Á¦·Î ³²°Ü ³õ½À´Ï´Ù.

# »ç¿ë¹ý: roman number-to-convert

ARG_ERR=1
OUT_OF_RANGE=200

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

num=$1
if [ $num -gt $OUT_OF_RANGE ]
then
  echo "ó¸® °¡´É ¹üÀ§ Ãʰú!"
  exit $OUT_OF_RANGE
fi  

to_roman ()
{
number=$1
factor=$2
rchar=$3
let "remainder = number - factor"
while [ $remainder -ge 0 ]
do
  echo -n $rchar
  let "number -= factor"
  let "remainder = number - factor"
done  

return $number
}

# ÁÖÀÇ: ÇÔ¼ö´Â ù¹øÂ°·Î ºÒ¸®±â Àü¿¡ ¼±¾ðµÇ¾î¾ß ÇÕ´Ï´Ù.

to_roman $num 100 C
num=$?
to_roman $num 90 LXXXX
num=$?
to_roman $num 50 L
num=$?
to_roman $num 40 XL
num=$?
to_roman $num 10 X
num=$?
to_roman $num 9 IX
num=$?
to_roman $num 5 V
num=$?
to_roman $num 4 IV
num=$?
to_roman $num 1 I

echo

exit 0
Áö¿ª º¯¼ö(local variables)

Áö¿ª(local)ÀûÀ¸·Î ¼±¾ðµÈ º¯¼ö´Â ±× º¯¼ö°¡ º¸ÀÌ´Â ÄÚµå ºí·° ¾È¿¡¼­¸¸ º¸ÀÌ°Ô µË´Ï´Ù. ÀÌ ¸»À» ½© ½ºÅ©¸³Æ®¿¡ Àû¿ë½Ã۸é, ¿ÀÁ÷ ±× ÇÔ¼ö ¾È¿¡¼­¸¸ Àǹ̸¦ °®´Â´Ù´Â ¶æÀÔ´Ï´Ù.

예 3-83. Áö¿ª º¯¼öÀÇ ¿µ¿ª(Local variable visibility)

#!/bin/bash

func ()
{
  local a=23
  echo
  echo "ÇÔ¼ö ¾ÈÀÇ a ´Â $a ÀÔ´Ï´Ù."
  echo
}  

func

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

echo "ÇÔ¼ö ¹ÛÀÇ a ´Â $a ÀÔ´Ï´Ù."
echo
# ¾È µÇÁÒ. 'a' ´Â Àü¿ªÀûÀ¸·Î º¸ÀÌÁö ¾Ê½À´Ï´Ù.

exit 0

Áö¿ª º¯¼ö´Â Àç±Í ÇÔ¼ö(ÀڱⰡ Àڱ⸦ ºÎ¸£´Â ÇÔ¼ö)¿¡¼­µµ °¡´ÉÇÏ°Ô ¾²ÀÔ´Ï´Ù. ÇÏÁö¸¸ ¾ÆÁÖ ¸¹Àº ¾µµ¥ ¾ø´Â ÀÛ¾÷·®ÀÌ ÇÊ¿äÇϰí Á¦ÇÑÀûÀ̱⠶§¹®¿¡ ½© ½ºÅ©¸³Æ®¿¡¼­´Â ¾²Áö ¾Êµµ·Ï ±ÇÇÕ´Ï´Ù.

예 3-84. Áö¿ª º¯¼ö¸¦ ¾´ Àç±Í ÇÔ¼ö ±¸Çö

#!/bin/bash

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


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


MAX_ARG=5
WRONG_ARGS=1
RANGE_ERR=2


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

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

fact ()
{
  local number=$1
  # "number"°¡ Áö¿ª º¯¼ö·Î ¼±¾ð ¾È µÈ´Ù¸é Á¦´ë·Î µÈ °á°ú¸¦ ¾òÀ» ¼ö ¾ø½À´Ï´Ù.
  if [ $number -eq 0 ]
  then
    factorial=1
  else
    let "decrnum = number - 1"
    fact $decrnum  # Àç±Í ÇÔ¼ö È£Ãâ
    let "factorial = $number * $?"
  fi

  return $factorial
}

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

exit 0