9.1. ³»ºÎ º¯¼ö(Internal Variables)

³»Àå(Builtin) º¯¼ö

Bash ½ºÅ©¸³Æ®ÀÇ µ¿ÀÛ¿¡ ¿µÇâÀ» ¹ÌÄ¡´Â º¯¼ö

$BASH

Bash ½ÇÇà ÆÄÀÏÀÇ °æ·Î·Î, º¸ÅëÀº /bin/bashÀÓ

$BASH_ENV

½ºÅ©¸³Æ®°¡ ½ÇÇàµÉ ¶§ ¾îµð¿¡¼­ bash ½ÃÀÛ ÆÄÀÏÀ» ÀÐÀ» °ÍÀÎÁö¸¦ ³ªÅ¸³»´Â ȯ°æ º¯¼ö

$BASH_VERSINFO[n]

¿ø¼Ò °¹¼ö°¡ 6°³ÀÎ ¹è¿­·Î, ÇöÀç ¼³Ä¡µÈ Bash ¹öÀü¿¡ ´ëÇÑ Á¤º¸¸¦ ´ã°í ÀÖ½À´Ï´Ù. ´ÙÀ½¿¡ ¼³¸íÇÒ $BASH_VERSION °ú ºñ½ÁÇÏÁö¸¸ Á» ´õ ÀÚ¼¼ÇÑ Á¤º¸¸¦ ´ã°í ÀÖ½À´Ï´Ù.

# Bash ¹öÀü Á¤º¸:

for n in 0 1 2 3 4 5
do
  echo "BASH_VERSINFO[$n] = ${BASH_VERSINFO[$n]}"
done  

# BASH_VERSINFO[0] = 2                      # Major version no.
# BASH_VERSINFO[1] = 04                     # Minor version no.
# BASH_VERSINFO[2] = 21                     # Patch level.
# BASH_VERSINFO[3] = 1                      # Build version.
# BASH_VERSINFO[4] = release                # Release status.
# BASH_VERSINFO[5] = i386-redhat-linux-gnu  # Architecture
                                            # ($MACHTYPE °ú µ¿ÀÏ).

$BASH_VERSION

½Ã½ºÅÛ¿¡ ¼³Ä¡µÈ Bash ¹öÀü

bash$ echo $BASH_VERSION
2.04.12(1)-release
	      

tcsh% echo $BASH_VERSION
BASH_VERSION: Undefined variable.
	      

¾î¶² ½©·Î µ¿ÀÛÁßÀÎÁö ¾Ë¾Æº¸·Á°í ÇÒ ¶§ $BASH_VERSION À» È®ÀÎÇØ º¸´Â °ÍÀº ¾ÆÁÖ ÁÁÀº ¹æ¹ýÀÔ´Ï´Ù. ¿Ö³ÄÇϸé, $SHELL ·Î´Â ÃæºÐÇÑ Á¤º¸¸¦ ¾òÀ» ¼ö ¾ø±â ¶§¹®ÀÔ´Ï´Ù.

$DIRSTACK

µð·ºÅ丮 ½ºÅÃÀÇ ³»¿ë(pushd¿Í popdÀÇ ¿µÇâÀ» ¹ÞÀ½)

ÀÌ ³»Àå º¯¼ö´Â dirs ¸í·É¾î¿Í ¦À» ÀÌ·ì´Ï´Ù.

$EDITOR

½ºÅ©¸³Æ®°¡ ºÎ¸£´Â ¿¡µðÅͷμ­, º¸ÅëÀº vi³ª emacsÀÔ´Ï´Ù.

$EUID

"À¯È¿" »ç¿ëÀÚ ¾ÆÀ̵𠰪

su¿¡ ÀÇÇØ ¾²ÀÏ ÇöÀç »ç¿ëÀÚÀÇ À¯È¿ ¾ÆÀ̵𠰪.

°æ°í

$EUID´Â $UID¿Í ¹Ýµå½Ã °°Áö ¾Ê½À´Ï´Ù.

$FUNCNAME

ÇöÀç ÇÔ¼öÀÇ À̸§

xyz23 ()
{
  echo "$FUNCNAME now executing."  # xyz23 now executing.
}

xyz23

echo "FUNCNAME = $FUNCNAME"        # FUNCNAME =
                                   # ÇÔ¼ö ¹Û¿¡¼­´Â ³Î °ªÀ» °®½À´Ï´Ù.

$GLOBIGNORE

globbing ½Ã Æ÷ÇÔµÇÁö ¾ÊÀ» ÆÄÀÏ¸í ÆÐÅϵéÀÇ ¸ñ·Ï.

$GROUPS

ÇöÀç »ç¿ëÀÚ°¡ ¼ÓÇØ ÀÖ´Â ±×·ì

/etc/passwd¿¡ ÀûÇô ÀÖ´Â ÇöÀç »ç¿ëÀÚÀÇ ±×·ì ¾ÆÀ̵𠰪À» º¸¿©ÁÝ´Ï´Ù.

$HOME

»ç¿ëÀÚÀÇ È¨ µð·ºÅ丮·Î, º¸ÅëÀº /home/username (¿¹ 9-10 Âü°í)

$HOSTNAME

hostname ¸í·É¾î´Â ºÎÆÃ½Ã init ½ºÅ©¸³Æ®¿¡¼­ ½Ã½ºÅÛ À̸§À» ¼³Á¤ÇØ ÁÝ´Ï´Ù. ÇÏÁö¸¸ gethostname() ÇÔ¼ö·Î bash ³»ºÎ º¯¼öÀÎ $HOSTNAMEÀ» ¼³Á¤ÇØ ÁÙ ¼öµµ ÀÖ½À´Ï´Ù. ¿¹ 9-10À» Âü°íÇϼ¼¿ä.

$HOSTTYPE

host type

$MACHTYPE°ú ¸¶Âù°¡Áö·Î ½Ã½ºÅÛ Çϵå¿þ¾î¸¦ ¾Ë·ÁÁÝ´Ï´Ù.

bash$ echo $HOSTTYPE
i686
$IFS

ÀÔ·Â ÇÊµå ±¸ºÐÀÚ

