¾î´À Á¤µµ Á¦ÇÑÀº ÀÖÁö¸¸ 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 |