23Àå. ÇÔ¼ö

Â÷·Ê
23.1. º¹Àâ ÇÔ¼ö¿Í ÇÔ¼öÀÇ º¹À⼺(Complex Functions and Function Complexities)
23.2. Áö¿ª º¯¼ö¿Í Àç±Í ÇÔ¼ö(Local Variables and Recursion)

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

function function_name {
command...
}

ȤÀº

function_name () {
command...
}

µÎ ¹ø° ÇüÅ´ C ÇÁ·Î±×·¡¸Óµé¿¡°Ô ¾ÆÁÖ ¹Ý°¡¿ï °ÍÀÔ´Ï´Ù(¶ÇÇÑ ÀÌ ÇüÅ°¡ ´õ À̽ļº ÀÖ½À´Ï´Ù).

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

function_name ()
{
command...
}

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

¿¹ 23-1. °£´ÜÇÑ ÇÔ¼ö

#!/bin/bash

funky ()
{
  echo "funky ÇÔ¼öÀÔ´Ï´Ù."
  echo "funky ÇÔ¼ö¸¦ ºüÁ® ³ª°©´Ï´Ù."
} # ÇÔ¼ö°¡ ºÒ¸®±â Àü¿¡ ¼±¾ðµÅ ÀÖ¾î¾ß ÇÕ´Ï´Ù.

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

funky

exit 0

ÇÔ¼ö´Â ÇÔ¼ö°¡ ºÒ¸®±â Àü¿¡ Á¤ÀǵǾî¾ß µË´Ï´Ù. ¿¹¸¦ µé¾î C¿¡¼­ ó·³ ÇÔ¼ö¸¦ ¹Ì¸® "¼±¾ð"ÇÏ´Â ¹æ¹ýÀº ¾ø½À´Ï´Ù.
# f1
# "f1"ÀÌ ¾ÆÁ÷ Á¤ÀǵÇÁö ¾Ê¾Ò±â ¶§¹®¿¡ ¿¡·¯ ¸Þ¼¼Áö°¡ ³ª¿É´Ï´Ù.

# ±×·¸Áö¸¸...


f1 ()
{
  echo "\"f1\" ÇÔ¼ö¿¡¼­ \"f2\" ÇÔ¼ö ºÎ¸£±â."
  f2
}


f2 ()
{
  echo "\"f2\" ÇÔ¼ö."
}

f1  # "f2" ÇÔ¼ö´Â Á¤ÀǵDZâ Àü¿¡ ÂüÁ¶µÇÁö¸¸ ½ÇÁ¦·Î´Â ¿©±â Àü¿¡´Â
    # ºÒ¸®Áö ¾Ê±â ¶§¹®¿¡ °¡´ÉÇÕ´Ï´Ù.
    
# Thanks, S.C.

ÇÔ¼ö ¾È¿¡¼­ ´Ù¸¥ ÇÔ¼ö¸¦ Á¤ÀÇÇÏ´Â°Ô °¡´ÉÇϱä ÇÏÁö¸¸ ±×·¸°Ô ¾µ¸ð°¡ ÀÖÁø ¾Ê½À´Ï´Ù.
f1 ()
{

  f2 () # ÁßøµÊ.
  {
    echo "ÇÔ¼ö \"f1\"¼ÓÀÇ ÇÔ¼ö \"f2\"."
  }

}

# f2
# ¿¡·¯°¡ ³³´Ï´Ù.

f1  # "f1"ÀÌ ÀÚµ¿À¸·Î "f2"¸¦ ºÎ¸£Áö ¾Ê±â ¶§¹®¿¡ ¾Æ¹« Àϵµ ÀϾÁö ¾Ê½À´Ï´Ù.
f2  # "f1"À» ºÎ¸§À¸·Î½á "f2"ÀÇ Á¤ÀÇ°¡ ÀÌ·ç¾îÁ³±â ¶§¹®¿¡ ÀÌÁ¦´Â "f2"¸¦ ºÒ·¯µµ ±¦Âú½À´Ï´Ù.

# Thanks, S.C.

ÇÔ¼ö ¼±¾ðÀº ¸í·É¾î°¡ ¾Æ´Ï¸é ¾È µÅ º¸ÀÌ´Â °÷¿¡¼­ Á¶Â÷ °¡´ÉÇÕ´Ï´Ù.
ls -l | foo() { echo "foo"; }  # °¡´ÉÇÏÁö¸¸ ¾µ¸ð ¾ø½À´Ï´Ù.



if [ "$USER" = bozo ]
then
  bozo_greet ()   # if/then ¹® Áß°£¿¡ µé¾î°£ ÇÔ¼ö Á¤ÀÇ.
  {
    echo "Hello, Bozo."
  }
fi

bozo_greet        # bozo »ç¿ëÀÚÀÏ ¶§¸¸ µ¿ÀÛÇÏ°í ´Ù¸¥ »ç¿ëÀÚ´Â ¿¡·¯°¡ ³³´Ï´Ù.



# ¾î¶² »óȲ¿¡¼­´Â ´ÙÀ½Ã³·³ ÇÏ´Â °ÍÀÌ À¯¿ëÇÒ ¶§°¡ ÀÖ½À´Ï´Ù.
NO_EXIT=1   # ¹Ø¿¡ ³ª¿Ã ÇÔ¼ö Á¤ÀǸ¦ °¡´ÉÇÏ°Ô ÇØ ÁÝ´Ï´Ù.

[[ $NO_EXIT -eq 1 ]] && exit() { true; }     # "and-list" ¾È¿¡¼­ ÇÔ¼ö¸¦ Á¤ÀÇ.
# $NO_EXIT °¡ 1À̶ó¸é "exit ()"¸¦ ¼±¾ð.
# "true"·Î º°Äª(alias)À» °É¾î¼­ ³»Àå ¸í·É¾îÀÎ "exit"¸¦ ²ü´Ï´Ù.

exit  # ³»Àå ¸í·É¾îÀÎ "exit"¸¦ ºÎ¸£Áö ¾Ê°í "exit ()" ÇÔ¼ö¸¦ ºÎ¸¨´Ï´Ù.

# Thanks, S.C.