µðÆúÆ®´Â °ø¹é¹®ÀÚ(ºóÄ­, ÅÇ, ´º¶óÀÎ)Áö¸¸ ÄÞ¸¶·Î ±¸ºÐµÈ µ¥ÀÌŸ ÆÄÀÏÀ» ÆÄ½ÌÇÏ·Á´Â °æ¿ìó·³ º¯°æÀÌ °¡´ÉÇÕ´Ï´Ù. $*´Â $IFSÀÇ Ã¹¹øÂ° ¹®ÀÚ¸¦ »ç¿ëÇÏ´Â °Í¿¡ ÁÖÀÇÇϼ¼¿ä. ¿¹ 6-1 Âü°í.

bash$ echo $IFS | cat -vte
$


bash$ bash -c 'set w x y z; IFS=":-;"; echo "$*"'
w:x:y:z
	      

°æ°í

$IFS ´Â ºó Ä­À» ´Ù¸¥ ¹®ÀÚµé°ú´Â ´Ù¸£°Ô ó¸®ÇÕ´Ï´Ù.

¿¹ 9-1. $IFS ¿Í ºó Ä­

#!/bin/bash
# $IFS ´Â °ø¹é¹®ÀÚ¸¦ ´Ù¸¥ ¹®ÀÚµé°ú ´Ù¸£°Ô ó¸®ÇÕ´Ï´Ù.

output_args_one_per_line()
{
  for arg
  do echo "[$arg]"
  done
}

echo; echo "IFS=\" \""
echo "-------"

IFS=" "
var=" a  b c   "
output_args_one_per_line $var  # output_args_one_per_line `echo " a  b c   "`
#
# [a]
# [b]
# [c]


echo; echo "IFS=:"
echo "-----"

IFS=:
var=":a::b:c:::"               # À§¿Í °°Áö¸¸ ":" ¸¦ " "·Î ¹Ù²ãÁÝ´Ï´Ù.
output_args_one_per_line $var
#
# []
# [a]
# []
# [b]
# [c]
# []
# []
# []

# awk ÀÇ "FS" ÇÊµå ±¸ºÐÀÚµµ À§¿Í °°Àº µ¿ÀÛÀ» ÇÕ´Ï´Ù.

# Thank you, Stephane Chazelas.

echo

exit 0

(S. C. ¿¡°Ô Á¤È®ÇÑ ¼³¸í°ú ¿¹Á¦¿¡ °¨»ç.)

$IGNOREEOF

EOF ¹«½Ã: ·Î±× ¾Æ¿ôÇϱâ Àü¿¡ ¸î °³ÀÇ end-of-files (control-D)¸¦ ¹«½ÃÇÒ °ÍÀÎÁö.

$LC_COLLATE

ÁÖ·Î .bashrc ³ª /etc/profile ¿¡¼­ ¼¼Æ®µÇ´Â ÀÌ º¯¼ö´Â ÆÄÀϸí È®ÀåÀ̳ª ÆÐÅÏ ¸ÅνÃÀÇ ´ëÁ¶(collation) ¼ø¼­¸¦ Á¦¾îÇÕ´Ï´Ù. ÀÌ °ªÀÌ À߸ø ó¸®µÇ¸é ÆÄÀϸí globbing½Ã ¿øÄ¡ ¾Ê´Â °á°ú¸¦ °¡Á® ¿Ã ¼ö ÀÖ½À´Ï´Ù.

Âü°í: Bash 2.05 ÀÌÈÄ·Î, ÆÄÀϸí globbing Àº ´ë°ýÈ£¿¡ µé¾î ÀÖ´Â ¹®ÀÚ ¹üÀ§¿¡ ³ªÅ¸³ª´Â ´ë¼Ò¹®ÀÚ¸¦ ´õ ÀÌ»ó ±¸ºÐÇÏÁö ¾Ê½À´Ï´Ù. ¿¹¸¦ µé¾î, ls [A-M]* Àº File2.txt¿Í file1.txt ¸ðµÎ¿Í ÀÏÄ¡µÉ °ÍÀÔ´Ï´Ù. ÀڽŸ¸ÀÇ ´ë°ýÈ£ ¸ÅĪ µ¿ÀÛÀ» ¿ø·¡´ë·Î ¹Ù²Ù·Á¸é /etc/profileÀ̳ª ~/.bashrcµî¿¡ export LC_COLLATE=C ¶ó°í ÇØ¼­ LC_COLLATEÀ» C·Î ¼¼Æ®ÇØ ÁÖ¸é µË´Ï´Ù.

$LC_CTYPE

ÀÌ ³»ºÎ º¯¼ö´Â globbing °ú ÆÐÅÍ ¸ÅĪÀÇ ¹®ÀÚ ÇØ¼®À» Á¦¾îÇÕ´Ï´Ù.

$LINENO

½© ½ºÅ©¸³Æ®¿¡¼­ ÀÌ º¯¼ö°¡ µé¾î ÀÖ´Â ÁÙÀÇ ÁÙ¹øÈ£¸¦ ³ªÅ¸³»´Âµ¥, ½ºÅ©¸³Æ®¿¡¼­ ¾²ÀÏ ¶§¸¸ Àǹ̰¡ ÀÖ°í, ÁÖ·Î µð¹ö±ë¿¡ ¾²ÀÔ´Ï´Ù.

last_cmd_arg=$_  # ÀúÀå.

echo "$LINENO ¹øÂ° ÁÙ, º¯¼ö \"v1\" = $v1"
echo "ó¸®µÈ ¸¶Áö¸· ¸í·É¾î ÀÎÀÚ = $last_cmd_arg"

$MACHTYPE

¸Ó½Å Á¾·ù

½Ã½ºÅÛ Çϵå¿þ¾î¸¦ ±¸ºÐÇØ ÁÝ´Ï´Ù.

bash$ echo $MACHTYPE
i686-debian-linux-gnu
$OLDPWD

¹Ù·Î Àü ÀÛ¾÷ µð·ºÅ丮 ("OLD-print-working-directory")

$OSTYPE

¿î¿µ üÁ¦ Á¾·ù

bash$ echo $OSTYPE
linux-gnu
$PATH

