11Àå. ³»ºÎ ¸í·É¾î(Internal Commands and Builtins)

³»ºÎ ¸í·É(builtin) Àº Bash Åø ¼Â¿¡ Æ÷ÇÔµÈ ¸í·É¾î·Î ¸» ±×´ë·Î bulit in(°íÀ¯ÀÇ, ºÙ¹ÚÀÌÀÇ)µÈ ¸í·É¾îÀÔ´Ï´Ù. ³»ºÎ ¸í·ÉÀº ½Ã½ºÅÛ ¸í·É¾î¿Í À̸§ÀÌ °°À» ¼öµµ ÀÖÁö¸¸ ÀÌ·± °æ¿ì´Â Bash°¡ ³»ºÎÀûÀ¸·Î ´Ù½Ã ±¸ÇöÇØ ³õÀº °ÍÀÔ´Ï´Ù. [1] ¿¹¸¦ µé¾î, ÇÏ´Â ÀÏÀÌ °ÅÀÇ µ¿ÀÏÇÑ bashÀÇ echo´Â /bin/echo¿Í ´Ù¸¨´Ï´Ù.

Å°¿öµå(keyword)´Â ¿¹¾àµÈ ³¹¸», ÅäÅ«, ¿¬»êÀÚ¸¦ ¸»ÇÕ´Ï´Ù. Å°¿öµå´Â ½©¿¡¼­ Ưº°ÇÑ Àǹ̸¦ °¡Áö¸é¼­, ½© ¹®¹ýÀ» Çü¼ºÇØ ÁÝ´Ï´Ù. ¿¹¸¦ µé¸é, "for", "while", "!"°¡ Å°¿öµåÀÔ´Ï´Ù. ³»ºÎ ¸í·É(builtin)°ú ºñ½ÁÇÏ°Ô Å°¿öµåµµ Bash ³»ºÎ¿¡ ÇϵåÄÚµå(hard-coded)µÇ¾î ÀÖ½À´Ï´Ù.

I/O

echo

º¯¼ö³ª Ç¥Çö½ÄÀ» Ç¥ÁØÃâ·ÂÀ¸·Î Ãâ·Â(¿¹ 5-1 Âü°í).
echo Hello
echo $a

echo ¿¡¼­ À̽ºÄÉÀÌÇÁ ¹®ÀÚµéÀ» ÂïÀ¸·Á¸é -e ¿É¼ÇÀ» ÁÖ¾î¾ß ÇÕ´Ï´Ù. ¿¹ 6-2¸¦ Âü°íÇϼ¼¿ä.

º¸Åë, °¢°¢ÀÇ echo´Â ´º¶óÀÎÀ» Ãâ·ÂÇØ ÁÖÁö¸¸ -n ¿É¼ÇÀ» ÁÖ¸é ÀÌ ´º¶óÀÎÀ» ¾È Âï¾î ÁÝ´Ï´Ù.

Âü°í: echo´Â ÆÄÀÌÇÁ¿¡¼­ ¿©·¯ ¸í·É¾îÁßÀÇ Çϳª·Î ¾²ÀÏ ¼ö ÀÖ½À´Ï´Ù.

if echo "$VAR" | grep -q txt   # if [[ $VAR = *txt* ]]
then
  echo "$VAR ¿¡´Â \"txt\"" ¹®ÀÚ¿­ÀÌ µé¾î ÀÖ½À´Ï´Ù."
fi

Âü°í: echo¸¦ ¸í·É¾î ġȯ°ú °°ÀÌ ½á¼­ º¯¼ö °ªÀ» ¼¼Æ®ÇÒ ¼ö ÀÖ½À´Ï´Ù.

a=`echo "HELLO" | tr A-Z a-z`

¿¹ 12-15, ¿¹ 12-2, ¿¹ 12-28, ¿¹ 12-29¸¦ Âü°íÇϼ¼¿ä.

°æ°í

echo `command`´Â command Ãâ·ÂÀÇ ¸ðµç ¶óÀÎÇǵ带 Áö¿ö¹ö¸®´Â °Í¿¡ ÁÖÀÇÇϱ⠹ٶø´Ï´Ù. º¸Åë \nÀÌ $IFSÀÇ °ø¹é¹®ÀÚÁß ÇϳªÀ̱⠶§¹®¿¡, Bash´Â commandÀÇ Ãâ·Â¿¡ ³ªÅ¸³ª´Â ¶óÀÎÇǵ带 ºó Ä­À¸·Î ¹Ù²Ù¾î echoÀÇ ÀÎÀÚ·Î ¸¸µé¾î ¹ö¸³´Ï´Ù.

bash$  printf '\n\n1\n2\n3\n\n\n\n'

 1
 2
 3


bash $




bash$ echo "`printf '\n\n1\n2\n3\n\n\n\n'`"

 1
 2
 3
bash $
	      

Âü°í: ÀÌ ¸í·É¾î´Â ½© ³»Àå ¸í·ÉÀ¸·Î¼­ /bin/echo¿Í ºñ½ÁÇÑ µ¿ÀÛÀ» ÇÏÁö¸¸ ¾ö¿¬È÷ ´Ù¸¨´Ï´Ù.

bash$ type -a echo
echo is a shell builtin
echo is /bin/echo
	      

printf

printf´Â Çü½ÄÈ­µÈ Ãâ·ÂÀ» ÇØÁÖ´Â ¸í·É¾î·Î¼­, echoÀÇ È®ÀåÆÇÀÔ´Ï´Ù. C ¾ð¾îÀÇ printfº¸´Ù ±â´ÉÀÌ Á¦ÇÑµÈ º¯Á¾À¸·Î, ¹®¹ýÀº C¿Í ¾à°£ ´Ù¸¨´Ï´Ù.

printf format-string... parameter...

/bin/printf³ª /usr/bin/printfÀÇ bash ³»Àå ¸í·É ¹öÀüÀÔ´Ï´Ù. ´õ ÀÚ¼¼ÇÑ ³»¿ëÀº printf(½Ã½ºÅÛ ¸í·É¾î)ÀÇ ¸Ç ÆäÀÌÁö¸¦ Âü°íÇϼ¼¿ä.

°æ°í

bashÀÇ ¿¾³¯ ¹öÀüÀº printf¸¦ Áö¿øÇÏÁö ¾ÊÀ» ¼öµµ ÀÖ½À´Ï´Ù.

¿¹ 11-1. printf°¡ ½ÇÁ¦·Î ¾²ÀÌ´Â ¿¹Á¦

#!/bin/bash
# printf demo

PI=3.14159265358979
DecimalConstant=31373
Message1="¾È³çµé ÇϽŰ¡,"
Message2="Áö±¸ÀÎ ¿©·¯ºÐ."

echo

printf "Pi¸¦ ¼Ò¼öÁ¡ ÀÌÇÏ 2 ÀÚ¸®¸¸ Ç¥½Ã = %1.2f" $PI
echo
printf "Pi¸¦ ¼Ò¼öÁ¡ ÀÌÇÏ 9 ÀÚ¸®¸¸ Ç¥½Ã = %1.9f" $PI  # ¹Ý¿Ã¸²ÀÌ Àß µÆÁÒ?

printf "\n"                                  # ¶óÀÎÇǵ带 ÂïÀ½.
                                             # 'echo'¿Í ¶È°°À½.

printf "»ó¼ö = \t%d\n" $DecimalConstant  # ÅÇÀÌ µé¾î°¬ÁÒ(\t)

printf "%s %s \n" $Message1 $Message2

echo

# ==========================================#
# C ÇÔ¼öÀÎ 'sprintf'¸¦ ½Ã¹Ä·¹À̼Ç.
# Çü½ÄÈ­µÈ ¹®ÀÚ¿­·Î º¯¼ö¸¦ ·Îµù.

echo 

Pi12=$(printf "%1.12f" $PI)
echo "Pi¸¦ ¼Ò¼öÁ¡ 12 ÀÚ¸®¸¸ Ç¥½Ã = $Pi12"

Msg=`printf "%s %s \n" $Message1 $Message2`
echo $Msg; echo $Msg

# ÀÌ·¸°Ô Çϸé, 'sprintf' ÇÔ¼ö´Â Bash¿¡¼­ ·ÎµùÇÒ ¼ö ÀÖ´Â ¸ðµâ·Î
# Á¢±ÙÀÌ °¡´ÉÇØ ÁöÁö¸¸, À̽ļºÀÌ ÀÖ´Â ±¸ÇöÀº ¾Æ´Õ´Ï´Ù.

exit 0

