¾î´À Á¤µµ Á¦ÇÑÀº ÀÖÁö¸¸ 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)¶ó°í ÇÏ´Â °ªÀ» ¸®ÅÏÇÕ´Ï´Ù. Á¾·á »óÅ´ return ¹®¿¡ ÀÇÇØ¼ ºÐ¸íÇÏ°Ô Ç¥Çö µÉ ¼ö ÀÖ°í ÇÔ¼öÀÇ ¸¶Áö¸· ¸í·É¾îÀÇ Á¾·á »óÅ·Π´ë½Å ³ªÅ¸³¾ ¼öµµ ÀÖ½À´Ï´Ù(¼º°øÀ̶ó¸é 0, ½ÇÆÐ¶ó¸é 0ÀÌ ¾Æ´Ñ °ª). $? ¸¦ ÂüÁ¶ÇÔÀ¸·Î½á Á¾·á »óŰªÀ» ¾Ë¾Æ³¾ ¼ö ÀÖ½À´Ï´Ù.
ÇÔ¼ö¸¦ ³¡³À´Ï´Ù. 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)ÀûÀ¸·Î ¼±¾ðµÈ º¯¼ö´Â ±× º¯¼ö°¡ º¸ÀÌ´Â ÄÚµå ºí·° ¾È¿¡¼¸¸ º¸ÀÌ°Ô µË´Ï´Ù. ÀÌ ¸»À» ½© ½ºÅ©¸³Æ®¿¡ Àû¿ë½Ã۸é, ¿ÀÁ÷ ±× ÇÔ¼ö ¾È¿¡¼¸¸ Àǹ̸¦ °®´Â´Ù´Â ¶æÀÔ´Ï´Ù.
예 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 |