½ÇÇà ÆÄÀÏÀÇ °æ·Î, º¸ÅëÀº /usr/bin/, /usr/X11R6/bin/, /usr/local/bin, µîµî.

¸í·É¾î°¡ ÁÖ¾îÁö¸é ½©Àº ½ÇÇà ÆÄÀϵéÀ» À§ÇÑ °æ·Î¿¡ µé¾îÀÖ´Â µð·ºÅ丮µé¿¡ ´ëÇØ¼­ ÀÚµ¿À¸·Î ÇØ½¬ Å×À̺í Ž»öÀ» ¼öÇàÇÕ´Ï´Ù. °æ·Î¿¡´Â ȯ°æ º¯¼öÀÎ $PATH¿¡ µð·ºÅ丮µéÀÌ ÄÝ·ÐÀ¸·Î ±¸ºÐµÇ¾î µé¾î ÀÖ½À´Ï´Ù. º¸Åë $PATH Á¤ÀÇ´Â /etc/profileÀ̳ª ~/.bashrc¿¡ µé¾î ÀÖ½À´Ï´Ù(27Àå Âü°í).

bash$ echo $PATH
/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin:/sbin:/usr/sbin

PATH=${PATH}:/opt/bin ¶ó°í Çϸé /opt/binÀ» ÇöÀç °æ·Î¿¡ Ãß°¡ ½Ãŵ´Ï´Ù. ÀÌ·¸°Ô ÇÏ¸é °æ·Î¿¡ Àӽ÷Πµð·ºÅ丮¸¦ ÀûÀýÇÏ°Ô Ãß°¡ÇÒ ¼ö ÀÖ½À´Ï´Ù. ½ºÅ©¸³Æ®°¡ ³¡³ª¸é ¿ø·¡ $PATH ·Î º¹±¸µË´Ï´Ù(½ºÅ©¸³Æ®°°Àº ÀÚ½Ä ÇÁ·Î¼¼½º´Â ºÎ¸ð ÇÁ·Î¼¼½ºÀÎ ½©ÀÇ È¯°æ º¯¼ö¸¦ ¹Ù²Ü ¼ö ¾ø½À´Ï´Ù).

Âü°í: º¸ÅëÀº ÇöÀç "ÀÛ¾÷ µð·ºÅ丮"¸¦ ³ªÅ¸³»´Â ./Àº º¸¾È»óÀÇ ÀÌÀ¯·Î $PATH¿¡¼­ Á¦¿Ü½Ãŵ´Ï´Ù.

$PIPESTATUS

¸¶Áö¸·À¸·Î ½ÇÇàµÈ ÆÄÀÌÇÁÀÇ Á¾·á »óÅÂ. ¾ÆÁÖ Àç¹ÌÀÖ´Â °ÍÀº, ÀÌ °á°ú¿Í ¸¶Áö¸·À¸·Î ½ÇÇàµÈ ¸í·É¾îÀÇ Á¾·á »óŰ¡ ¶È°°Áö´Â ¾Ê´Ù´Â °ÍÀÔ´Ï´Ù.

bash$ echo $PIPESTATUS
0

bash$ ls -al | bogus_command
bash: bogus_command: command not found
bash$ echo $PIPESTATUS
141

bash$ ls -al | bogus_command
bash: bogus_command: command not found
bash$ echo $?
127
	      

$PPID

¾î¶² ÇÁ·Î¼¼½ºÀÇ ºÎ¸ð ÇÁ·Î¼¼½ºÀÇ ÇÁ·Î¼¼½º ¾ÆÀ̵ð(pid)¸¦ $PPIDÀ̶ó°í ÇÕ´Ï´Ù. [1]

À̰͵éÀ» pidof ¸í·É¾î¿Í ºñ±³ÇØ º¸¼¼¿ä.

$PS1

¸í·É¾îÁÙ¿¡¼­ º¼ ¼ö ÀÖ´Â ¸ÞÀÎ ÇÁ·ÒÇÁÆ®.

$PS2

2Â÷ ÇÁ·ÒÇÁÆ®·Î, Ãß°¡ÀûÀÎ ÀÔ·ÂÀÌ ÇÊ¿äÇÒ ¶§ ">" ·Î Ç¥½ÃµË´Ï´Ù.

$PS3

3Â÷ ÇÁ·ÒÇÁÆ®·Î select ·çÇÁ¹®¿¡¼­ Ç¥½ÃµË´Ï´Ù(¿¹ 10-27 Âü°í).

$PS4

4Â÷ ÇÁ·ÒÇÁÆ®·Î, ½ºÅ©¸³Æ®¿¡ -x ¿É¼ÇÀÌ °É·Á¼­ ½ÇÇàµÉ ¶§ ½ºÅ©¸³Æ®ÀÇ ¸Å ÁÙ¸¶´Ù "+"·Î Ç¥½ÃµË´Ï´Ù.

$PWD

ÀÛ¾÷ µð·ºÅ丮(ÇöÀç ÀÖ´Â µð·ºÅ丮)

³»Àå ¸í·ÉÀÎ pwd¿Í ºñ½ÁÇÕ´Ï´Ù.

#!/bin/bash

E_WRONG_DIRECTORY=73

clear # È­¸é Á¤¸®.

TargetDirectory=/home/bozo/projects/GreatAmericanNovel

cd $TargetDirectory
echo "$TargetDirectory µð·ºÅ丮ÀÇ ¿À·¡µÈ ÆÄÀÏÀ» Áö¿ó´Ï´Ù."

if [ "$PWD" != "$TargetDirectory" ]
then    # ½Ç¼ö·Î ´Ù¸¥ µð·ºÅ丮¸¦ Áö¿ìÁö ¾Ê°Ô ÇÕ´Ï´Ù.
  echo "Áö¿ï µð·ºÅ丮°¡ ¾Æ´Õ´Ï´Ù!"
  echo "$TargetDirectory µð·ºÅ丮°¡ ¾Æ´Ï¶ó $PWD µð·ºÅ丮ÀÔ´Ï´Ù,"
  echo "Ãë¼ÒÇÕ´Ï´Ù!"
  exit $E_WRONG_DIRECTORY