printf´Â ¿¡·¯ ¸Þ¼¼Áö¸¦ Çü½ÄÈ­ Çؼ­ Ãâ·ÂÇØ ÁÙ ¶§ ¾ÆÁÖ À¯¿ëÇÏ°Ô ¾²ÀÔ´Ï´Ù.
E_BADDIR=65

var=nonexistent_directory

error()
{
  printf "$@" >&2
  # ÀÎÀÚ·Î ³Ñ¾î¿Â À§Ä¡ ¸Å°³º¯¼ö¸¦ Çü½ÄÈ­Çؼ­ Ç¥ÁØ¿¡·¯·Î Ãâ·Â
  echo
  exit $E_BADDIR
}

cd $var || error $"%s ·Î ¹Ù²Ü ¼ö ¾ø½À´Ï´Ù." "$var"

# Thanks, S.C.

read

º¯¼ö°ªÀ» Ç¥ÁØÀԷ¿¡¼­ "ÀÐ¾î µéÀÔ´Ï´Ù." Áï, Å°º¸µå¿¡¼­ »ç¿ëÀÚÀÇ ÀÔ·ÂÀ» ¹Þ¾Æ ó¸®ÇÕ´Ï´Ù. -a ¿É¼ÇÀ» ÁÖ¸é read´Â º¯¼ö¸¦ ¹è¿­·Î ¹Þ¾Æ µéÀÔ´Ï´Ù(¿¹ 26-2 Âü°í).

¿¹ 11-2. read·Î º¯¼ö ÇÒ´çÇϱâ

#!/bin/bash

echo -n "'var1' º¯¼ö°ªÀ» ³ÖÀ¸¼¼¿ä: "
# -n ¿É¼ÇÀº ´º¶óÀÎÀ» Á¦°ÅÇØ ÁÝ´Ï´Ù.

read var1
# var1 º¯¼ö°¡ read¿¡ ÀÇÇØ ¼¼Æ®µÇ±â ¶§¹®¿¡ var1 ¾Õ¿¡ '$'°¡ ¾ø½À´Ï´Ù. ÁÖÀÇÇϼ¼¿ä.

echo "var1 = $var1"


echo

# ÇϳªÀÇ 'read' ¹®À¸·Î ¿©·¯°³ÀÇ º¯¼ö¸¦ ¼¼Æ®ÇÒ ¼ö ÀÖ½À´Ï´Ù.
echo -n "'var2'¿Í 'var3'ÀÇ °ªÀ» ³ÖÀ¸¼¼¿ä(ºó Ä­À̳ª ÅÇÀ¸·Î ±¸ºÐ): "
read var2 var3
echo "var2 = $var2      var3 = $var3"
# ÇÑ °³ °ª¸¸ ÁÖ°Ô µÇ¸é, ´Ù¸¥ º¯¼ö(µé)Àº ¼¼Æ®°¡ ¾È µÈ »óÅÂ(³Î)·Î ³²°Ô µË´Ï´Ù.

exit 0

read·Î ÀÔ·ÂÀ» ³ÖÀ» ¶§ º¸ÅëÀº ´º¶óÀÎ Àü¿¡ \¸¦ ³Ö¾î ´º¶óÀÎÀ» ¹«½ÃÇÏ°Ô ÇÕ´Ï´Ù. -r ¿É¼ÇÀ» ÁÖ¸é \ °¡ ¹®ÀÚ ±×´ë·Î Çؼ®µÇµµ·Ï ÇÕ´Ï´Ù.

¿¹ 11-3. read·Î ¿©·¯ÁÙÀÇ ÀÔ·Â ³Ö±â

#!/bin/bash

echo

echo "\\ ·Î ³¡³ª´Â ¹®ÀÚ¿­À» ÀÔ·ÂÇÏ°í <ENTER> ¸¦ ´©¸£¼¼¿ä."
echo "±× ´ÙÀ½¿¡ µÎ ¹ø° ¹®ÀÚ¿­À» ÀÔ·ÂÇÏ°í <ENTER> ¸¦ ´Ù½Ã ´©¸£¼¼¿ä."
read var1     # "var1"À» ÀÐÀ» ¶§ "\" ¶§¹®¿¡ ´º¶óÀÎÀÌ Á¦°ÅµË´Ï´Ù.
              #     ù¹ø° ÁÙ \
              #     µÎ¹ø° ÁÙ

echo "var1 = $var1"
#     var1 = ù¹ø° ÁÙ µÎ¹ø° ÁÙ

# "\"·Î ³¡³ª´Â ÁÙÀ» ¸¸³¯ ¶§ ¸¶´Ù,
# var1¿¡ ¹®ÀÚ¸¦ °è¼Ó ÀÔ·ÂÇϱâ À§Çؼ­ ´ÙÀ½ ÁÙÀ» À§ÇÑ ÇÁ·ÒÇÁÆ®¸¦ ¹Þ°Ô µË´Ï´Ù.

echo; echo

echo "\\ ·Î ³¡³ª´Â ´Ù¸¥ ¹®ÀÚ¿­À» ÀÔ·ÂÇÏ°í <ENTER> ¸¦ ´©¸£¼¼¿ä."
read -r var2  # -r ¿É¼ÇÀº "\"¸¦ ¹®ÀÚ ±×´ë·Î ÀÐ¾î µéÀÔ´Ï´Ù.
              #     ù¹ø° ÁÙ \

echo "var2 = $var2"
#     var2 = ù¹ø° ÁÙ \

# ÀÔ·Â µ¥ÀÌŸ´Â ù¹ø° <ENTER> ¿¡¼­ ³¡³ª°Ô µË´Ï´Ù.

echo 

exit 0

read ¸í·É¾î´Â ÇÁ·ÒÇÁÆ®¸¦ º¸¿©ÁØ ´ÙÀ½ ENTER¾øÀÌ Å°´©¸§À» ¹Þ¾Æ µéÀÌ´Â Àç¹Õ´Â ¿É¼ÇÀ» °®°í ÀÖ½À´Ï´Ù.

# ENTER ¾øÀÌ Å°´©¸§À» ÀÐÀ½.

read -s -n1 -p "Å°¸¦ ´©¸£¼¼¿ä " keypress
echo; echo "´ç½ÅÀÌ ´©¸¥ Å°´Â "\"$keypress\""ÀÔ´Ï´Ù."

# -s ´Â ÀÔ·ÂÀ» ¿¡ÄÚÇÏÁö ¸»¶ó´Â ¿É¼ÇÀÔ´Ï´Ù.
# -n N Àº µü N °³ÀÇ ¹®ÀÚ¸¸ ¹Þ¾Æ µéÀ̶ó´Â ¿É¼ÇÀÔ´Ï´Ù.
# -p ´Â ÀÔ·ÂÀ» Àбâ Àü¿¡ ´ÙÀ½¿¡ ³ª¿À´Â ÇÁ·ÒÇÁÆ®¸¦ ¿¡ÄÚÇ϶ó´Â ¿É¼ÇÀÔ´Ï´Ù.

# ÀÌ ¿É¼ÇµéÀº ¼ø¼­°¡ ¹Ù·Î µÇ¾î ÀÖ¾î¾ß Çϱ⠶§¹®¿¡ ¾²±â°¡ ¾à°£ ±î´Ù·Ó½À´Ï´Ù.

read ¸í·É¾î´Â Ç¥ÁØÀÔ·ÂÀ¸·Î ÀçÁöÇâµÈ ÆÄÀÏ¿¡¼­ º¯¼ö°ªÀ» "ÀÐÀ»" ¼öµµ ÀÖ½À´Ï´Ù. ÀÔ·Â ÆÄÀÏÀÌ ÇÑ ÁÙ ÀÌ»óÀ̶ó¸é ù ¹ø° ÁÙ¸¸ º¯¼ö·Î ÇÒ´çµË´Ï´Ù. read°¡ Çϳª ÀÌ»óÀÇ ¸Å°³º¯¼ö¸¦ °®°í ÀÖ´Ù¸é °¢ º¯¼ö´Â °ø¹é ¹®ÀÚ·Î ±¸ºÐµÇ´Â ¿¬¼ÓÀûÀÎ ¹®ÀÚ¿­·Î ÇÒ´çµË´Ï´Ù. Á¶½ÉÇϼ¼¿ä!

¿¹ 11-4. read¸¦ ÆÄÀÏ ÀçÁöÇâ°ú °°ÀÌ ¾²±â

#!/bin/bash

read var1 <data-file
echo "var1 = $var1"
# "data-file"ÀÇ Ã¹¹ø° ÁÙ Àüü°¡ var1À¸·Î ¼¼ÆÃ

read var2 var3 <data-file
echo "var2 = $var2   var3 = $var3"
# "read"ÀÇ Á÷°üÀûÀÌÁö ¾ÊÀº Çൿ¿¡ ÁÖÀÇÇϼ¼¿ä.
# 1) ÀÔ·Â ÆÄÀÏÀÇ Á¦ÀÏ Ã³À½À¸·Î µ¹¾Æ°¡¼­,
# 2) °¢ º¯¼ö´Â ÁÙ Àüü°¡ ¾Æ´Ñ °ø¹é¹®ÀÚ·Î ³ª´©¾îÁø ¹®ÀÚ¿­·Î ¼¼Æ®µÊ.
# 3) ¸¶Áö¸· º¯¼ö´Â ±× ÁÙÀÇ ³ª¸ÓÁö·Î ¼¼Æ®.
# 4) º¯¼ö °¹¼ö°¡ °ø¹é¹®ÀÚ·Î ³ª´©¾îÁø ¹®ÀÚ¿­º¸´Ù ¸¹´Ù¸é ³ª¸ÓÁö º¯¼öµéÀº ¼¼Æ®µÇÁö ¾ÊÀ½.

echo "------------------------------------------------"

# À§ÀÇ ¹®Á¦¸¦ ·çÇÁ·Î ÇØ°áÇØ º¸°Ú½À´Ï´Ù.
while read line
do
  echo "$line"
done <data-file
# Heiner Steven ÀÌ ÀÌ ºÎºÐÀ» ÁöÀûÇØ ÁÖ¾ú½À´Ï´Ù.

echo "------------------------------------------------"

# "read"°¡ ÀÐ¾î µéÀÌ´Â ÁÙÀÌ °ø¹é¹®ÀÚ°¡ ¾Æ´Ñ ´Ù¸¥ ¹®ÀÚ·Î ±¸ºÐµÇµµ·Ï ÇÏ·Á¸é
# $IFS(³»ºÎ ÇÊµå ±¸ºÐÀÚ, Internal Field Separator)¸¦ ¾²¸é µË´Ï´Ù.

echo "¸ðµç »ç¿ëÀÚ ¸ñ·Ï:"
OIFS=$IFS; IFS=:       # /etc/passwd ´Â ÇÊµå ±¸ºÐÀÚ·Î ":"¸¦ ¾¹´Ï´Ù.
while read name passwd uid gid fullname ignore
do
  echo "$name ($fullname)"
done </etc/passwd   # I/O ÀçÁöÇâ.
IFS=$OIFS              # ¿ø·¡ $IFS ¸¦ º¹±¸½ÃÅ´.
# ÀÌ Äڵ嵵 Heiner Steven ÀÌ Á¦°øÇØ ÁÖ¾ú½À´Ï´Ù.

exit 0

ÆÄÀϽýºÅÛ

cd

Àͼ÷ÇÑ ¸í·É¾îÀÎ cd´Â ½ºÅ©¸³Æ®¿¡¼­ ¾î¶² ¸í·É¾î°¡ ƯÁ¤ÇÑ µð·ºÅ丮¿¡¼­ ½ÇÇàµÉ ÇÊ¿ä°¡ ÀÖÀ» ¶§ ±× µð·ºÅ丮·Î ¿Å°Ü°¡±â À§ÇØ ¾²ÀÔ´Ï´Ù.
(cd /source/directory && tar cf - . ) | (cd /dest/directory && tar xpvf -)
[¾Õ¼­ ÀοëÇß´ø ¾Ë¶õ ÄÛ½ºÀÇ ¿¹Á¦]

cd°¡ ½Éº¼¸¯ ¸µÅ©¸¦ ¹«½ÃÇÏ°í ¿ø·¡ µð·ºÅ丮·Î °¡µµ·Ï Çϱâ À§Çؼ­´Â -P(¹°¸®ÀûÀÎ, physical) ¿É¼ÇÀ» ÁÖ¸é µË´Ï´Ù.

cd - ¶ó°í ÇÏ¸é ¹Ù·Î Àü ÀÛ¾÷ µð·ºÅ丮ÀÎ $OLDPWD ·Î ¿Å°Ü °©´Ï´Ù.

pwd

ÇöÀç ÀÛ¾÷ µð·ºÅ丮¸¦ Ãâ·Â(Print Working Directory). ÀÌ ¸í·É¾î´Â »ç¿ëÀÚ(ȤÀº ½ºÅ©¸³Æ®)ÀÇ ÇöÀç µð·ºÅ丮(¿¹ 11-5 Âü°í)¸¦ ¾Ë·ÁÁÝ´Ï´Ù. ³»ºÎ º¯¼öÀÎ $PWDÀÇ °ªÀ» Àд °Í°ú µ¿ÀÏÇÑ È¿°ú¸¦ °¡Á®¿É´Ï´Ù.

pushd, popd, dirs

ÀÌ ¸í·É¾îµéÀº ÀÛ¾÷ µð·ºÅ丮¸¦ Áñ°Üã±â¿¡ ±â¾ï½ÃÄÑÁÖ´Â ¸ÞÄ«´ÏÁòÀ¸·Î, µð·ºÅ丮°£¿¡ ¼ø¼­´ë·Î ¿Ô´Ù °¬´Ù ÇÒ ¼ö ÀÖ°Ô ÇØ ÁÝ´Ï´Ù. µð·ºÅ丮 À̸§À» ±â¾ïÇϱâ À§Çؼ­ Ǫ½¬´Ù¿î ½ºÅÃÀ» »ç¿ëÇÕ´Ï´Ù. ¿É¼ÇÀ» Á༭ µð·ºÅ丮 ½ºÅÿ¡ ´ëÇؼ­ ´Ù¾çÇÑ Á¶ÀÛÀ» ÇÒ ¼ö ÀÖ½À´Ï´Ù.

pushd dir-nameÀº dir-nameÀ» µð·ºÅ丮 ½ºÅÿ¡ ³Ö°í µ¿½Ã¿¡ ÇöÀç µð·ºÅ丮¸¦ ±× µð·ºÅ丮·Î ¿Å°Ü ÁÝ´Ï´Ù.

popd´Â µð·ºÅ丮 ½ºÅÃÀÇ Á¦ÀÏ À§¿¡ ÀÖ´Â µð·ºÅ丮¸¦ Áö¿ì°í(pop) µ¿½Ã¿¡ ÇöÀç µð·ºÅ丮¸¦ ±× µð·ºÅ丮·Î ¿Å°Ü ÁÝ´Ï´Ù.

dirsÀº µð·ºÅ丮 ½ºÅÃÀÇ ¸ñ·ÏÀ» º¸¿©ÁÝ´Ï´Ù ($DIRSTACK°ú °°À½). pushd³ª popd°¡ ¼º°øÇÑ´Ù¸é dirs°¡ ÀÚµ¿À¸·Î ºÒ¸³´Ï´Ù.

µð·ºÅ丮 À̸§À» Çϵå ÄÚµùÇÏÁö ¾Ê°í µð·ºÅ丮¸¦ ¿©±â Àú±â·Î ¿Å°Ü ´Ù³à¾ß ÇÏ´Â ½ºÅ©¸³Æ®°¡ ÀÌ ¸í·É¾î¸¦ ¾²¸é ¾ÆÁÖ ÁÁ½À´Ï´Ù. ½ºÅ©¸³Æ® ³»¿¡¼­ µð·ºÅ丮 ½ºÅÃÀÇ ³»¿ëÀ» ´ã°í ÀÖ´Â $DIRSTACK ¹è¿­ º¯¼ö¿¡ ¹¬½ÃÀûÀ¸·Î Á¢±ÙÀÌ °¡´ÉÇϱ⠶§¹®¿¡ ÁÖÀÇÇØ¾ß ÇÕ´Ï´Ù.

¿¹ 11-5. ÇöÀç ÀÛ¾÷ µð·ºÅ丮 º¯°æÇϱâ

#!/bin/bash

dir1=/usr/local
dir2=/var/spool

pushd $dir1
# ÀÚµ¿À¸·Î 'dirs'¸¦ ½ÇÇàÇÕ´Ï´Ù(µð·ºÅ丮 ½ºÅÃÀÇ ³»¿ëÀ» Ç¥ÁØÃâ·ÂÀ¸·Î »Ñ¸²).
echo "Now in directory `pwd`." # ¿ªµû¿ÈÇ¥(backquote)¸¦ °Ç 'pwd'.