fi  

rm -rf *
rm .[A-Za-z0-9]*    # µµÆ® ÆÄÀÏ »èÁ¦.
# À̸§ÀÌ ¿©·¯°³ÀÇ Á¡À¸·Î ½ÃÀÛÇÏ´Â ÆÄÀϵµ Áö¿ì·Á¸é ÀÌ·¸°Ô Çϼ¼¿ä.   rm -f .[^.]* ..?*   
# (shopt -s dotglob; rm -f *)   ¶ó°í ÇØµµ µË´Ï´Ù.
# ÁöÀûÇØ Á༭ °í¸¶¿ö¿ä. S.C.

# ÆÄÀÏÀ̸§¿¡´Â "/"¸¦ Á¦¿ÜÇϰí 0 - 255 »çÀÌÀÇ ¸ðµç ¹®ÀÚ°¡ µé¾î°¥ ¼ö ÀÖ½À´Ï´Ù.
# ÀÌ»óÇÑ ¹®ÀÚ·Î ½ÃÀÛÇÏ´Â ÆÄÀÏÀ» Áö¿ì´Â °ÍÀº ¿¬½À¹®Á¦·Î ³²°Ü ³õ½À´Ï´Ù.

# ÇÊ¿äÇÏ´Ù¸é ´Ù¸¥ ÀÛ¾÷À» Çϼ¼¿ä.

echo
echo "³¡."
echo "$TargetDirectory µð·ºÅ丮ÀÇ ¿À·¡µÈ ÆÄÀÏÀ» ¸ðµÎ »èÁ¦Çß½À´Ï´Ù."
echo


exit 0

$REPLY

read¿¡ º¯¼ö°¡ ¾È ÁÖ¾îÁ³À» ¶§ ÀúÀåµÇ´Â ±âº»°ªÀ̰í, select ¸Þ´º¿¡¼­´Â º¯¼öÀÇ °ªÀÌ ¾Æ´Ï¶ó ¼±ÅÃÇÑ ¼ýÀÚ°¡ ÀúÀåµË´Ï´Ù.

#!/bin/bash

echo
echo -n "Á¦ÀÏ ÁÁ¾ÆÇÏ´Â ¾ßä°¡ ¹¹¿¡¿ä? "
read

echo "Á¦ÀÏ ÁÁ¾ÆÇÏ´Â ¾ßä°¡ $REPLY ±º¿ä."
# REPLY ´Â °¡Àå ÃÖ±ÙÀÇ "read"°¡ º¯¼ö ¾øÀÌ ÁÖ¾îÁ³À» ¶§ ±× °ªÀ» ´ã°í ÀÖ½À´Ï´Ù.

echo
echo -n "Á¦ÀÏ ÁÁ¾ÆÇÏ´Â °úÀÏÀº¿ä? "
read fruit
echo "´ç½ÅÀÌ Á¦ÀÏ ÁÁ¾ÆÇÏ´Â °úÀÏÀº $fruit Áö¸¸,"
echo "\$REPLY ÀÇ °ªÀº ¿©ÀüÈ÷ $REPLY ³×¿ä."
# $fruit º¯¼ö°¡ "read"ÀÇ °ªÀ» °¡Á®°¡ ¹ö·È±â ¶§¹®¿¡ $REPLY ´Â ¿©ÀüÈ÷
# ¾Õ¿¡¼­ ¼³Á¤µÈ °ªÀ» °®°í ÀÖ½À´Ï´Ù.

echo

exit 0

$SECONDS

½ºÅ©¸³Æ®°¡ ¾ó¸¶³ª µ¹¾Ò´ÂÁö¸¦ ³ªÅ¸³»´Â ÃÊ ´ÜÀ§ ½Ã°£.

#!/bin/bash

ENDLESS_LOOP=1
INTERVAL=1

echo
echo "½ºÅ©¸³Æ®¸¦ ³¡³»·Á¸é Control-C ¸¦ ´©¸£¼¼¿ä."
echo

while [ $ENDLESS_LOOP ]
do
  if [ "$SECONDS" -eq 1 ]
  then
    units=second
  else  
    units=seconds
  fi

  echo "ÀÌ ½ºÅ©¸³Æ®´Â $SECONDS $units µ¿¾È µ¹°í ÀÖ½À´Ï´Ù."
  sleep $INTERVAL
done


exit 0

$SHELLOPTS

ÇöÀç ÄÑ ÀÖ´Â ½© ¿É¼ÇµéÀÇ ¸ñ·ÏÀ¸·Î¼­ Àбâ Àü¿ë º¯¼ö

$SHLVL

½© ·¹º§·Î Bash °¡ ¾ó¸¶³ª ±íÀÌ ÁßøµÇ¾î ÀÖ´ÂÁö¸¦ ³ªÅ¸³¿. ¸¸¾à¿¡ ¸í·É¾îÁÙ¿¡¼­ $SHLVL ÀÌ 1 À̾ú´Ù¸é ½ºÅ©¸³Æ®¿¡¼­´Â 2 °¡ µË´Ï´Ù.

$TMOUT

$TMOUT ȯ°æ º¯¼ö¸¦ 0 ÀÌ ¾Æ´Ñ °ª timeÀ¸·Î ¼³Á¤ÇØ ³õÀ¸¸é ±× ½Ã°£ÀÌ Áö³­ ´ÙÀ½¿¡´Â ·Î±×¾Æ¿ôÀÌ µË´Ï´Ù.

Âü°í: ºÒÇàÇϰԵµ ÀÌ º¯¼ö´Â ÄֻܼóÀÇ ½© ÇÁ·ÒÇÁÆ®³ª ¿¢½ºÅÒ(ÇÑÅÒ)¿¡¼­¸¸ µ¿ÀÛÇÕ´Ï´Ù. ¿¹¸¦ µé¾î, read ¹®¿¡¼­ $TMOUTÀ» °°ÀÌ ¾²°í ½Í°ÚÁö¸¸ ½ÇÁ¦·Î´Â Á¦´ë·Î µ¿ÀÛÇÏÁö ¾Ê½À´Ï´Ù.(ksh ¹öÀü¿¡¼­´Â readÀÇ Å¸ÀӾƿôÀÌ Á¦´ë·Î µ¿ÀÛÇÑ´Ù°í º¸°íµÈ ¹Ù ÀÖ½À´Ï´Ù).

ŸÀÓ ¾Æ¿ôÀ» ½© ½ºÅ©¸³Æ®¿¡¼­ ±¸ÇöÇÒ ¼ö´Â ÀÖÀ¸³ª ±×·¸°Ô È¿°úÀûÀÌÁö ¾Ê½À´Ï´Ù. ÇѰ¡Áö °¡´ÉÇÑ ¹æ¹ýÀº, ŸÀÓ ¾Æ¿ôÀÌ ³µÀ» ¶§ ŸÀÌ¹Ö ·çÇÁ°¡ ½ºÅ©¸³Æ®¿¡°Ô ½Ã±×³ÎÀ» º¸³»µµ·Ï ¼¼ÆÃÇØ¾ß Çϰí ŸÀÌ¹Ö ·çÇÁ°¡ ¹ß»ý½ÃŲ (¿¹ 30-4 Âü°í) ÀÎÅÍ·´Æ®¸¦ ó¸®ÇÒ ½Ã±×³Î ó¸® ·çƾµµ ¸¸µé¾î¾ß ÇÕ´Ï´Ù, ÈÞ~~.

¿¹ 9-2. ŸÀÓ ¾Æ¿ô ó¸® ÀÔ·Â

#!/bin/bash
# timed-input.sh

# TMOUT=3            ½ºÅ©¸³Æ®¿¡¼­´Â ¾µ¸ð°¡ ¾ø½À´Ï´Ù.

TIMELIMIT=3  # ¿©±â¼­´Â 3ÃÊ, ´Ù¸¥ °ªÀ¸·Î ¼¼Æ®ÇÒ ¼ö ÀÖ½À´Ï´Ù.

PrintAnswer()
{
  if [ "$answer" = TIMEOUT ]
  then
    echo $answer
  else       # µÎ ¹øÀÇ ÀνºÅϽº¸¦ ±¸ºÐÇϱâ À§Çؼ­.
    echo "Á¦ÀÏ ÁÁ¾ÆÇÏ´Â ¾ßä´Â $answer À̱º¿ä."
    kill $!  # ¹é±×¶ó¿îµå¿¡¼­ µµ´Â TimerOn ÇÔ¼ö°¡ ´õ ÀÌ»ó ÇÊ¿ä¾ø±â ¶§¹®¿¡ kill ½ÃÅ´.
             # $! ´Â ¹é±×¶ó¿îµå¿¡¼­ µ¹°í ÀÖ´Â °¡Àå ÃÖ±Ù ÀÛ¾÷ÀÇ PID ÀÔ´Ï´Ù.
  fi

}  



TimerOn()
{
  sleep $TIMELIMIT && kill -s 14 $$ &
  # 3Ãʸ¦ ±â´Ù¸®°í ¾Ë¶÷ ½Ã±×³Î(sigalarm)À» ½ºÅ©¸³Æ®¿¡ º¸³¿.
}  

Int14Vector()
{
  answer="TIMEOUT"
  PrintAnswer
  exit 14
}  

trap Int14Vector 14   # ŸÀÌ¸Ó ÀÎÅÍ·´Æ®(14)´Â ¿ì¸® Àǵµ´ë·Î ŸÀӾƿôÀ» ó¸®ÇÔ.

echo "Á¦ÀÏ ÁÁ¾ÆÇÏ´Â ¾ßä°¡ ¹¹ÁÒ? "
TimerOn
read answer
PrintAnswer


# ÀÌ´Â ºÐ¸íÈ÷ ŸÀӾƿô ÀԷ¿¡ ´ëÇÑ ¹ÌºÀÃ¥ÀÔ´Ï´Ù¸¸,
# Bash ·Î ÇÒ ¼ö ÀÖ´Â ÃÖ¼±À» ´ÙÇÑ °ÍÀÔ´Ï´Ù.
# (µ¶Àڵ鿡°Ô µµÀü: ´õ ³ªÀº ÇØ°áÃ¥À» Á¦½ÃÇØ º¸¼¼¿ä.)

# ´õ ¿ì¾ÆÇÑ ´Ù¸¥ °ÍÀÌ ÇÊ¿äÇÏ´Ù¸é C ³ª C++ ÀÇ 'alarm'À̳ª 'setitimer' °°Àº
# Àû´çÇÑ ¶óÀ̺귯¸® ÇÔ¼ö¸¦ ½á¼­ ±¸ÇöÇϱ⠹ٶø´Ï´Ù.

exit 0

stty¸¦ ¾´ ´Ù¸¥ ¹æ¹ý.

¿¹ 9-3. ŸÀÓ ¾Æ¿ô ó¸® ÀÔ·Â, ÇÑ ¹ø ´õ

#!/bin/bash
# timeout.sh

# Stephane Chazelas ÀÛ¼º.
# ÀÌ ¹®¼­ÀÇ ÀúÀÚ°¡ ¼öÁ¤.

INTERVAL=5                # ŸÀӾƿô ÀÎÅ͹ú

timedout_read() {
  timeout=$1
  varname=$2
  old_tty_settings=`stty -g`
  stty -icanon min 0 time ${timeout}0
  eval read $varname      # ¾Æ´Ï¸é ±×³É     read $varname
  stty "$old_tty_settings"
  # "stty" ¸Ç ÆäÀÌÁö ÂüÁ¶.
}

echo; echo -n "À̸§ÀÌ ¹¹ÁÒ? »¡¸® ´ë´äÇØ¿ä! "
timedout_read $INTERVAL your_name

# ¸ðµç Å͹̳ΠŸÀÔ¿¡¼­ µ¿ÀÛÇÏÁö ¾ÊÀ» ¼öµµ ÀÖ½À´Ï´Ù.
# ÃÖ´ë ŸÀӾƿôÀº ¾î¶² Å͹̳ÎÀ̳Ŀ¡ ´Þ·ÁÀÖ½À´Ï´Ù.
# (º¸ÅëÀº 25.5 ÃÊ).