# 'dir1'¿¡¼­ ¾Æ¹« ÀÏÀ̳ª ÇÏ°í,
pushd $dir2
echo "Áö±ÝÀº `pwd` µð·ºÅ丮¿¡ ÀÖ½À´Ï´Ù."

# 'dir2'¿¡¼­ ¾Æ¹« ÀÏÀ̳ª ÇÑ ´ÙÀ½,
echo "DIRSTACK ¹è¿­ÀÇ top Ç׸ñÀº $DIRSTACK ÀÔ´Ï´Ù."
popd
echo "ÀÌÁ¦ `pwd` µð·ºÅ丮·Î µ¹¾Æ¿Ô½À´Ï´Ù."

# 'dir1'¿¡¼­ ¾Æ¹« ÀÏÀ̳ª Çϼ¼¿ä.
popd
echo "ÀÌÁ¦ ¿ø·¡ÀÇ `pwd` µð·ºÅ丮·Î µ¹¾Æ¿Ô½À´Ï´Ù."

exit 0

º¯¼ö

let

let ¸í·É¾î´Â º¯¼ö¿¡ ´ëÇؼ­ »ê¼ú ¿¬»êÀ» ¼öÇàÇÕ´Ï´Ù. ¸¹Àº °æ¿ì¿¡ À־ exprº¸´Ù Á» °£´ÜÇÑ ±â´ÉÀ» ¼öÇàÇÕ´Ï´Ù.

¿¹ 11-6. letÀ¸·Î ¸î °¡Áö »ê¼ú ¿¬»êÀ» Çϱâ.

#!/bin/bash

echo

let a=11          # 'a=11' °ú ¶È°°½À´Ï´Ù.
let a=a+5         # let "a = a + 5" ¿Í ¶È°°½À´Ï´Ù.
                  # (Å«µû¿ÈÇ¥¿Í ºó Ä­À» ¾²¸é Á» ´õ ÀбⰡ ÆíÇÏÁÒ)
echo "11 + 5 = $a"

let "a <<= 3"     # let "a = a << 3" °ú ¶È°°½À´Ï´Ù.
echo "\"\$a\" (=16) ¸¦ 3 ¹ø ¿ÞÂÊ ½¬ÇÁÆ® = $a"

let "a /= 4"      # let "a = a / 4" ¿Í ¶È°°½À´Ï´Ù.
echo "128 / 4 = $a"

let "a -= 5"      # let "a = a - 5" ¿Í ¶È°°½À´Ï´Ù.
echo "32 - 5 = $a"

let "a = a * 10"  # let "a = a * 10" °ú ¶È°°½À´Ï´Ù.
echo "27 * 10 = $a"

let "a %= 8"      # let "a = a % 8" °ú ¶È°°½À´Ï´Ù.
echo "270 modulo 8 = $a  (270 / 8 = 33, ³ª¸ÓÁö´Â $a)"

echo

exit 0
eval

eval arg1 [arg2] ... [argN]

¸ñ·Ï¿¡ µé¾î ÀÖ´Â ÀÎÀÚ¸¦ ¸í·É¾î·Î º¯È¯(½ºÅ©¸³Æ® ¾È¿¡¼­ Äڵ带 ¸¸µé¾î ³¾ ¶§ À¯¿ëÇÔ).

¿¹ 11-7. evalÀÇ È¿°ú º¸¿©ÁÖ±â

#!/bin/bash

y=`eval ls -l`   # y=`ls -l` °ú ºñ½ÁÇÏÁö¸¸,
echo $y          # ¶óÀÎÇǵ尡 Áö¿öÁý´Ï´Ù.

y=`eval df`      # y=`df` ¿Í ºñ½ÁÇÏÁö¸¸,
echo $y          # ¶óÀÎÇǵ尡 Áö¿öÁý´Ï´Ù.

# ¶óÀÎÇǵå(LF)°¡ ¾ø¾îÁö±â ¶§¹®¿¡ Ãâ·ÂÀ» ÆĽÌÇϱⰡ ´õ ½¬¿ï °ÍÀÔ´Ï´Ù.

exit 0

¿¹ 11-8. °­Á¦·Î ·Î±× ¾Æ¿ô ½ÃÅ°±â

#!/bin/bash

y=`eval ps ax | sed -n '/ppp/p' | awk '{ print $1 }'`
# 'ppp'ÀÇ ÇÁ·Î¼¼½º ¹øÈ£¸¦ ãÀº ´ÙÀ½,

kill -9 $y   # Á×ÀÌ°í,

# À§¿¡¼­ ÇÑ °ÍÀº ´ÙÀ½Ã³·³ Çصµ µË´Ï´Ù.
#  kill -9 `ps ax | awk '/ppp/ { print $1 }'


chmod 666 /dev/ttyS3
# ppp¿¡ SIGKILLÀ» ³¯¸®¸é Á÷·Ä Æ÷Æ®ÀÇ Æ۹̼ÇÀÌ ¹Ù²î±â ¶§¹®¿¡
# ÀÌÀü Æ۹̼ÇÀ¸·Î º¹±¸½ÃÄÑ¾ß µË´Ï´Ù.

rm /var/lock/LCK..ttyS3   # Á÷·Ä Æ÷Æ®¿ë Àá±Ý ÆÄÀÏÀ» Áö¿ó´Ï´Ù.

exit 0

¿¹ 11-9. "rot13" ¹öÀü

#!/bin/bash
# 'eval'·Î "rot13"À» ±¸Çö.
# (¿Å±äÀÌ: rot13 À̶õ °¢ ¾ËÆĺªÀ» 13¹ø ·ÎÅ×ÀÌÆ®(±×·¡¼­ À̸§ÀÌ rot13) ½ÃÅ°´Â 
# °£´ÜÇÑ ¾ÏȣȭÀÔ´Ï´Ù.)
# "rot13.sh" ¿¹Á¦¿Í ºñ±³ÇØ º¸¼¼¿ä.

setvar_rot_13()              # "rot13" ½ºÅ©·¥ºí(¾Ïȣȭ)
{
  local varname=$1 varvalue=$2
  eval $varname='$(echo "$varvalue" | tr a-z n-za-m)'
}


setvar_rot_13 var "foobar"   # "foobar" ¸¦ rot13 ½ÃÅ°¸é,
echo $var                    # sbbone

echo $var | tr a-z n-za-m    # foobar
                             # ¿ø·¡ º¯¼ö·Î µÇµ¹¸².

# Stephane Chazelas Á¦°ø.

exit 0

°æ°í

eval ¸í·É¾î´Â ¾ÆÁÖ À§ÇèÇÑ »óȲÀ» °¡Á®¿Ã ¼ö Àֱ⠶§¹®¿¡ ÇÕ´çÇÑ ´Ù¸¥ ¹æ¹ýÀÌ ÀÖ´Ù¸é ÀÌ°ÍÀ» ¾²Áö ¾Ê´Â °ÍÀÌ ÁÁ½À´Ï´Ù. eval $COMMANDS´Â rm -rf * ó·³ À¯ÄèÇÏÁö ¾ÊÀº °ªÀ» °®°í ÀÖÀ» ¼öµµ ÀÖ´Â COMMANDSÀ» ½ÇÇà ½Ãŵ´Ï´Ù. ¸ð¸£´Â »ç¶÷ÀÌ ÀÛ¼ºÇÑ Àß ¸ð¸£´Â Äڵ忡 ´ëÇؼ­ eval¸¦ ½ÇÇà ½ÃÅ°´Â °ÍÀº ¾ÆÁÖ À§ÇèÇÕ´Ï´Ù.

set

set ¸í·É¾î´Â ³»ºÎ ½ºÅ©¸³Æ® º¯¼ö°ªÀ» ¹Ù²ãÁÝ´Ï´Ù. ½ºÅ©¸³Æ®ÀÇ ÇൿÀ» °áÁ¤ÇÏ´Â ¿É¼Ç Ç÷¡±×¸¦ Å°°Å³ª ²ô´Â ¿ªÇÒ¿¡ ¾²À̱⵵ ÇÏ°í ƯÁ¤ ¸í·É¾îÀÇ °á°ú(set `command`)¸¦ À§Ä¡ ¸Å°³º¯¼ö·Î ¸®¼Â ½ÃÄѼ­ ½ºÅ©¸³Æ®°¡ ±× ¸í·É¾îÀÇ °á°ú¸¦ Çʵ庰·Î ÆĽÌÇÒ ¼ö ÀÖ°Ô ÇØ ÁÝ´Ï´Ù.

¿¹ 11-10. À§Ä¡ ¸Å°³º¯¼ö¿Í set ¾²±â

#!/bin/bash

# "set-test" ½ºÅ©¸³Æ®

# 3°³ÀÇ ÀÎÀÚ¸¦ Á༭ ½ÇÇà½ÃÅ°¼¼¿ä.
# ¿¹¸¦ µé¸é, "./set-test one two three".

echo
echo "set \`uname -a\` Çϱâ ÀüÀÇ À§Ä¡ ¸Å°³º¯¼ö:"
echo "ù¹ø° ¸í·É¾îÁÙ ÀÎÀÚ = $1"
echo "µÎ¹ø° ¸í·É¾îÁÙ ÀÎÀÚ = $2"
echo "¼¼¹ø° ¸í·É¾îÁÙ ÀÎÀÚ = $3"

echo

set `uname -a` # `uname -a` ÀÇ Ãâ·ÂÀ» À§Ä¡ ¸Å°³º¯¼ö·Î ¼¼Æ®

echo "set \`uname -a\` ÇÑ ´ÙÀ½ÀÇ À§Ä¡ ¸Å°³º¯¼ö:"
# $1, $2, $3... ÀÌ `uname -a` ÀÇ °á°ú·Î ´Ù½Ã ÃʱâÈ­µË´Ï´Ù.
echo "'uname -a' ÀÇ Ã¹¹ø° Çʵå = $1"
echo "'uname -a' ÀÇ µÎ¹ø° Çʵå = $2"
echo "'uname -a' ÀÇ ¼¼¹ø° Çʵå = $3"
echo

exit 0

¿¹ 10-2 Âü°í.

unset

unset ¸í·É¾î´Â ½© º¯¼ö¸¦ È¿°úÀûÀ¸·Î ³Î(null)·Î ¼¼Æ®¸¦ Çؼ­ ±× º¯¼ö¸¦ Áö¿ì´Â È¿°ú¸¦ °¡Á®¿É´Ï´Ù. ÀÌ ¸í·É¾î´Â À§Ä¡ ¸Å°³º¯¼ö¿¡ ´ëÇؼ­ µ¿ÀÛÇÏÁö ¾Ê´Â °Í¿¡ ÁÖÀÇÇϼ¼¿ä.

bash$ unset PATH

bash$ echo $PATH

bash$ 

¿¹ 11-11. º¯¼ö¸¦ "¾ð¼Â"(unset) Çϱâ

#!/bin/bash
# unset.sh: º¯¼ö¸¦ ¾ð¼ÂÇϱâ.

variable=hello                       # ÃʱâÈ­.
echo "variable = $variable"

unset variable                       # ¾ð¼Â.
                                     # variable=   ¶ó°í ÇÏ´Â °Í°ú µ¿ÀÏ
echo "(unset) variable = $variable"  # $variable ´Â ³Î.

exit 0
export

export ¸í·É¾î´Â ÇöÀç ½ÇÇàÁßÀÎ ½ºÅ©¸³Æ®³ª ½©ÀÇ ¸ðµç ÀÚ½Ä ÇÁ·Î¼¼½º°¡ º¯¼ö¸¦ »ç¿ëÇÒ ¼ö ÀÖ°Ô ÇØ ÁÝ´Ï´Ù. ºÒÇàÇÏ°Ôµµ ½ºÅ©¸³Æ®³ª ½©À» ºÎ¸¥ ºÎ¸ð ÇÁ·Î¼¼½º¿¡°Ô º¯¼ö¸¦ ´Ù½Ã export ÇÒ ¹æ¹ýÀº ¾ø½À´Ï´Ù. export´Â ½Ã½ºÅÛ ±¸µ¿(startup) ÆÄÀÏ¿¡¼­ ȯ°æ º¯¼ö¸¦ ÃʱâÈ­ÇÏ°í ±× ´ÙÀ½¿¡ »ý¼ºµÉ »ç¿ëÀÚ ÇÁ·Î¼¼½ºµéÀÌ ±× º¯¼ö¿¡ Á¢±ÙÇÒ ¼ö ÀÖ°Ô ÇØÁÖ´Â ¾ÆÁÖ Áß¿äÇÑ ¿ëµµ·Î ¾²ÀÔ´Ï´Ù.

¿¹ 11-12. export¸¦ ½á¼­, ³»ÀåµÈ awk ½ºÅ©¸³Æ®¿¡ º¯¼ö¸¦ Àü´ÞÇϱâ

#!/bin/bash

# "column totaler" ½ºÅ©¸³Æ®(col-totaler.sh)ÀÇ ¶Ç ´Ù¸¥ ¹öÀü.
# ´ë»ó ÆÄÀÏÀÇ ÁÖ¾îÁø ÁöÁ¤µÈ Ä÷³À» ¸ðµÎ ´õÇØÁÜ.
# ¿©±â¼­´Â ½ºÅ©¸³Æ® º¯¼ö¸¦ 'awk'¿¡°Ô Àü´ÞÇϱâ À§Çؼ­ ȯ°æ(environment)À» »ç¿ëÇÕ´Ï´Ù.

ARGS=2
E_WRONGARGS=65

if [ $# -ne "$ARGS" ] # ¿øÇÏ´Â ¼ö ¸¸Å­ÀÇ ¸í·É¾îÁÙ ÀÎÀÚ°¡ ³Ñ¾î¿Ô´ÂÁö È®ÀÎ.
then
   echo "»ç¿ë¹ý: `basename $0` filename column-number"
   exit $E_WRONGARGS
fi

filename=$1
column_number=$2

#===== ¿©±â±îÁö´Â ¿ø·¡ ½ºÅ©¸³Æ®¿Í ¶È°°½À´Ï´Ù =====#

export column_number
# column_number ¸¦ ȯ°æÀ¸·Î export Çؼ­ awk ½ºÅ©¸³Æ®¿¡¼­ ´Ù½Ã ²¨³»°¥¼ö ÀÖ°Ô ÇÔ.


# awk ½ºÅ©¸³Æ® ½ÃÀÛ.
# ------------------------------------------------
awk '{ total += $ENVIRON["column_number"]
}
END { print total }' $filename
# ------------------------------------------------
# awk script ³¡.


# Stephane Chazelas Á¦°ø.

exit 0

ÀÛÀº Á¤º¸: export var1=xxx¶ó°í Çؼ­ ÃʱâÈ­¿Í export¸¦ Çѹø¿¡ ÇÒ ¼öµµ ÀÖ½À´Ï´Ù.

declare, typeset

declare ¿Í typeset ¸í·É¾î´Â º¯¼öÀÇ Æ¯¼ºÀ» ÁöÁ¤Çϰųª Á¦ÇÑÇØ ÁÝ´Ï´Ù.

readonly

declare -r°ú °°Àº ¿ªÇÒÀ» ÇÏ´Â ¸í·É¾î·Î¼­, ¾î¶² º¯¼ö¸¦ Àбâ Àü¿ëÀ¸·Î ¸¸µé¾î ÁÖ´Â °ÍÀε¥, °á±¹ »ó¼ö·Î ¾²°Ú´Ù´Â °ÍÀÔ´Ï´Ù. ÀÌ·± º¯¼ö°ªÀ» ¹Ù²Ù·Á°í ÇÑ´Ù¸é ¿¡·¯ ¸Þ¼¼Áö¸¦ ¸¸³ª°Ô µË´Ï´Ù. C ¾ð¾îÀÇ const ÇüÁöÁ¤ÀÚ¿Í ºñ½ÁÇÑ °ÍÀ¸·Î º¸¸é µË´Ï´Ù.

getopts

ÀÌ°ÍÀº ¾ÆÁÖ °­·ÂÇÑ µµ±¸·Î¼­ ¸í·É¾î ÁÙ¿¡¼­ ½ºÅ©¸³Æ®·Î ³Ñ¾î¿Â ÀÎÀÚ¸¦ ÆĽÌÇØ ÁÝ´Ï´Ù. C ÇÁ·Î±×·¡¸Óµé¿¡°Ô Àͼ÷ÇÑ getopt ¶óÀ̺귯¸® ÇÔ¼öÀÇ bash ¹öÀüÀÔ´Ï´Ù. ½ºÅ©¸³Æ®·Î ³Ñ¾î¿À´Â ¿©·¯°³ÀÇ ¿É¼Ç [2] °ú ±× ÇØ´ç ÀÎÀÚµéÀ» ó¸®ÇØÁÝ´Ï´Ù(¿¹¸¦ µé¸é, scriptname -abc -e /usr/local).