echo

if [ ! -z "$your_name" ]  # ŸÀӾƿô Àü¿¡ ÀÔ·ÂÀÌ ÀÖ´Ù¸é...
then
  echo "¾ÆÇÏ, À̸§ÀÌ $your_name ±º¿ä."
else
  echo "ŸÀӾƿô."
fi

echo

# ÀÌ ½ºÅ©¸³Æ®´Â "timed-input.sh" ½ºÅ©¸³Æ®¿Í ¾à°£ ´Ù¸£°Ô µ¿ÀÛÇϴµ¥,
# ۰¡ ´­¸± ¶§¸¶´Ù ŸÀӾƿô Ä«¿îÅͰ¡ ¸®¼ÂµË´Ï´Ù.

exit 0
$UID

»ç¿ëÀÚ ¾ÆÀ̵𠰪

/etc/passwd¿¡ ÀúÀåµÇ¾î ÀÖ´Â ÇöÀç »ç¿ëÀÚÀÇ »ç¿ëÀÚ ½Äº° ¼ýÀÚ

ºñ·Ï su¿¡ ÀÇÇØ¼­ Àӽ÷Π´Ù¸¥ »ç¿ëÀÚ·Î ÀνĵǴõ¶óµµ ÇöÀç »ç¿ëÀÚÀÇ ½ÇÁ¦ ¾ÆÀ̵𸦠³ªÅ¸³À´Ï´Ù. $UID´Â Àб⸸ µÇ´Â º¯¼ö·Î ¸í·É¾î ÁÙÀ̳ª ½ºÅ©¸³Æ®¿¡¼­ º¯°æÇÒ ¼ö ¾ø½À´Ï´Ù. ±×¸®°í, id ³»Àå ¸í·É°ú ¦À» ÀÌ·ì´Ï´Ù.

¿¹ 9-4. ³»°¡ ·çÆ®Àΰ¡?

#!/bin/bash
# am-i-root.sh:   ³»°¡ ·çÆ®¾ß ¾Æ´Ï¾ß?

ROOT_UID=0   # ·çÆ® $UID´Â 0.

if [ "$UID" -eq "$ROOT_UID" ]  # Will the real "root" please stand up?
then
  echo "·çÆ®³×¿ä."
else
  echo "±×³É º¸Åë »ç¿ëÀÚ¿¡¿ä.(±×·¡µµ ´ç½Å ¾î¸Ó´Ï´Â ÀÖ´Â ±×´ë·ÎÀÇ ´ç½ÅÀ» »ç¶ûÇϽŴä´Ï´Ù)."
fi

exit 0


# ============================================================= #
# ½ºÅ©¸³Æ®°¡ ÀÌ¹Ì Á¾·áµÆ±â ¶§¹®¿¡ ¹ØÀÇ ÄÚµå´Â ½ÇÇàµÇÁö ¾Ê½À´Ï´Ù.

# ·çÆ®ÀÎÁö ¾Ë¾Æ³»´Â ´Ù¸¥ ¹æ¹ý:

ROOTUSER_NAME=root

username=`id -nu`
if [ "$username" = "$ROOTUSER_NAME" ]
then
  echo "·çƼ ÅõÆ® ÅõÆ®(Rooty, toot, toot), ´ç½ÅÀº ·çÆ® »ç¿ëÀÚ±º¿ä."
else
  echo "±×³É º¸Åë »ç¶÷À̱º¿ä."
fi

exit 0

¿¹ 2-2 Âü°í.

Âü°í: $ENV, $LOGNAME, $MAIL, $TERM, $USER, $USERNAMEÀº bash ³»Àå ¸í·ÉÀÌ ¾Æ´Õ´Ï´Ù. ÇÏÁö¸¸ Á¾Á¾ bash ½Ã½ºÅÛ ±¸µ¿ ÆÄÀÏ¿¡¼­ ȯ°æ º¯¼ö·Î ¼³Á¤ÀÌ µË´Ï´Ù. »ç¿ëÀÚÀÇ ·Î±ä ½©À» ³ªÅ¸³»´Â $SHELLÀº /etc/passwd¸¦ Âü°íÇØ ¼³Á¤µÇ°Å³ª "init" ½ºÅ©¸³Æ®¿¡¼­ ¼³Á¤µÇ°í, ¿ª½Ã bash ³»Àå¸í·É¾î°¡ ¾Æ´Õ´Ï´Ù.

tcsh% echo $LOGNAME
bozo
tcsh% echo $SHELL
/bin/tcsh
tcsh% echo $TERM
rxvt

bash$ echo $LOGNAME
bozo
bash$ echo $SHELL
/bin/tcsh
bash$ echo $TERM
rxvt
	      

À§Ä¡ ¸Å°³º¯¼ö(Positional Parameters)

$0, $1, $2, etc.

À§Ä¡ ¸Å°³º¯¼ö·Î¼­, ¸í·É¾îÁÙ¿¡¼­ ½ºÅ©¸³Æ®·Î ³Ñ°ÜÁö°Å³ª ÇÔ¼ö·Î ³Ñ°ÜÁö°Å³ª set ¸í·É¾î·Î °­Á¦·Î ¼³Á¤µÊ(¿¹ 5-5 °ú ¿¹ 11-10 Âü°í).

$#

¸í·É¾îÁÙ ÀÎÀÚ [2] ÀÇ °¹¼ö³ª À§Ä¡ ¸Å°³º¯¼öµé(¿¹ 34-2 Âü°í)

$*

ÇÑ ³¹¸»·Î Ç¥½ÃµÇ´Â À§Ä¡ ¸Å°³º¯¼öµé ¸ðµÎ

$@

$*°ú ¶È°°Áö¸¸ °¢ ¸Å°³º¯¼ö´Â Äõ¿ìÆ®µÈ ¹®ÀÚ¿­·Î Ãë±ÞµË´Ï´Ù. Áï, ÇØ¼®µÇ°Å³ª È®Àå¾øÀÌ ÀÖ´Â ±×´ë·Î ³Ñ°ÜÁý´Ï´Ù. ±× °á°ú·Î °¢ ÀÎÀÚ´Â °¢°¢ÀÌ ¼­·Î ´Ù¸¥ ³¹¸»·Î ±¸ºÐµÅ¼­ Ç¥½ÃµË´Ï´Ù.