getopts´Â ³»ºÎÀûÀ¸·Î µÎ °³ÀÇ º¯¼ö¸¦ »ç¿ëÇÕ´Ï´Ù. $OPTIND(OPTion INDex)´Â ÀÎÀÚ Æ÷ÀÎÅÍÀÌ°í $OPTARG(OPTion ARGument)´Â ¿É¼Ç¿¡ µþ·Á ³Ñ¾î¿À´Â ÇØ´ç ÀÎÀÚ(¼±ÅÃÀû)ÀÔ´Ï´Ù. ¼±¾ð ű×ÀÇ ¿É¼Ç À̸§µÚ¿¡ ÄÝ·ÐÀÌ ÀÖÀ¸¸é ÇØ´ç ÀÎÀÚ°¡ ÀÖ´Ù´Â ¶æÀÔ´Ï´Ù.

getopts´Â º¸Åë while ·çÇÁ¿Í °°ÀÌ ½á¼­ ¿É¼Ç°ú ÀÎÀÚ¸¦ ÇÑ ¹ø¿¡ Çϳª¾¿ ó¸®ÇÏ°í $OPTIND º¯¼ö°ªÀ» Çϳª¾¿ ÁÙ¿©¼­ ±× ´ÙÀ½À» ó¸®ÇÏ°Ô ÇÕ´Ï´Ù.

Âü°í:

  1. ¸í·É¾î ÁÙ¿¡¼­ ÀÎÀÚ¾Õ¿¡´Â »©±â(-)³ª ´õÇϱâ(+)¸¦ Àû¾î Áà¾ß Çϴµ¥ ÀÌ Á¢µÎ»ç°¡ ÀÖ¾î¾ß getopts°¡ ¸í·É¾î ÁÙ ÀÎÀÚ¸¦ ¿É¼ÇÀ¸·Î ÀνÄÇÒ ¼ö ÀÖ½À´Ï´Ù. ½ÇÁ¦·Î´Â, -³ª +°¡ ºüÁ® Àִ ù¹ø° ÀÎÀÚ¸¦ ¸¸³ª¸é ¹Ù·Î Á¾·áÇÏ°Ô µË´Ï´Ù.

  2. getops´Â Ç¥ÁØ while ·çÇÁ¿Í ¾à°£ ´Ù¸¥ ÇüÅ·ΠÁ¶°Ç ´ë°ýÈ£°¡ ºüÁ® ÀÖ´Â ÇüÅÂÀÔ´Ï´Ù.

  3. ¿¹ÀüÀÇ getopt ´ë½Å getopts°¡ »õ·Ó°Ô ¾²ÀÔ´Ï´Ù.

while getopts ":abcde:fg" Option
# Ãʱ⠼±¾ð.
# a, b, c, d, e, f, g ¿É¼Ç(Ç÷¡±×)¸¸ Áö¿ø.
# 'e' µÚÀÇ :·Î 'e' ¿É¼Ç¿¡´Â ÀÎÀÚ°¡ ÀÖ¾î¾ß µÈ´Ù´Â °ÍÀ» ³ªÅ¸³¿
do
  case $Option in
    a ) # 'a'ÀÏ °æ¿ì ÇÒ ÀÏ.
    b ) # 'b'ÀÏ °æ¿ì ÇÒ ÀÏ.
    ...
    e)  # 'e'ÀÏ °æ¿ì ÇÒ ÀÏ, $OPTARG ·Î 'e' µÚ¿¡ µû¶ó¿À´Â ÇØ´ç ÀÎÀÚ¸¦ ó¸®.
    ...
    g ) # 'g'ÀÏ °æ¿ì ÇÒ ÀÏ.
  esac
done
shift $(($OPTIND - 1))
# ÀÎÀÚ Æ÷ÀÎÅ͸¦ ´ÙÀ½À¸·Î À̵¿.

# º¸ÀÌ´Â °Íó·³ ±×·¸°Ô º¹ÀâÇÏÁö´Â ¾Ê½À´Ï´Ù. <¾¾ÀÍ>.
	      

¿¹ 11-13. getopts·Î ½ºÅ©¸³Æ®·Î ³Ñ¾î¿Â ¿É¼Ç°ú ÀÎÀÚ Àбâ

#!/bin/bash

# 'getopts' ´Â ½ºÅ©¸³Æ®·Î ³Ñ¾î¿Â ¸í·É¾îÁÙ ÀÎÀÚ¸¦ ó¸®ÇØ ÁÝ´Ï´Ù.
# ÀÎÀÚµéÀº "¿É¼Ç"(Ç÷¡±×)°ú ÇØ´ç ÀÎÀÚ·Î ÆĽ̵˴ϴÙ.

# ÀÌ·¸°Ô ½ÇÇà½ÃÄÑ º¸¼¼¿ä.
# 'scriptname -mn'
# 'scriptname -oq qOption' (qOption Àº ¾Æ¹«·± ¹®ÀÚ¿­ÀÌ¸é µË´Ï´Ù.)
# 'scriptname -qXXX -r'
#
# 'scriptname -qr'    - ¿øÇÏ´ø °á°ú°¡ ¾È ³ª¿À´Âµ¥, "r"ÀÌ "q" ¿É¼ÇÀÇ Ãß°¡ ÀÎÀڷΠ󸮵DZ⠶§¹®ÀÔ´Ï´Ù.
# 'scriptname -q -r'  - À§¿Í ¶È°°ÀÌ ¿øÄ¡ ¾Ê´Â °á°ú.
# ¾î¶² ¿É¼Ç¿¡ Ãß°¡ ÀÎÀÚ("flag:")°¡ ÇÊ¿äÇÏ´Ù°í ¼³Á¤ÀÌ µÇ¸é 
# ¸í·É¾îÁÙ¿¡¼­ Àڱ⠹ٷΠ´ÙÀ½¿¡ ³ª¿À´Â °ÍÀ» ¹«Á¶°Ç ÀÚ½ÅÀÇ ÀÎÀÚ·Î ¹Þ¾ÆµéÀÔ´Ï´Ù.

NO_ARGS=0 
OPTERROR=65

if [ $# -eq "$NO_ARGS" ]  # ÀÎÀÚ ¾øÀÌ ºÒ·È±º¿ä.
then
  echo "»ç¿ë¹ý: `basename $0` options (-mnopqrs)"
  exit $OPTERROR          # ÀÎÀÚ°¡ ÁÖ¾îÁöÁö ¾Ê¾Ò´Ù¸é »ç¿ë¹ýÀ» ¾Ë·ÁÁÖ°í Á¾·á.
fi  
# »ç¿ë¹ý: scriptname -options
# ÁÖÀÇ: ´ë½¬(-)°¡ ÇÊ¿äÇÕ´Ï´Ù.


while getopts ":mnopq:rs" Option
do
  case $Option in
    m     ) echo "1¹ø ½Ã³ª¸®¿À: option -m-";;
    n | o ) echo "2¹ø ½Ã³ª¸®¿À: option -$Option-";;
    p     ) echo "3¹ø ½Ã³ª¸®¿À: option -p-";;
    q     ) echo "4¹ø ½Ã³ª¸®¿À: option -q-, \"$OPTARG\"¸¦ Á༭";;
    # 'q' ¿É¼ÇÀº Ãß°¡ ÀÎÀÚ°¡ ÀÖ¾î¾ß Çϴµ¥ ¾ø´Ù¸é µðÆúÆ®·Î 󸮵˴ϴÙ.
    r | s ) echo "5¹ø ½Ã³ª¸®¿À: option -$Option-"'';;
    *     ) echo "±¸ÇöµÇÁö ¾ÊÀº ¿É¼ÇÀÌ ¼±ÅõƽÀ´Ï´Ù.";;   # µðÆúÆ®
  esac
done

shift $(($OPTIND - 1))
# ÀÎÀÚ Æ÷ÀÎÅ͸¦ °¨¼Ò½ÃÄѼ­ ´ÙÀ½ ÀÎÀÚ¸¦ °¡¸£Å°°Ô ÇÕ´Ï´Ù.

exit 0

½ºÅ©¸³Æ® µ¿ÀÛ

source, . (Á¡(dot) ¸í·É¾î)

ÀÌ ¸í·É¾î°¡ ¸í·É¾î ÁÙ¿¡¼­ ºÒ¸°´Ù¸é ÇØ´ç ½ºÅ©¸³Æ®¸¦ ½ÇÇà ½Ãŵ´Ï´Ù. ½ºÅ©¸³Æ®¿¡¼­ source file-nameÀ̶ó°í ºÒ¸°´Ù¸é file-nameÀ» ÀÐ¾î µéÀÏ °ÍÀÔ´Ï´Ù. C/C++ÀÇ #include Áö½ÃÀÚ¿Í °°Àº ¿ªÇÒÀ» ÇÕ´Ï´Ù. ¿©·¯°³ÀÇ ½ºÅ©¸³Æ®°¡ °øÅëÀ¸·Î ¾²ÀÌ´Â µ¥ÀÌŸ ÆÄÀÏÀ̳ª ÇÔ¼ö ¶óÀ̺귯¸®¸¦ ½á¾ß ÇÒ °æ¿ì°°Àº »óȲ¿¡¼­ À¯¿ëÇÕ´Ï´Ù.

¿¹ 11-14. µ¥ÀÌŸ ÆÄÀÏ "Æ÷ÇÔÇϱâ"

#!/bin/bash

. data-file    # µ¥ÀÌŸ ÆÄÀÏ ·Îµå.
# "source data-file"À̶ó°í ÇÏ´Â °Í°ú °°Áö¸¸, ÀÌ°Ô Á» ´õ À̽ļº ÀÖ´Â ¹æ¹ýÀÔ´Ï´Ù.

# "data-file"Àº 'basename'À¸·Î ÂüÁ¶µÇ±â ¶§¹®¿¡ ÇöÀç µð·ºÅ丮¿¡ ²À ÀÖ¾î¾ß µË´Ï´Ù.

# ÀÌÁ¦ ±× ÆÄÀÏ¿¡ µé¾î ÀÖ´Â ¸î°³ÀÇ µ¥ÀÌŸ¸¦ ÂüÁ¶ÇØ º¸°Ú½À´Ï´Ù.

echo "variable1 (data-file ¿¡ ÀÖ´Â º¯¼ö) = $variable1"
echo "variable3 (data-file ¿¡ ÀÖ´Â º¯¼ö) = $variable3"

let "sum = $variable2 + $variable4"
echo "variable2 + variable4 (data-file ¿¡ ÀÖ´Â º¯¼ö) = $sum"
echo "message1 (data-file ¿¡ ÀÖ´Â º¯¼ö) Àº \"$message1\""
# ÁÖÀÇ:                                    À̽ºÄÉÀÌÇÁµÈ Äõ¿ìÆ®

print_message ÀÌ°ÍÀº data-file ÀÇ message-print ÇÔ¼ö°¡ º¸¿©ÁÖ´Â ¸Þ¼¼ÁöÀÔ´Ï´Ù.


exit 0

À§ÀÇ ¿¹ 11-14¿¡¼­ data-fileÀº °°Àº µð·ºÅ丮¿¡ ÀÖ¾î¾ß ÇÕ´Ï´Ù.

# error free
# (¿Å±äÀÌ:
# Á¦ÀÏ À­ÁÙ¿¡ ÇѱÛÀÌ µé¾î°¡ ÀÖÀ¸¸é file data-file À̶ó°í ÇßÀ» ¶§ 
# data-file: International language text
# ¶ó°í ³ª¿À³×¿ä. ÀÌ°Í ¶§¹®ÀÎÁö ¿¹Á¦¿¡¼­ ÀÌ ÆÄÀÏÀ» . ÇÏ¸é ¿¡·¯°¡ ³³´Ï´Ù.
# ¸Ç À§ÀÇ error free ´Â ÀÌ ¿¡·¯¸¦ ÇÇÇϱâ À§ÇÑ °ÍÀÔ´Ï´Ù.)
#
#
# ÀÌ°ÍÀº ½ºÅ©¸³Æ®¿¡ ÀÇÇØ ÀÐÈ÷´Â µ¥ÀÌŸ ÆÄÀÏÀÔ´Ï´Ù.
# ÀÌ·± Á¾·ùÀÇ ÆÄÀÏÀº º¸Åë º¯¼ö³ª ÇÔ¼öµîÀ» ´ã°í ÀÖ½À´Ï´Ù.
# ½© ½ºÅ©¸³Æ®¿¡ ÀÇÇØ 'source'³ª '.'·Î ÀûÀçµÉ ¼ö ÀÖ½À´Ï´Ù.

# º¯¼ö¸¦ ÃʱâÈ­ ÇսôÙ.

variable1=22
variable2=474
variable3=5
variable4=97

message1="¾È³ç, Àß Áö³Â¾î?"
message2="ÀÌÁ¨ µÆ¾î. ¾È³ç."

print_message ()
{
# ³Ñ¾î¿Â ¾î¶² ¸Þ¼¼Áöµµ ´Ù ¿¡ÄÚ½ÃÅ´.

  if [ -z "$1" ]
  then
    return 1
    # ÀÎÀÚ°¡ ¾øÀ¸¸é ¿¡·¯.
  fi

  echo

  until [ -z "$1" ]
  do
    # ÇÔ¼ö·Î ³Ñ¾î¿Â ÀÎÀÚ¸¦ Çϳª¾¿ ¸ðµÎ ó¸®.
    echo -n "$1"
    # ¶óÀÎ Çǵ带 ¾ø¾Ö¸é¼­ ÇÑ ¹ø¿¡ Çϳª¾¿ ¿¡ÄÚ.
    echo -n " "
    # ³¹¸» »çÀÌ¿¡ ºó Ä­À» Áý¾î ³ÖÀ½.
    shift
    # ´ÙÀ½.
  done  

  echo

  return 0
}  
exit

½ºÅ©¸³Æ®¸¦ ¹«Á¶°Ç ³¡³¿. exit´Â Á¤¼ö°ªÀ» ÀÎÀÚ·Î ¹Þ¾Æ¼­ ½©¿¡°Ô ½ºÅ©¸³Æ®ÀÇ Á¾·á »óŸ¦ ¾Ë·ÁÁÙ ¼öµµ ÀÖ½À´Ï´Ù. ¾ÆÁÖ °£´ÜÇÑ ½ºÅ©¸³Æ®°¡ ¾Æ´Ï¶ó¸é ½ºÅ©¸³Æ®ÀÇ ¸¶Áö¸·¿¡ exit 0ó·³ ¼º°øÀûÀÎ ½ÇÇàÀ» ¾Ë·Á ÁÖ´Â °ÍÀº ¾ÆÁÖ ÁÁÀº ½À°üÀÔ´Ï´Ù.

Âü°í: ¸¸¾à¿¡ exit°¡ ÀÎÀÚ ¾øÀÌ ¾²ÀÎ´Ù¸é ±× ½ºÅ©¸³Æ®ÀÇ Á¾·á »óÅ´ exit¸¦ Á¦¿ÜÇÏ°í °¡Àå ¸¶Áö¸·¿¡ ½ÇÇàµÈ ¸í·É¾îÀÇ Á¾·á »óÅ·ΠµË´Ï´Ù.

exec

ÀÌ ½© ³»ºÎ ¸í·ÉÀº ÇöÀçÀÇ ÇÁ·Î¼¼½º¸¦ ÁÖ¾îÁø ¸í·É¾î·Î ´ëÄ¡½Ãŵ´Ï´Ù. º¸ÅëÀº ½©ÀÌ ¾î¶² ¸í·É¾î¸¦ ¸¸³ª¸é ±× ¸í·É¾î¸¦ ½ÇÇàÇϱâ À§Çؼ­ ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ Æ÷Å© [3] ½Ãŵ´Ï´Ù. ÇÏÁö¸¸ exec ³»Àå ¸í·ÉÀº Æ÷Å©¸¦ ÇÏÁö ¾Ê°í execµÈ ±× ¸í·É¾î·Î ½© ÀÚü¸¦ ´ëÄ¡½Ãŵ´Ï´Ù. ±×·¸±â ¶§¹®¿¡ ½ºÅ©¸³Æ®¿¡¼­ ÀÌ ¸í·É¾î°¡ ¾²À̸é execµÈ ¸í·É¾î°¡ Á¾·áÇÒ ¶§ ½ºÅ©¸³Æ®°¡ °­Á¦·Î Á¾·áµË´Ï´Ù. ÀÌ·± ÀÌÀ¯·Î, execÀ» ½ºÅ©¸³Æ®¿¡¼­ ¾²·Á¸é ¾Æ¸¶µµ Á¦ÀÏ ¸¶Áö¸· ¸í·É¾î·Î ½á¾ß ÇÒ °Ì´Ï´Ù.