¿¹ 9-5. arglist: $* °ú $@ ·Î ÀÎÀÚ¸¦ ³ª¿­Çϱâ

#!/bin/bash
# ÀÌ ½ºÅ©¸³Æ®¸¦ ºÎ¸¦ ¶§ "one two three" °°Àº ÀÎÀÚ¸¦ Á༭ ºÎ¸£¼¼¿ä.

E_BADARGS=65

if [ ! -n "$1" ]
then
  echo "»ç¿ë¹ý: `basename $0` argument1 argument2 etc."
  exit $E_BADARGS
fi  

echo

index=1

echo "\"\$*\" ·Î ÀÎÀÚ¸¦ ³ª¿­Çϱâ:"
for arg in "$*"  # "$*" ¸¦ Äõ¿ìÆ®ÇÏÁö ¾ÊÀ¸¸é Á¦´ë·Î µ¿ÀÛÇÏÁö ¾Ê½À´Ï´Ù.
do
  echo "Arg #$index = $arg"
  let "index+=1"
done             # $* ´Â ¸ðµç ÀÎÀÚ¸¦ ÇϳªÀÇ ³¹¸»·Î º¾´Ï´Ù.
echo "Àüü ÀÎÀÚ ¸ñ·ÏÀº ÇϳªÀÇ ³¹¸»·Î ³ªÅ¸³³´Ï´Ù."

echo

index=1

echo "\"\$@\" ·Î ÀÎÀÚ¸¦ ³ª¿­Çϱâ:"
for arg in "$@"
do
  echo "Arg #$index = $arg"
  let "index+=1"
done             # $@ ´Â ÀÎÀÚµéÀ» ºÐ¸®µÈ ³¹¸»·Î º¾´Ï´Ù.
echo "Àüü ÀÎÀÚ ¸ñ·ÏÀº ºÐ¸®µÈ ³¹¸»·Î ³ªÅ¸³³´Ï´Ù."

echo

exit 0

Ư¼ö ¸Å°³º¯¼öÀÎ $@¿¡´Â ½© ½ºÅ©¸³Æ®·Î µé¾î¿À´Â ÀÔ·ÂÀ» ÇÊÅ͸µÇÏ´Â Åø·Î¼­ ¾²ÀÔ´Ï´Ù. cat "$@"Àº ÀÚ½ÅÀÇ ¸Å°³º¯¼ö¸¦ Ç¥ÁØÀÔ·ÂÀ̳ª ÆÄÀÏ¿¡¼­ ¹Þ¾Æ µéÀÏ ¼ö ÀÖ½À´Ï´Ù. ¿¹ 12-17À» Âü°íÇϼ¼¿ä.

°æ°í

$*°ú $@Àº °¡²û $IFSÀÇ ¼³Á¤°ª¿¡ µû¶ó Àϰü¼ºÀÌ ¾ø°í ÀÌ»óÇÑ µ¿ÀÛÀ» ÇÕ´Ï´Ù.

¿¹ 9-6. Àϰü¼º ¾ø´Â $*°ú $@ÀÇ µ¿ÀÛ

#!/bin/bash

# Äõ¿ìÆ® ¿©ºÎ¿¡ µû¶ó ÀÌ»óÇÏ°Ô µ¿ÀÛÇÏ´Â 
# Bash ³»ºÎ º¯¼ö "$*"¿Í "$@".
# ³¹¸» Á¶°¢³²°ú ¶óÀÎÇǵ尡 Àϰü¼º ¾øÀÌ Ã³¸®µË´Ï´Ù.

# ÀÌ ¿¹Á¦ ½ºÅ©¸³Æ®´Â Stephane Chazelas °¡ Á¦°øÇϰí,
# º» ¹®¼­ÀÇ ÀúÀÚ°¡ ¾à°£ ¼öÁ¤Çß½À´Ï´Ù.


set -- "ù¹øÂ° ÀÎÀÚ" "µÎ¹øÂ°" "¼¼¹øÂ°:ÀÎÀÚ" "" "³×¹øÂ°: :ÀÎÀÚ"
# ½ºÅ©¸³Æ®ÀÇ ÀÎÀÚ¸¦ $1, $2 µîÀ¸·Î ¼¼ÆÃ.

echo

echo 'IFS ´Â ±×´ë·Î, "$*"'
c=0
for i in "$*"               # Äõ¿ìÆ®
do echo "$((c+=1)): [$i]"   # ¸Å ÀνºÅϽº¸¶´Ù ¶È°°À½.
                            # ÀÎÀÚ ¿¡ÄÚ.
done
echo ---

echo 'IFS ´Â ±×´ë·Î, $*'
c=0
for i in $*                 # Äõ¿ìÆ® ¾È ÇÔ
do echo "$((c+=1)): [$i]"
done
echo ---

echo 'IFS ´Â ±×´ë·Î, "$@"'
c=0
for i in "$@"
do echo "$((c+=1)): [$i]"
done
echo ---

echo 'IFS ´Â ±×´ë·Î, $@'
c=0
for i in $@
do echo "$((c+=1)): [$i]"
done
echo ---

IFS=:
echo 'IFS=":", "$*"'
c=0
for i in "$*"
do echo "$((c+=1)): [$i]"
done
echo ---

echo 'IFS=":", $*'
c=0
for i in $*
do echo "$((c+=1)): [$i]"
done
echo ---

var=$*
echo 'IFS=":", "$var" (var=$*)'
c=0
for i in "$var"
do echo "$((c+=1)): [$i]"
done
echo ---

echo 'IFS=":", $var (var=$*)'
c=0
for i in $var
do echo "$((c+=1)): [$i]"
done
echo ---

var="$*"
echo 'IFS=":", $var (var="$*")'
c=0
for i in $var
do echo "$((c+=1)): [$i]"
done
echo ---

echo 'IFS=":", "$var" (var="$*")'
c=0
for i in "$var"
do echo "$((c+=1)): [$i]"
done
echo ---