exec´Â ¶ÇÇÑ ÆÄÀÏ µð½ºÅ©¸³Å͸¦ ÀçÇÒ´ç ÇÒ ¶§µµ ¾²ÀÔ´Ï´Ù. exec <zzz-fileÀº Ç¥ÁØÀÔ·ÂÀ» zzz-fileÀ¸·Î ¹Ù²ãÁÝ´Ï´Ù(¿¹ 16-1 Âü°í).

¿¹ 11-15. exec È¿°ú

#!/bin/bash

exec echo "\"$0\" ¸¦ Á¾·áÇÕ´Ï´Ù."   # ½ºÅ©¸³Æ®¿¡¼­ Á¾·á.

# ´ÙÀ½ ÁÙÀº Àý´ë ½ÇÇàµÇÁö ¾Ê½À´Ï´Ù.

echo "¿©±â´Â Àý´ë ¿¡ÄÚµÇÁö ¾Ê½À´Ï´Ù."

exit 0  # ¿ª½Ã, ¿©±â¼­ Á¾·áµÇÁöµµ ¾Ê°í¿ä.

Âü°í: find ¸í·É¾îÀÇ -exec ¿É¼ÇÀº exec ½© ³»Àå ¸í·É°ú ´Ù¸¨´Ï´Ù.

shopt

ÀÌ ¸í·É¾î´Â ½©ÀÌ ½ÇÇàÁß¿¡ ¿É¼ÇÀ» ¹Ù²Ü ¼ö ÀÖ°Ô ÇØ ÁÝ´Ï´Ù(¿¹ 24-1°ú ¿¹ 24-2 Âü°í). ÀÌ´Â Á¾Á¾ Bash ½Ã½ºÅÛ ±¸µ¿ ÆÄÀÏ(startup files)¿¡¼­ ¾²ÀÌ´Â µ¥ ÀÏ¹Ý ½ºÅ©¸³Æ®¿¡¼­µµ ¾²ÀÏ ¼ö ÀÖ½À´Ï´Ù. ÀÌ ¸í·É¾î´Â bash ¹öÀü 2³ª ±× ´ÙÀ½ ¹öÀüºÎÅÍ ¾µ ¼ö ÀÖ½À´Ï´Ù..
shopt -s cdspell
# 'cd'¸¦ ¾µ ¶§ µð·ºÅ丮 À̸§ÀÌ ¾à°£ Ʋ¸° °Í Á¤µµ´Â ÀÚµ¿À¸·Î °íÃÄÁÝ´Ï´Ù.

¸í·É¾î

true

´Ü¼øÈ÷ ¼º°øÀû(0)ÀÎ Á¾·á »óŸ¦ ¸®ÅÏÇÏ´Â ¸í·É¾î.

# ¹«ÇÑ ·çÇÁ
while true   # ":" ÀÇ º°Äª(alias)
do
   operation-1
   operation-2
   ...
   operation-n
   # ·çÇÁ¸¦ ºüÁ® ³ª°¥ ¹æ¹ýÀÌ ÇÊ¿ä.
done

false

´Ü¼øÈ÷ ½ÇÆÐÇÑ Á¾·á »óŸ¦ ¸®ÅÏÇÏ´Â ¸í·É¾î.

# ³Î ·çÇÁ
while false
do
   # ÀÌ ºÎºÐÀº ½ÇÇàµÇÁö ¾ÊÀ½.
   operation-1
   operation-2
   ...
   operation-n
   # ¾Æ¹« Àϵµ ¾È ÀϾ´Ï´Ù!
done   

type [cmd]

¿ÜºÎ ¸í·É¾îÀÎ which¿Í ºñ½ÁÇÏ°Ô ÁÖ¾îÁø "cmd"ÀÇ ¿ÏÀüÇÑ °æ·Î¸íÀ» º¸¿© ÁÝ´Ï´Ù. ÇÏÁö¸¸, which¿Í´Â ´Ù¸£°Ô type´Â bash ³»Àå ¸í·ÉÀÔ´Ï´Ù. À¯¿ëÇÑ ¿É¼ÇÀÎ -a¸¦ ÁÖ¸é ÁÖ¾îÁø "cmd"°¡ Å°¿öµåÀÎÁö ³»Àå ¸í·ÉÀÎÁö¸¦ ¾Ë·ÁÁÖ°í ¶È°°Àº À̸§ÀÇ ½Ã½ºÅÛ ¸í·É¾î°¡ ÀÖ´Ù¸é ±× À§Ä¡µµ ¾Ë·ÁÁÝ´Ï´Ù.

bash$ type '['
[ is a shell builtin
bash$ type -a '['
[ is a shell builtin
[ is /usr/bin/[
	      

hash [cmds]

ÁÖ¾îÁø ¸í·É¾îÀÇ °æ·Î¸íÀ» ½© Çؽ¬ Å×ÀÌºí¿¡ ÀúÀåÇؼ­ ±× ¸í·É¾î°¡ ´Ù½Ã ºÒ¸± ¶§ $PATH¿¡¼­ ãÁö ¾Êµµ·Ï ÇØÁÝ´Ï´Ù. hash¸¦ ÀÎÀÚ ¾øÀÌ ¾²¸é ÀÚ½ÅÀÌ Çؽ¬ÇÏ°í ÀÖ´Â ¸ñ·ÏÀ» º¸¿©ÁÝ´Ï´Ù. -r ¿É¼ÇÀº Çؽ¬ Å×À̺íÀ» ÃʱâÈ­ ÇÕ´Ï´Ù.

help

help ¸í·É¾î´Â ½© ³»Àå ¸í·É¿¡ ´ëÇÑ °£·«ÇÑ »ç¿ë¹ýÀ» ¾Ë·ÁÁÝ´Ï´Ù. whatis¿Í µ¿ÀÏÇÏÁö¸¸ ³»Àå ¸í·É¿¡ ´ëÇؼ­ ¾²Àδٴ Á¡ÀÌ ´Ù¸¨´Ï´Ù.

bash$ help exit
exit: exit [n]
    Exit the shell with a status of N.  If N is omitted, the exit status
    is that of the last command executed.
	      

ÁÖ¼®

[1]

ÀÌ·¸°Ô ÇÏ´Â ÀÌÀ¯´Â ¼º´É»óÀÇ ¹®Á¦(º¸ÅëÀº fork¸¦ ÇØ¾ß ÇÏ´Â ¿ÜºÎ ¸í·É¾îº¸´Ù ´õ ºü¸£°Ô ½ÇÇà)À̰ųª ƯÁ¤ ³»ºÎ ¸í·ÉÀÇ °æ¿ì¿¡ ½© ³»ºÎ º¯¼ö·Î Á÷Á¢ Á¢±ÙÇÒ ÇÊ¿ä°¡ Àֱ⠶§¹®ÀÔ´Ï´Ù.

[2]

¿É¼ÇÀº Ç÷¡±×ó·³ µ¿ÀÛÇÏ´Â ÀÎÀڷμ­ ½ºÅ©¸³Æ®ÀÇ ÇൿÀ» Å°°Å³ª ²¨ ÁÝ´Ï´Ù. ƯÁ¤ ¿É¼Ç°ú °ü·ÃÀÌ ÀÖ´Â ÀÎÀÚ´Â ±× ¿É¼Ç(Ç÷¡±×)ÀÌ ³ªÅ¸³»´Â ÇൿÀ» Å°°Å³ª ²ô°Ô ÇÕ´Ï´Ù.

[3]

¸í·É¾î³ª ½© ÀÚ½ÅÀÌ ¾î¶² ÀÛ¾÷À» ¼öÇàÇϱâ À§ÇØ »õ·Î¿î ÇÏÀ§ ÇÁ·Î¼¼½º¸¦ ÃʱâÈ­(ȤÀº spawn)ÇÏ´Â °ÍÀ» Æ÷Å©(fork)¶ó°í ÇÕ´Ï´Ù. ÀÌ ¶§, »õ·Ó°Ô »ý±ä ÇÁ·Î¼¼½º¸¦ "ÀÚ½Ä" ÇÁ·Î¼¼½º¶ó°í ÇÏ°í, ±× ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ Æ÷Å©ÇÑ ÇÁ·Î¼¼½º¸¦ "ºÎ¸ð" ÇÁ·Î¼¼½º¶ó°í ÇÕ´Ï´Ù. ÀÚ½Ä ÇÁ·Î¼¼½º°¡ Àڽſ¡°Ô ÁÖ¾îÁø ÀÏÀ» ÇÏ´Â µ¿¾È ºÎ¸ð ÇÁ·Î¼¼½ºµµ °è¼Ó ÀÚ½ÅÀÇ ÀÏÀ» ÇØ ³ª°©´Ï´Ù.