echo 'IFS=":", "$@"'
c=0
for i in "$@"
do echo "$((c+=1)): [$i]"
done
echo ---

echo 'IFS=":", $@'
c=0
for i in $@
do echo "$((c+=1)): [$i]"
done
echo ---

var=$@
echo 'IFS=":", $var (var=$@)'
c=0
for i in $var
do echo "$((c+=1)): [$i]"
done
echo ---

echo 'IFS=":", "$var" (var=$@)'
c=0
for i in "$var"
do echo "$((c+=1)): [$i]"
done
echo ---

var="$@"
echo 'IFS=":", "$var" (var="$@")'
c=0
for i in "$var"
do echo "$((c+=1)): [$i]"
done
echo ---

echo 'IFS=":", $var (var="$@")'
c=0
for i in $var
do echo "$((c+=1)): [$i]"
done

echo

# ÀÌ ½ºÅ©¸³Æ®¸¦ ksh À̳ª zsh -y ·Î ½ÇÇàÇØ º¸¼¼¿ä.

exit 0

Âü°í: $@°ú $*´Â Å«µû¿ÈÇ¥·Î Äõ¿ìÆ® µÆÀ» ¶§¸¸ ´Þ¶óÁý´Ï´Ù.

¿¹ 9-7. $IFS °¡ ºñ¾î ÀÖÀ» ¶§ $*¿Í $@

#!/bin/bash

# $IFS °¡ ºó »óÅ·Π¼¼Æ®µÆ´Ù¸é,
# "$*" ¿Í "$@" ´Â À§Ä¡ ¸Å°³º¯¼ö¸¦ ¿ì¸®°¡ »ý°¢Çϴ´ë·Î ¿¡ÄÚÇÏÁö ¾Ê½À´Ï´Ù.

mecho ()       # À§Ä¡ ¸Å°³º¯¼ö ¿¡ÄÚ.
{
echo "$1,$2,$3";
}


IFS=""         # ºó »óÅ·Π¼¼Æ®.
set a b c      # À§Ä¡ ¸Å°³º¯¼ö.

mecho "$*"     # abc,,
mecho $*       # a,b,c

mecho $@       # a,b,c
mecho "$@"     # a,b,c

# $IFS °¡ ºñ¾î ÀÖÀ» °æ¿ì¿¡ $* ¿Í $@ ÀÇ µ¿ÀÛÀº
# Bash ³ª sh ÀÇ ¹öÀü¿¡ µû¶ó ´Þ¶óÁö±â ¶§¹®¿¡
# ½ºÅ©¸³Æ®¿¡¼­ ÀÌ "±â´É"¿¡ ¾²´Â °ÍÀº ±ÇÀåÇÏÁö ¾Ê½À´Ï´Ù.


# Thanks, S.C.

exit 0

´Ù¸¥ Ư¼ö ¸Å°³º¯¼ö

$-

½ºÅ©¸³Æ®·Î ³Ñ°ÜÁø Ç÷¡±×µé

°æ°í

¿ø·¡ ksh¿¡¼­ ¾²´ø °ÍÀ» bash¿¡¼­ äÅÃÇÑ °ÍÀε¥ ºÒÇàÈ÷µµ Àß µ¿ÀÛÇÏÁö ¾Ê´Â °Í °°½À´Ï´Ù. ½ºÅ©¸³Æ® ÀÚ½ÅÀÌ ´ëÈ­ÇüÀÎÁö ¾Æ´ÑÁö ½º½º·Î È®ÀÎÇÏ·Á°í ÇÏ´Â °æ¿ì¿¡³ª ¾µ¸¸ÇÕ´Ï´Ù.

$!

¹é±×¶ó¿îµå·Î µ¹°í ÀÖ´Â °¡Àå ÃÖ±Ù ÀÛ¾÷ÀÇ PID (process id)

$_

¹Ù·Î ÀÌÀü¿¡ ½ÇÇàµÈ ¸í·É¾îÀÇ Á¦ÀÏ ¸¶Áö¸· ÀÎÀÚ·Î ¼³Á¤µÇ´Â Ư¼ö º¯¼ö.

¿¹ 9-8. ¹ØÁÙ º¯¼ö(underscore variable)

#!/bin/bash

echo $_         # /bin/bash
# ½ºÅ©¸³Æ®¸¦ µ¹¸®±â À§ÇØ ½ÇÇàµÈ /bin/bash. 

du >/dev/null   # ¸í·É¾î Ãâ·ÂÀÌ ¾øÀ½.
echo $_         # du

ls -al          # ¸í·É¾î Ãâ·ÂÀÌ ¾øÀ½.
echo $_         # -al  (¸¶Áö¸· ÀÎÀÚ)

:
echo $_         # :
$?

¸í·É¾î³ª ÇÔ¼ö, ½ºÅ©¸³Æ® ÀÚ½ÅÀÇ Á¾·á »óÅÂ(¿¹ 23-3 Âü°í).

$$

½ºÅ©¸³Æ® ÀÚ½ÅÀÇ ÇÁ·Î¼¼½º ¾ÆÀ̵ð·Î º¸Åë Àӽà ÆÄÀÏ À̸§À» ¸¸µé ¶§ »ç¿ëÇÕ´Ï´Ù(¿¹ A-8¿Í ¿¹ 30-5, ¿¹ 12-23 Âü°í).

ÁÖ¼®

[1]

ÇöÀç µ¹°í ÀÖ´Â ½ºÅ©¸³Æ®ÀÇ pid ´Â $$ ÀÔ´Ï´Ù.

[2]

"ÀÎÀÚ"(argument)³ª "¸Å°³º¯¼ö" (parameter)´Â ÈçÈ÷ ¼­·Î ¹Ù²ã¼­ ¾²±â ¶§¹®¿¡ ÀÌ ¹®¼­¿¡¼­´Â ½ºÅ©¸³Æ®³ª ÇÔ¼ö·Î ³Ñ°ÜÁö´Â º¯¼ö¸¦ ³ªÅ¸³»´Â °°Àº Àǹ̷Π¾²ÀÔ´Ï´Ù.