ºÎ·Ï A. ¿©·¯ºÐµéÀÌ º¸³»ÁØ ½ºÅ©¸³Æ®µé(Contributed Scripts)

ÀÌ ½ºÅ©¸³Æ®µéÀº ÀÌ ¹®¼­ÀÇ ÁÖÁ¦¿¡ µü µé¾î¸ÂÁö´Â ¾ÊÁö¸¸ ½© ÇÁ·Î±×·¡¹Ö Å×Å©´ÐÀÇ Àç¹Õ´Â ºÎºÐÀ» º¸¿©ÁÖ°í ¶ÇÇÑ ¾µ¸¸ÇÕ´Ï´Ù. ÀÌ ½ºÅ©¸³Æ®µéÀ» ºÐ¼®ÇØ º¸°í ½ÇÇàÇØ º¸¸é¼­ Àç¹Ì¸¦ ´À²¸º¸±â ¹Ù¶ø´Ï´Ù.

¿¹ A-1. manview: Æ÷¸ËµÈ ¸Ç ÆäÀÌÁö¸¦ º¸´Â ½ºÅ©¸³Æ®

#!/bin/bash
# manview.sh: ¸ÇÆäÀÌÁö ¼Ò½º¸¦ º¸±â À§ÇØ Çü½ÄÈ­Çϱâ.

# ¸ÇÆäÀÌÁö ¼Ò½º¸¦ ÀÛ¼ºÇÏ´Â µµÁß¿¡ 
# Áï½Ã ÀÛ¾÷ °á°ú¸¦ º¸°í ½ÍÀ» ¶§ ¾²¸é ¾ÆÁÖ ÁÁ½À´Ï´Ù.

E_WRONGARGS=65

if [ -z "$1" ]
then
  echo "»ç¿ë¹ý: `basename $0` [filename]"
  exit $E_WRONGARGS
fi

groff -Tascii -man $1 | less
# ¸ÇÆäÀÌÁö¸¦ groff ·Î º¸±â.

# ¸ÇÆäÀÌÁö¿¡ Å×À̺íÀ̳ª ¹æÁ¤½ÄÀÌ µé¾î ÀÖ´Ù¸é, À§ ÄÚµå´Â ¿¡·¯°¡ ³³´Ï´Ù.
# ÀÌ·¸°Ô ÇÏ¸é ±×·± »óȲÀ» ó¸®ÇÒ ¼ö ÀÖ½À´Ï´Ù.
#
#   gtbl < "$1" | geqn -Tlatin1 | groff -Tlatin1 -mtty-char -man
#
#   Thanks, S.C.

exit 0

¿¹ A-2. mailformat: À̸ÞÀÏ ¸Þ¼¼Áö¸¦ Æ÷¸ËÇؼ­ º¸±â

#!/bin/bash
# mail-format.sh: À̸ÞÀÏ ¸Þ¼¼Áö¸¦ Æ÷¸Ë.

# ij·µ(>)À̳ª, ÅÇ, °úµµÇÑ µé¿©¾²±â°¡ µÈ ÁÙÀ» »èÁ¦.

ARGS=1
E_BADARGS=65
E_NOFILE=66

if [ $# -ne $ARGS ]  # ¿øÇÏ´Â ¼ýÀÚÀÇ ÀÎÀÚ°¡ ³Ñ¾î¿Ô´ÂÁö.
then
  echo "»ç¿ë¹ý: `basename $0` filename"
  exit $E_BADARGS
fi

if [ -f "$1" ]       # ÆÄÀÏÀÌ Á¸ÀçÇÏ´ÂÁö È®ÀÎ.
then
    file_name=$1
else
    echo "\"$1\" À̶õ ÆÄÀÏÀº ¾ø½À´Ï´Ù."
    exit $E_NOFILE
fi

MAXWIDTH=70          # ±ä ÁÙÀ» Á¢À» ³ÐÀÌ.

sed '
s/^>//
s/^  *>//
s/^  *//
s/		*//
' $1 | fold -s --width=$MAXWIDTH
          # "fold"ÀÇ -s ¿É¼ÇÀº °¡´ÉÇÏ´Ù¸é °ø¹é¹®ÀÚ¿¡¼­ ÁÙÀ» À߶óÁÝ´Ï´Ù.

#  ÀÌ ½ºÅ©¸³Æ®´Â ¾ÆÁÖ À¯¸íÇÑ ÀâÁö¿¡ ±â»ç·Î ¼Ò°³µÇ¾î °ÝÂùÀ» ¹ÞÀº 
#+ 164K Â¥¸® À©µµ¿ìÁî¿ë À¯Æ¿¸®Æ¼¿¡¼­ ¿µ°¨À» ¾ò¾î ÀÛ¼ºµÇ¾ú½À´Ï´Ù.

exit 0

¿¹ A-3. rn: °£´ÜÇÑ ÆÄÀÏÀ̸§ º¯°æ À¯Æ¿¸®Æ¼

ÀÌ ½ºÅ©¸³Æ®´Â ¿¹ 12-15ÀÇ º¯°æÆÇÀÔ´Ï´Ù.

#! /bin/bash
#
# "lowercase.sh"¿¡ ±âÃÊÇØ ÀÛ¼ºµÈ ¾ÆÁÖ °£´ÜÇÑ ÆÄÀÏÀ̸§ "rename" À¯Æ¿¸®Æ¼.
#
#  Vladimir Lanin(lanin@csd2.nyu.edu)ÀÌ ¸¸µç "ren" À¯Æ¿¸®Æ¼°¡ 
#+ À̰ͺ¸´Ù ÈξÀ ´õ ÁÁ½À´Ï´Ù.


ARGS=2
E_BADARGS=65
ONE=1                     # ´Ü¼ö, º¹¼ö¸¦ ¹®¹ý¿¡ ¸Â°Ô ¾²·Á°í(¾Æ·¡¸¦ º¸¼¼¿ä).

if [ $# -ne "$ARGS" ]
then
  echo "»ç¿ë¹ý: `basename $0` old-pattern new-pattern"
  #  ¿¹¸¦ µé¾î "rn gif jpg" ¶ó°í Çϸé ÇöÀç µð·ºÅ丮ÀÇ ¸ðµç gif ÆÄÀÏÀÇ À̸§À» 
  #+ jpg ÆÄÀÏ·Î ¹Ù²ãÁÝ´Ï´Ù.
  exit $E_BADARGS
fi

number=0                  # ½ÇÁ¦·Î ¾ó¸¶³ª ¸¹Àº ÆÄÀÏÀ̸§ÀÌ ¹Ù²î¾ú´ÂÁö¸¦ ´ã°í ÀÖÀ» º¯¼ö.


for filename in *$1*      # µð·ºÅ丮¿¡¼­ ÀÏÄ¡ÇÏ´Â ¸ðµç ÆÄÀÏÀ» Ž»ö.
do
   if [ -f "$filename" ]  # ã¾Ò´Ù¸é...
   then
     fname=`basename $filename`            # °æ·Î¸¦ ¶¼¾î³»°í,
     n=`echo $fname | sed -e "s/$1/$2/"`   # »õ À̸§À¸·Î ¹Ù²Û ´ÙÀ½,
     mv $fname $n                          # À̸§ ¹Ù²Þ.
     let "number += 1"
   fi
done   

if [ "$number" -eq "$ONE" ]                # ¹®¹ý¿¡ ¸Â°Ô ÇÏ·Á°í
then
 echo "$number °³ÀÇ ÆÄÀÏÀ̸§ÀÌ ¹Ù²î¾ú½À´Ï´Ù."
else 
 echo "$number °³ÀÇ ÆÄÀÏÀ̸§µéÀÌ ¹Ù²î¾ú½À´Ï´Ù."
fi 

exit 0


# µ¶ÀÚµéÀ» À§ÇÑ ¿¬½À¹®Á¦:
# ¾î¶² Á¾·ùÀÇ ÆÄÀÏÀÏ °æ¿ì¿¡ ÀÌ ½ºÅ©¸³Æ®°¡ Á¦´ë·Î µ¿ÀÛÇÏÁö ¾ÊÀ»±î¿ä?
# ±×·± ÆÄÀÏÀ» ó¸®ÇÏ·Á¸é ¾î¶»°Ô °íÄ¡ÁÒ?

¿¹ A-4. encryptedpw: ·ÎÄÿ¡ ¾Ïȣȭ µÇ¾î ÀÖ´Â ºñ¹Ð¹øÈ£·Î ftp »çÀÌÆ®¿¡ ÆÄÀÏÀ» ¾÷·ÎµåÇÏ´Â ½ºÅ©¸³Æ®

#!/bin/bash

# "ex72.sh" ¿¹Á¦¸¦ ¾ÏȣȭµÈ ºñ¹Ð¹øÈ£¸¦ »ç¿ëÇϵµ·Ï ¼öÁ¤ÇÔ.

#  ÇÏÁö¸¸ º¹È£È­µÈ ºñ¹Ð¹øÈ£°¡ ±×´ë·Î Àü¼ÛµÇ±â ¶§¹®¿¡ 
#+ ¾ÆÁ÷µµ ¾ÈÀüÇÏÁö´Â ¾Ê½À´Ï´Ù. ÁÖÀÇÇϼ¼¿ä.
# ÀÌ Á¡ÀÌ °ÆÁ¤µÈ´Ù¸é "ssh" °°Àº °ÍÀ» ½áº¸¼¼¿ä.

E_BADARGS=65

if [ -z "$1" ]
then
  echo "»ç¿ë¹ý: `basename $0` filename"
  exit $E_BADARGS
fi  

Username=bozo           # ¾Ë¸Â°Ô °íÄ¡¼¼¿ä.
pword=/home/bozo/secret/password_encrypted.file
# ¾ÏȣȭµÈ ºñ¹Ð¹øÈ£°¡ µé¾îÀÖ´Â ÆÄÀÏ.

Filename=`basename $1`  # ÆÄÀÏÀ̸§¿¡¼­ °æ·ÎÀ̸§À» ¶¼¾î ³À´Ï´Ù.

Server="XXX"
Directory="YYY"         # ½ÇÁ¦ ¼­¹öÀ̸§°ú µð·ºÅ丮·Î ¹Ù²Ù¼¼¿ä.


Password=`cruft <$pword`          # ºñ¹Ð¹øÈ£ º¹È£È­.
#  ÀúÀÚ°¡ ¸¸µç °íÀüÀûÀÎ 1ȸ¿ë ¾Ïȣǥ(onetime pad) ¾Ë°í¸®Áò¿¡ ±â¹ÝÇÑ
#+ "cruft" ÆÄÀÏ ¾Ïȣȭ ÆÐÅ°Áö¸¦ ¾¹´Ï´Ù.
#+ "cruft"´Â ´ÙÀ½¿¡¼­ ¾òÀ» ¼ö ÀÖ½À´Ï´Ù.
#+ Primary-site:   ftp://metalab.unc.edu /pub/Linux/utils/file
#+                 cruft-0.2.tar.gz [16k]


ftp -n $Server <<End-Of-Session
user $Username $Password
binary
bell
cd $Directory
put $Filename
bye
End-Of-Session
# "ftp"ÀÇ -n ¿É¼ÇÀº ÀÚµ¿ ·Î±×ÀÎÀ» ¸·¾ÆÁÝ´Ï´Ù.
# "bell"Àº ÆÄÀÏ Àü¼ÛÀÌ ÀϾ ¶§¸¶´Ù 'º§'À» ¿ï·ÁÁÝ´Ï´Ù.

exit 0

¿¹ A-5. copy-cd: µ¥ÀÌŸ CD¸¦ º¹»çÇÏ´Â ½ºÅ©¸³Æ®

#!/bin/bash
# copy-cd.sh: µ¥ÀÌŸ CD º¹»ç

CDROM=/dev/cdrom                           # CDROM µð¹ÙÀ̽º
OF=/home/bozo/projects/cdimage.iso         # Ãâ·Â ÆÄÀÏ
#       /xxxx/xxxxxxx/                     ¿©·¯ºÐ ½Ã½ºÅÛ¿¡ ¸Â°Ô °íÄ¡¼¼¿ä.
BLOCKSIZE=2048
SPEED=2                                    # ´õ ºü¸¥ CDROM ÀÌ¸é °Å±â¿¡ ¸Â´Â ¼Óµµ¸¦ ¾²¼¼¿ä.

echo; echo "¿øº» CD ¸¦ ³Ö°í, ¸¶¿îÆ®´Â ÇÏÁö \"¸¶¼¼¿ä.\""
echo "Áغñ°¡ µÇ¸é ¿£Å͸¦ ´©¸£¼¼¿ä. "
read ready                                 # ÀÔ·Â ´ë±â, $ready ´Â ¾È ¾²ÀÓ.

echo; echo "¿øº» CD ¸¦ $OF ·Î º¹»çÇÕ´Ï´Ù."
echo "½Ã°£ÀÌ °É¸± ¼öµµ ÀÖÀ¸´Ï ±â´Ù¸®±â ¹Ù¶ø´Ï´Ù."

dd if=$CDROM of=$OF bs=$BLOCKSIZE          # µð¹ÙÀ̽º¸¦ ¹°¸®Àû ±×´ë·Î(raw) º¹»ç.


echo; echo "µ¥ÀÌŸ CD ¸¦ ²¨³»¼¼¿ä."
echo "°ø CD ¸¦ ³ÖÀ¸¼¼¿ä."
echo "Áغñ°¡ µÇ¸é ¿£Å͸¦ ´©¸£¼¼¿ä. "
read ready                                 # ÀÔ·Â ´ë±â, $ready ´Â ¾È ¾²ÀÓ.

echo "$OF ¸¦ CDR ·Î º¹»çÇÕ´Ï´Ù."

cdrecord -v -isosize speed=$SPEED dev=0,0 $OF
# Joerg Schilling ÀÇ "cdrecord" ÆÐÅ°Áö ¾¸(ÇØ´ç ¹®¼­ Âü°í).
# http://www.fokus.gmd.de/nthp/employees/schilling/cdrecord.html


echo; echo "$OF ¸¦ $CDROM µð¹ÙÀ̽º·Î º¹»ç ¿Ï·áÇß½À´Ï´Ù."

echo "À̹ÌÁö ÆÄÀÏÀ» Áö¿ì°í ½ÍÀ¸¼¼¿ä(y/n)? "  # ¾Æ¸¶ ²Ï Å« ÆÄÀÏÀÌ°ÚÁÒ.
read answer

case "$answer" in
[yY]) rm -f $OF
      echo "$OF ¸¦ Áö¿ü½À´Ï´Ù."
      ;;
*)    echo "$OF ¸¦ ¾È Áö¿ü½À´Ï´Ù.";;
esac

echo

# µ¶ÀÚµéÀ» À§ÇÑ ¿¬½À¹®Á¦:
# À§ÀÇ "case" ¹®À» "yes"¿Í "Yes"µµ ¹Þ¾ÆµéÀ̵µ·Ï °íÃĺ¸¼¼¿ä.

exit 0

¿¹ A-6. days-between: µÎ ³¯Â¥ »çÀÌÀÇ Â÷À̸¦ °è»êÇØ ÁÖ´Â ½ºÅ©¸³Æ®

#!/bin/bash
# days-between.sh:    µÎ ³¯Â¥ »çÀÌÀÇ ³¯ ¼ö.
# »ç¿ë¹ý: ./days-between.sh YYYY/[M]M/[D]D YYYY/[M]M/[D]D

ARGS=2                # ¸í·É¾îÁÙ ¸Å°³º¯¼ö´Â µÎ °³ ÇÊ¿ä.
E_PARAM_ERR=65        # ¸Å°³º¯¼ö ¿¡·¯.

REFYR=1600            # ÂüÁ¶ ³â(Reference year).
CENTURY=100
DIY=365
ADJ_DIY=367           # À±³â + fraction À» Á¶ÀýÇϱâ À§Çؼ­.
MIY=12
DIM=31
LEAPCYCLE=4

MAXRETVAL=256         # ÇÔ¼ö¿¡¼­ ¸®ÅÏ °¡´ÉÇÑ ÃÖ´ë Á¤¼ö

diff=		      # ³¯Â¥ °£°ÝÀ» À§ÇÑ Àü¿ª º¯¼ö ¼±¾ð.
value=                # Àý´ë°ªÀ» À§ÇÑ Àü¿ª º¯¼ö ¼±¾ð.
day=                  # ³â, ¿ù, ÀÏÀ» À§ÇÑ Àü¿ª º¯¼ö ¼±¾ð.
month=
year=


Param_Error ()        # Ʋ¸° ¸í·É¾îÁÙ ¸Å°³º¯¼ö.
{
  echo "»ç¿ë¹ý: `basename $0` YYYY/[M]M/[D]D YYYY/[M]M/[D]D"
  echo "       (1600/1/3 ÀÌÈÄÀÇ ³¯Â¥¿©¾ß ÇÕ´Ï´Ù)"
  exit $E_PARAM_ERR
}  


Parse_Date ()                 # ¸í·É¾îÁÙ ¸Å°³º¯¼ö·Î ³Ñ¾î¿Â ³¯Â¥¸¦ ÆĽÌ.
{
#  month=${1%%/**}
#  dm=${1%/**}                 # Day and month.
#  day=${dm#*/}
# ¿Å±äÀÌ: YYYY/MM/DD ÇüÅ·Π¹Ù²Þ.
  year=${1%%/**}
  ym=${1%/**}                 # ³â, ¿ù.
  month=${ym#*/}
  let "day = `basename $1`"   # ÆÄÀÏÀ̸§Àº ¾Æ´ÏÁö¸¸ ¶È°°ÀÌ µ¿ÀÛÇÕ´Ï´Ù.
}  


check_date ()                 # ³¯Â¥ ¹üÀ§°¡ ¸Â´ÂÁö È®ÀÎ.
{
  [ "$day" -gt "$DIM" ] || [ "$month" -gt "$MIY" ] || [ "$year" -lt "$REFYR" ] && Param_Error
  # Á¦´ë·Î µÈ ³¯Â¥°¡ ¾Æ´Ò °æ¿ì¿¡ ½ºÅ©¸³Æ®¸¦ Á¾·á.
  # "or-list / and-list" ¸¦ ½èÁÒ.
  # µ¶ÀÚµéÀ» À§ÇÑ ¿¬½À¹®Á¦: ³¯Â¥¸¦ Á» ´õ Á¤È®ÇÏ°Ô È®ÀÎÇϵµ·Ï ±¸ÇöÇØ º¸¼¼¿ä.
}


strip_leading_zero () # ¿ùÀ̳ª ÀÏ ¾Õ¿¡ 0 ÀÌ ÀÖÀ» °æ¿ì¿¡´Â 
{                     # Bash °¡ 8 Áø¼ö·Î Çؼ®Çϱ⠶§¹®¿¡(POSIX.2, 2.9.2.1 Àý) 
  val=${1#0}          # ±× 0 À» Àß¶ó³¾ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù.
  return $val
}


day_index ()          # °¡¿ì½º °ø½Ä(Gauss' Formula):
{                     # 1600³â 1¿ù 3ÀϺÎÅÍ ¸Å°³º¯¼ö·Î ³Ñ¾î¿Â ³¯Â¥±îÁö °è»ê.

  day=$1
  month=$2
  year=$3

  let "month = $month - 2"
  if [ "$month" -le 0 ]
  then
    let "month += 12"
    let "year -= 1"
  fi  

  let "year -= $REFYR"
  let "indexyr = $year / $CENTURY"


  let "Days = $DIY*$year + $year/$LEAPCYCLE - $indexyr + $indexyr/$LEAPCYCLE + $ADJ_DIY*$month/$MIY + $day - $DIM"
  # ÀÌ ¾Ë°í¸®Áò¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ¼³¸íÀº ´ÙÀ½À» Âü°íÇϼ¼¿ä.
  # http://home.t-online.de/home/berndt.schwerdtfeger/cal.htm


  if [ "$Days" -gt "$MAXRETVAL" ]  # ÇÔ¼ö¿¡¼­ 256 º¸´Ù Å« ¼ö¸¦ ¸®ÅÏÇϱâ À§Çؼ­
  then                             # °á°ú°¡ 256 º¸´Ù Å©´Ù¸é À½¼ö·Î ¹Ù²Þ.
    let "dindex = 0 - $Days"     
  else let "dindex = $Days"
  fi

  return $dindex

}  


calculate_difference ()            # µÎ ³¯Â¥°£ Â÷À̳ª´Â ³¯ ¼ö¸¦ °è»ê.
{
  let "diff = $1 - $2"             # Àü¿ª º¯¼ö.
}  


abs ()                             # Àý´ë°ª
{                                  # "value" Àü¿ª º¯¼ö »ç¿ë.
  if [ "$1" -lt 0 ]                # If À½¼ö
  then                             # then
    let "value = 0 - $1"           # ºÎÈ£ ¹Ù²Ù±â,
  else                             # else
    let "value = $1"               # ±×´ë·Î µÒ.
  fi
}



if [ $# -ne "$ARGS" ]              # ¸í·É¾îÁÙ ¸Å°³º¯¼ö°¡ µÎ °³ ÇÊ¿ä.
then
  Param_Error
fi  

Parse_Date $1
check_date $day $month $year      # ³¯Â¥ Çü½ÄÀÌ ¸Â´ÂÁö È®ÀÎ.

strip_leading_zero $day           # ÀÏÀ̳ª ¿ù ¾Õ¿¡ ºÙÀº 0 À» Á¦°Å.
day=$?                          
strip_leading_zero $month
month=$?

day_index $day $month $year
date1=$?

abs $date1                         # Àý´ë°ªÀ» ±¸ÇØ È®½ÇÈ÷ ¾ç¼ö·Î ¸¸µê
date1=$value                     

Parse_Date $2
check_date $day $month $year

strip_leading_zero $day
day=$?
strip_leading_zero $month
month=$?

day_index $day $month $year
date2=$?

abs $date2                         # ¾ç¼ö·Î ¸¸µê.
date2=$value

calculate_difference $date1 $date2

abs $diff                          # ¾ç¼ö·Î ¸¸µê.
diff=$value

echo $diff

exit 0
# http://buschencrew.hypermart.net/software/datedif
# ¿¡ ÀÖ´Â °¡¿ì½º °ø½ÄÀÇ C ±¸Çö°ú ÀÌ ½ºÅ©¸³Æ®¸¦ ºñ±³ÇØ º¸¼¼¿ä.

+

´ÙÀ½ µÎ ½ºÅ©¸³Æ®´Â Åä·ÐÅä ´ëÇÐÀÇ Mark Moraes°¡ ÀÛ¼ºÇß½À´Ï´Ù. Çã°¡ »çÇ×°ú Á¦ÇÑ »çÇ׿¡ ´ëÇؼ­´Â ÀÌ ¹®¼­¿Í °°ÀÌ ¹èÆ÷µÇ´Â "Moraes-COPYRIGHT" ÆÄÀÏÀ» Âü°íÇϱ⠹ٶø´Ï´Ù.

¿¹ A-7. behead: ¸ÞÀÏ°ú ´º½º ¸Þ¼¼Áö Çì´õ¸¦ Á¦°ÅÇØ ÁÖ´Â ½ºÅ©¸³Æ®

#! /bin/sh
# ¸ÞÀÏÀ̳ª ´º½º ¸Þ¼¼Áö¿¡¼­ ù¹ø° ºó ÁÙÀÌ ³ª¿Ã ¶§±îÁöÀÇ 
# Çì´õ¸¦ ¶¼¾î ³» ÁÖ´Â ½ºÅ©¸³Æ®.
# Åä·ÐÅä ´ëÇÐÀÇ Mark Moraes ÀÛ¼º

# --> ÀÌ ÁÖ¼®Àº HOWTO ÀúÀÚ°¡ ºÙÀÎ °ÍÀÔ´Ï´Ù.

if [ $# -eq 0 ]; then
# --> ¸í·É¾î ÁÙ ÀÎÀÚ°¡ ¾ø´Ù¸é Ç¥ÁØÀԷ¿¡¼­ ÀçÁöÇâµÇ¾î µé¾î¿À´Â ÆÄÀÏ¿¡ ´ëÇؼ­ µ¿ÀÛÇÔ.
	sed -e '1,/^$/d' -e '/^[ 	]*$/d'
	# --> °ø¹é ¹®ÀÚ·Î ½ÃÀÛÇϴ ù¹ø° ÁÙÀÌ ³ª¿Ã ¶§±îÁö
	# --> ºó ÁÙ°ú ¸ðµç ÁÙÀ» Áö¿ó´Ï´Ù.
else
# --> ¸í·É¾î ÁÙ ÀÎÀÚ°¡ ÀÖ´Ù¸é ±× ÁÖ¾îÁø ÆÄÀÏ¿¡ ´ëÇؼ­ µ¿ÀÛÇÔ
	for i do
		sed -e '1,/^$/d' -e '/^[ 	]*$/d' $i
		# --> À§¿Í °°½À´Ï´Ù.
	done
fi

# --> µ¶ÀÚ¸¦ À§ÇÑ ¿¬½À¹®Á¦: ¿¡·¯ üũ¿Í ´Ù¸¥ ¿É¼ÇÀ» Ãß°¡ÇØ º¸¼¼¿ä.
# -->
# --> ÀÛÀº sed ½ºÅ©¸³Æ®°¡ ÀÎÀÚ¸¦ ³Ñ±â´Â °Í¸¸ »©°í ¹Ýº¹µÇ´Â°ÍÀ» À¯½ÉÈ÷ »ìÆì º¸¼¼¿ä.
# --> ÀÌ ºÎºÐÀ» ÇÔ¼ö·Î »©´Â°Ô ÀÌÄ¡¿¡ ¸ÂÀ»±î¿ä? ±× ´ë´ä¿¡ ´ëÇؼ­ ¼³¸íÇØ º¸¼¼¿ä.

¿¹ A-8. ftpget: ftp¿¡¼­ ÆÄÀÏÀ» ´Ù¿î·Îµå ÇØ ÁÖ´Â ½ºÅ©¸³Æ®

#! /bin/sh 
# $Id: ftpget,v 1.2 91/05/07 21:15:43 moraes Exp $ 
# À͸í ftp¿¡ ¹èÄ¡ ÀÛ¾÷À» ½ÇÇàÇÏ´Â ½ºÅ©¸³Æ®. ±âº»ÀûÀ¸·Î ¸í·É¾î ¶óÀÎ ÀÎÀÚµéÀ»
# ftpÀÇ ÀÔ·ÂÀ¸·Î ¹Ù²ãÁÖ´Â ÀÏÀ» ÇÕ´Ï´Ù.
# °£´ÜÇÏ°í ºü¸¨´Ï´Ù - ftplist¿Í ÇÑ ½ÖÀÌ µÇµµ·Ï ÀÛ¼ºµÆ½À´Ï´Ù.
# -h ´Â Á¢¼ÓÇÒ È£½ºÆ®¸¦ ³ªÅ¸³À´Ï´Ù(±âº»°ªÀº prep.ai.mit.edu)
# -d ´Â Á¢¼ÓÈÄ cd ·Î ¿Å°Ü°¥ µð·ºÅ丮¸¦ ³ªÅ¸³À´Ï´Ù. -d ¸¦ ¿©·¯¹ø ¾µ ¼öµµ 
# Àִµ¥, ÀÌ·¸°Ô Çϸé ÁÖ¾îÁø ¼ø¼­´ë·Î µð·ºÅ丮¸¦ ¿Å°Ü°¥ °ÍÀÔ´Ï´Ù.
# ¸¸¾à¿¡ ÇØ´ç µð·ºÅ丮°¡ »ó´ë °æ·Î¶ó¸é ¼ø¼­¸¦ Àß ¸Å°Ü¾ß ÇÕ´Ï´Ù. 
# ¿äÁò¿£ ³Ê¹« ¸¹Àº ½Éº¼¸¯ ¸µÅ©°¡ Á¸ÀçÇϱ⠶§¹®¿¡ ¾ÆÁÖ Á¶½ÉÇؼ­ »ç¿ëÇØ¾ß ÇÕ´Ï´Ù.
# (±âº»°ªÀº ftp ·Î±×ÀÎ µð·ºÅ丮)
# -v ´Â ftpÀÇ verbose¸ðµå¸¦ ÄѼ­, ftp ¼­¹öÀÇ ¸ðµç ÀÀ´äÀ» º¸¿©ÁÝ´Ï´Ù.
# -f remotefile[:localfile] Àº remote ÆÄÀÏÀ» local ÆÄÀÏ·Î À̸§À» ¹Ù²ã 
# °¡Á®¿É´Ï´Ù.
# -m pattern Àº ÁÖ¾îÁø ÆÐÅÏ¿¡ ÇØ´çÇÏ´Â ÆÄÀϵéÀ» mgetÀ¸·Î °¡Á®¿É´Ï´Ù.
# ½© ¹®ÀÚµéÀ» Àοë(quote)ÇØ¾ß ÇÏ´Â °ÍÀ» ±â¾ïÇϼ¼¿ä.
# -c ´Â ÇöÀç ÀÚ½ÅÀÇ ½Ã½ºÅÛ¿¡¼­ ÁÖ¾îÁø µð·ºÅ丮·Î cd ¸¦ ½ÇÇàÇÕ´Ï´Ù.
# ¿¹¸¦ µé¸é,
# 	ftpget -h expo.lcs.mit.edu -d contrib -f xplaces.shar:xplaces.sh \
#		-d ../pub/R3/fixes -c ~/fixes -m 'fix*' 
# ´Â expo.lcs.mit.edu ÀÇ ~ftp/contrib ¿¡¼­ xplaces.shar ¸¦ ÇöÀç µð·ºÅ丮¿¡
# xplaces.sh ·Î °¡Á®¿À°í, ~ftp/pub/R3/fixes ¿¡¼­ ¸ðµç ¼öÁ¤ ÆÄÀÏ('fix*')µéÀ»
# Àڱ⠽ýºÅÛÀÇ ~/fixes µð·ºÅ丮·Î °¡Á®¿É´Ï´Ù.
# ftp ¿¡¼­ ÇØ´ç ¸í·É¾î°¡ ÁÖ¾îÁø ¼ø¼­´ë·Î ½ÇÇàµÇ±â ¶§¹®¿¡ ¿É¼Ç ¼ø¼­°¡ 
# Áß¿äÇÏ´Ù´Â °ÍÀº ¾ÆÁÖ È®½ÇÇÕ´Ï´Ù.
#
# Mark Moraes (moraes@csri.toronto.edu), Feb 1, 1989 
# ==> Docbook¿¡¼­ ó¸®ÇÒ ¼ö ÀÖµµ·Ï ºÎµîÈ£ °ýÈ£¸¦ ¼Ò°ýÈ£·Î ¹Ù²Ù¾ú½À´Ï´Ù.
#

# ==> ÀÌ·± ÁÖ¼®Àº HOWTO ÀúÀÚ°¡ µ¡ºÙÀÎ ÁÖ¼®ÀÔ´Ï´Ù.

# PATH=/local/bin:/usr/ucb:/usr/bin:/bin
# export PATH
# ==> ¿ø·¡ ½ºÅ©¸³Æ®¿¡ ÀÖ´ø À§ µÎ ÁÙÀº ¾µµ¥¾ø¾î º¸ÀÔ´Ï´Ù.

TMPFILE=/tmp/ftp.$$
# ==> ½ºÅ©¸³Æ®ÀÇ ÇÁ·Î¼¼½º ID($$)·Î Àӽà ÆÄÀÏÀ» ¸¸µê.

SITE=`domainname`.toronto.edu
# ==> 'domainname'Àº 'hostname'°ú ºñ½ÁÇÕ´Ï´Ù.
# ==> Á» ´õ ÀϹÝÀûÀ¸·Î ¾²·Á¸é ¸Å°³º¯¼ö·Î ó¸®Çϵµ·Ï ÀçÀÛ¼º ÇÒ ¼öµµ ÀÖ½À´Ï´Ù.

usage="»ç¿ë¹ý: $0 [-h remotehost] [-d remotedirectory]... [-f remfile:localfile]... \
		[-c localdirectory] [-m filepattern] [-v]"
ftpflags="-i -n"
verbflag=
set -f 		# -m ¿É¼Ç¿¡¼­ globbingÀ» ¾²±â À§Çؼ­
set x `getopt vh:d:c:m:f: $*`
if [ $? != 0 ]; then
	echo $usage
	exit 65
fi
shift
trap 'rm -f ${TMPFILE} ; exit' 0 1 2 3 15
echo "user anonymous ${USER-gnu}@${SITE} > ${TMPFILE}"
# ==> Äõ¿ìÆ® Ãß°¡(º¹ÀâÇÑ echo ¹®¿¡¼­´Â ÀÌ·¸°Ô Çϱ⠹ٶø´Ï´Ù).
echo binary >> ${TMPFILE}
for i in $*   # ==> ¸í·É¾îÁÙ ÀÎÀÚ¸¦ ÆĽÌ.
do
	case $i in
	-v) verbflag=-v; echo hash >> ${TMPFILE}; shift;;
	-h) remhost=$2; shift 2;;
	-d) echo cd $2 >> ${TMPFILE}; 
	    if [ x${verbflag} != x ]; then
	        echo pwd >> ${TMPFILE};
	    fi;
	    shift 2;;
	-c) echo lcd $2 >> ${TMPFILE}; shift 2;;
	-m) echo mget "$2" >> ${TMPFILE}; shift 2;;
	-f) f1=`expr "$2" : "\([^:]*\).*"`; f2=`expr "$2" : "[^:]*:\(.*\)"`;
	    echo get ${f1} ${f2} >> ${TMPFILE}; shift 2;;
	--) shift; break;;
	esac
done
if [ $# -ne 0 ]; then
	echo $usage
	exit 65   # ==> Ç¥ÁØÀ» µû¸£±â À§ÇØ "exit 2"¿´´ø °ÍÀ» ¼öÁ¤.
fi
if [ x${verbflag} != x ]; then
	ftpflags="${ftpflags} -v"
fi
if [ x${remhost} = x ]; then
	remhost=prep.ai.mit.edu
	# ==> ¿©·¯ºÐÀÌ ÁÁ¾ÆÇÏ´Â ftp ½ÎÀÌÆ®·Î ¹Ù²Ù¼¼¿ä.
fi
echo quit >> ${TMPFILE}
# ==> ¸ðµç ¸í·É¾î´Â Àӽà ÆÄÀÏ·Î ÀúÀåµË´Ï´Ù.

ftp ${ftpflags} ${remhost} < ${TMPFILE}
# ==> ÀÌÁ¦ Àӽà ÆÄÀÏ¿¡ ÀúÀåµÆ´ø ¸í·É¾îµéÀÌ ftp ¿¡ ÀÇÇØ ÇÑ ¹ø¿¡ 󸮵˴ϴÙ.

rm -f ${TMPFILE}
# ==> ³¡À¸·Î, Àӽà ÆÄÀÏ »èÁ¦(Áö¿ìÁö ¾Ê°í ·Î±× ÆÄÀÏ·Î º¹»çÇÒ ¼öµµ ÀÖ½À´Ï´Ù).


# ==> µ¶ÀÚµéÀ» À§ÇÑ ¿¬½À¹®Á¦:
# ==> 1) ¿¡·¯ üũ¸¦ Ãß°¡Çϼ¼¿ä.
# ==> 2) ´Ù¸¥ Æí¸®ÇÑ ±â´Éµé(bells & whistles)À» ³Ö¾îº¸¼¼¿ä.

+

´ÙÀ½ ½ºÅ©¸³Æ®´Â Antek Sawicki°¡ º¸³»ÁÖ¾ú´Âµ¥ 9.3Àý¿¡¼­ ³íÀÇµÈ ¸Å°³º¯¼ö ġȯ ¿¬»êÀÚÀÇ ±ò²ûÇÑ »ç¿ë¹ýÀ» º¸¿©ÁÝ´Ï´Ù.

¿¹ A-9. password: 8 ±ÛÀÚÂ¥¸® ·£´ýÇÑ ºñ¹Ð¹øÈ£ »ý¼º ½ºÅ©¸³Æ®

#!/bin/bash
# ¿À·¡µÈ ½Ã½ºÅÛ¿¡¼­´Â #!/bin/bash2 ¶ó°í ¹Ù²ã¾ß µÉÁöµµ ¸ð¸¨´Ï´Ù.
#
# ÀÌ Bash 2.x ¿ë ¹«ÀÛÀ§ ºñ¹Ð¹øÈ£ »ý¼º±â´Â Antek Sawicki <tenox@tenox.tc>
# ÀÇ °ü´ëÇÑ Çã¶ôÇÏ¿¡ ½Æ½À´Ï´Ù.
#
# ==> º» ¹®¼­ÀÇ ÀúÀÚ°¡ Ãß°¡ÇÑ ÁÖ¼® ==>


MATRIX="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
LENGTH="8"
# ==> ´õ ±ä ºñ¹Ð¹øÈ£¸¦ ¿øÇÑ´Ù¸é 'LENGTH'¸¦ ´Ã¸®¼¼¿ä.


while [ "${n:=1}" -le "$LENGTH" ]
# ==> := °¡ "±âº»°ª ġȯ"(default substitution) ¿¬»êÀÚ¿´´ø°Å ±â¾ï³ª½ÃÁÒ?
# ==> ±×·¡¼­ ¸¸¾à¿¡ 'n'ÀÌ ÃʱâÈ­ µÇÁö ¾Ê¾Ò´Ù¸é 1·Î ¼¼Æ®µË´Ï´Ù.
do
	PASS="$PASS${MATRIX:$(($RANDOM%${#MATRIX})):1}"
	# ==> ¾ÆÁÖ ÈǸ¢Çѵ¥ ¾à°£ Çò°¥¸®³×¿ä.

	# ==> Á¦ÀÏ ¾ÈÂʺÎÅÍ »ìÆì º¾½Ã´Ù...
	# ==> ${#MATRIX} ´Â MATRIX ¹è¿­ÀÇ ±æÀ̸¦ ¸®ÅÏÇÕ´Ï´Ù.

	# ==> $RANDOM%${#MATRIX} Àº 1 ºÎÅÍ MATRIXÀÇ ±æÀÌ - 1 ¿¡¼­ 
	# ==> ¹«ÀÛÀ§ ¼ýÀÚ¸¦ ¸®ÅÏÇÕ´Ï´Ù.

	# ==> ${MATRIX:$(($RANDOM%${#MATRIX})):1}
	# ==> Àº MATRIX ¿¡¼­ ±× ¹«ÀÛÀ§ ¼ýÀÚÀÇ À§Ä¡¿¡ ÀÖ´Â 
	# ==> ±æÀÌ 1 Â¥¸® ¹®ÀÚ¿­·Î È®ÀåµÈ °ªÀ» ¸®ÅÏÇÕ´Ï´Ù.
	# ==> 3.3.1 ÀýÀÇ {var:pos:len} ¸Å°³º¯¼ö ġȯ°ú ÇØ´ç ¿¹Á¦µéÀ» Âü°íÇϼ¼¿ä.

	# ==> PASS=... ÀÌ °á°ú¸¦ ¹Ù·Î Àü PASS ¿¡ ºÙÀÔ´Ï´Ù(¿¬°á).

	# ==> PASS °¡ ¸¸µé¾îÁö´Â °úÁ¤À» Á» ´õ È®½ÇÇÏ°Ô º¸°í ½Í´Ù¸é, 
	# ==> ´ÙÀ½ ÁÙÀÇ ÁÖ¼®À» Ǫ¼¼¿ä.
	# ==>             echo "$PASS"
	# ==> ·çÇÁ¸¦ ÇÑ ¹ø µ¹¶§¸¶´Ù PASS °¡ ÇÑ ±ÛÀÚ¾¿ ¸¸µé¾î Áý´Ï´Ù.

	let n+=1
	# ==> ´ÙÀ½ ´Ü°è¸¦ À§ÇØ 'n'À» Áõ°¡.
done

echo "$PASS"      # ==> ÇÊ¿äÇÏ´Ù¸é ÆÄÀÏ·Î ÀçÁöÇâ.

exit 0

+

James R. Van Zandt °¡ º¸³»ÁØ ´ÙÀ½ ½ºÅ©¸³Æ®´Â ³×ÀÓµå ÆÄÀÌÇÁ¸¦ »ç¿ëÇϴµ¥ ±×ÀÇ ¸»¿¡ µû¸£¸é, "Á¤¸»·Î Äõ¿ìÆðú À̽ºÄÉÀÌÇÎ" ¿¬½À¿ëÀ̾ú´ä´Ï´Ù.

¿¹ A-10. fifo: ³×ÀÓµå ÆÄÀÌÇÁ¸¦ ½á¼­ ¸ÅÀÏ ¹é¾÷ÇØ ÁÖ´Â ½ºÅ©¸³Æ®

#!/bin/bash
# ==> James R. Van Zandt °¡ ÀÛ¼ºÇÑ ½ºÅ©¸³Æ®·Î ±×ÀÇ Çã¶ôÇÏ¿¡ ÀÌ°÷¿¡ ½Æ½À´Ï´Ù.

# ==> ÀÌ ¹®¼­ÀÇ ÀúÀÚ°¡ Ãß°¡ÇÑ ÁÖ¼®.

  
  HERE=`uname -n`    # ==> È£½ºÆ®À̸§
  THERE=bilbo
  echo "`date +%r`¿¡ $THERE ·Î ¹é¾÷À» ½ÃÀÛÇÕ´Ï´Ù"
  # ==> `date +%r` Àº ½Ã°£À» 12 ½Ã°£ Æ÷¸Ë("08:08:34 PM")À¸·Î ¸®ÅÏÇÕ´Ï´Ù.
  
  # /pipe °¡ º¸Åë ÆÄÀÏÀÌ ¾Æ´Ï°í ÁøÂ¥ ÆÄÀÌÇÁÀÎÁö È®ÀÎ.
  rm -rf /pipe
  mkfifo /pipe       # ==> "/pipe"¶õ "³×ÀÓµå ÆÄÀÌÇÁ"(named pipd) ¸¸µé±â.
  
  # ==> 'su xyz' ´Â ¸í·É¾î¸¦ "xyz"¶õ »ç¿ëÀÚ·Î ½ÇÇà½Ãŵ´Ï´Ù.
  # ==> 'ssh' ´Â secure shellÀ» ¶ç¿ó´Ï´Ù(¿ø°ÝÁö ·Î±×ÀΠŬ¶óÀ̾ðÆ®).
  su xyz -c "ssh $THERE \"cat >/home/xyz/backup/${HERE}-daily.tar.gz\" < /pipe"&
  cd /
  tar -czf - bin boot dev etc home info lib man root sbin share usr var >/pipe
  # ==> ³×ÀÓµå ÆÄÀÌÇÁ(/pipe)¸¦ ½á¼­ ÇÁ·Î¼¼½º³¢¸® Åë½ÅÀ» ÇÔ
  # ==> 'tar/gzip' Àº /pipe·Î ¾²°í, 'ssh'Àº /pipe¿¡¼­ ÀÐÀ½

  # ==> ÃÖÁ¾ °á°ú´Â / ÀÌÇÏÀÇ ¸ÞÀÎ µð·ºÅ丮µéÀÌ ¹é¾÷ µË´Ï´Ù.

  # ==> Áö±Ý °°Àº »óȲ¿¡¼­ "À͸íÀÇ ÆÄÀÌÇÁ"ÀÎ | ´ë½Å ±× ¹Ý´ëÀÎ 
  # ==> "³×ÀÓµå ÆÄÀÌÇÁ"¸¦ ¾´ °ÍÀÌ ¾î¶² ÀÌÁ¡ÀÌ ÀÖÀ»±î¿ä?
  # ==> À͸í ÆÄÀÌÇÁµµ Á¦´ë·Î µ¿ÀÛÇÒ±î¿ä?


  exit 0

+

´ÙÀ½Àº Stephane Chazelas°¡ º¸³»ÁØ, ¹è¿­¾øÀÌ ¼Ò¼ö(prime number)¸¦ »ý¼ºÇØ ÁÖ´Â ½ºÅ©¸³Æ®ÀÔ´Ï´Ù.

¿¹ A-11. ³ª¸ÓÁö ¿¬»êÀÚ·Î ¼Ò¼ö »ý¼ºÇϱâ

#!/bin/bash
# primes.sh: ¹è¿­À» ¾²Áö ¾Ê°í ¼Ò¼ö(prime number)¸¦ »ý¼º.

#  ÀÌ ½ºÅ©¸³Æ®´Â °íÀüÀûÀÎ "¿¡¶óÅ佺Å׳׽ºÀÇ Ã¼" ¾Ë°í¸®ÁòÀ» ¾²Áö *¾Ê°í*
#+ "%" ³ª¸ÓÁö ¿¬»êÀÚ¸¦ ½á¼­ ¼Ò¼ö¸¦ ±¸ÇÏ´Â Á» ´õ Á÷°üÀûÀÎ ¹æ¹ýÀ» »ç¿ëÇÕ´Ï´Ù.
#
# Stephane Chazelas °¡ º¸³»ÁØ ½ºÅ©¸³Æ®.


LIMIT=1000                    # 2 - 1000 ÀÇ ¼Ò¼ö

Primes()
{
 (( n = $1 + 1 ))             # ´ÙÀ½ Á¤¼ö.
 shift                        # ¸ñ·ÏÀÇ ´ÙÀ½ ¸Å°³º¯¼ö.
#  echo "_n=$n i=$i_"
 
 if (( n == LIMIT ))
 then echo $*
 return
 fi

 for i; do                    # "i"´Â $n ÀÇ ÀÌÀü°ªÀÎ "@"·Î ¼¼Æ®µÊ.
#   echo "-n=$n i=$i-"
   (( i * i > n )) && break   # ÃÖÀûÈ­.
   (( n % i )) && continue    # ³ª¸ÓÁö ¿¬»êÀÚ·Î ¼Ò¼ö°¡ ¾Æ´Ñ ¼ö¸¦ °É·¯³¿.
   Primes $n $@               # ·çÇÁ¾È¿¡¼­ Àç±Í È£Ãâ.
   return
   done

   Primes $n $@ $n            # ·çÇÁ¹Û¿¡¼­ Àç±Í È£Ãâ.
                              # À§Ä¡ ¸Å°³º¯¼ö·Î ´©Àû(accumulate) ¼º°ø.
			      			  # "$@" ´Â ÇöÀç ãÀº ¼Ò¼öÀÇ ¸ñ·ÏÀÔ´Ï´Ù.
}

Primes 1

exit 0

# ¹«½¼ ÀÏÀÌ ÀϾ´ÂÁö ¾Ë°í ½ÍÀ¸¸é 16ÁÙ°ú 24ÁÙÀÇ ÁÖ¼®À» Ç®¾îº¸¼¼¿ä.

# ÀÌ ¾Ë°í¸®Áò°ú ¿¡¶óÅ佺Å׳׽ºÀÇ Ã¼ ¾Ë°í¸®Áò(ex68.sh)ÀÇ ¼Óµµ¸¦ ºñ±³ÇØ º¸¼¼¿ä.

# ¿¬½À¹®Á¦: ´õ ºü¸£°Ô ½ÇÇà½ÃÅ°±â À§Çؼ­ Àç±Í È£ÃâÀ» ¾²Áö ¸»°í ´Ù½Ã ÀÛ¼ºÇØ º¸¼¼¿ä.

+

Jordi Sanfeliu°¡ ÀÌ ±Ù»çÇÑ tree ½ºÅ©¸³Æ®¸¦ ¾²µµ·Ï Çã¶ôÇØ ÁÖ¾ú½À´Ï´Ù.

¿¹ A-12. tree: µð·ºÅ丮 ±¸Á¶¸¦ Æ®¸® ÇüÅ·Πº¸¿©ÁÖ´Â ½ºÅ©¸³Æ®

#!/bin/sh
#         @(#) tree      1.1  30/11/95       by Jordi Sanfeliu
#                                         email: mikaku@arrakis.es
#
#         Initial version:  1.0  30/11/95
#         Next version   :  1.1  24/02/97   ½Éº¼¸¯ ¸µÅ©µµ Áö¿ø
#         Patch by       :  Ian Kjos, ãÀ» ¼ö ¾ø´Â µð·ºÅ丮 Áö¿ø
#                           email: beth13@mail.utexas.edu
#
#         Tree ´Â µð·ºÅ丮 Æ®¸®±¸Á¶¸¦ È®½ÇÈ÷(:-) ) º¸¿©ÁÝ´Ï´Ù.
#

# ==> 'Tree' ½ºÅ©¸³Æ®´Â ¿øÀÚÀÚÀÎ Jordi Sanfeliu ÀÇ Çã¶ôÇÏ¿¡ ¿©±â¿¡ ½Æ½À´Ï´Ù.
# ==> ÀÌ ¹®¼­ÀÇ ÀúÀÚ°¡ Ãß°¡ÇÑ ÁÖ¼®.
# ==> ÀÎÀÚ Äõ¿ìÆà Ãß°¡.


search () {
   for dir in `echo *`
   # ==> `echo *` ´Â ÇöÀç µð·ºÅ丮ÀÇ ¸ðµç ÆÄÀÏÀ» ÇÑ ÁÙ¿¡ Ç¥½ÃÇØ ÁÜ.
   # ==> for dir in *   ¶ó°í ÇÏ´Â °Í°ú ºñ½ÁÇÔ.
   # ==> ÇÏÁö¸¸ "dir in `echo *`" Àº À̸§¿¡ ºó Ä­ÀÌ µé¾îÀÖ´Â ÆÄÀÏÀº ó¸® ¸øÇÔ.
   do
      if [ -d "$dir" ] ; then   # ==> µð·ºÅ丮¶ó¸é(-d)...
         zz=0   # ==> µð·ºÅ丮 ±íÀ̸¦ °®°í ÀÖÀ» Àӽà º¯¼ö.
         while [ $zz != $deep ]    # ¾ÈÂÊ ·çÇÁÀÎÁö °è¼Ó È®ÀÎ.
         do
            echo -n "|   "    # ==> ¼öÁ÷ ¿¬°áÀÚ¸¦ Ç¥½Ã.
	                      # ==> µé¿©¾²±â(indent)¸¦ À§ÇØ ¶óÀÎÇÇµå ¾ø´Â µÎ °³ÀÇ ºó Ä­ 
            zz=`expr $zz + 1` # ==> zz Áõ°¡.
         done
         if [ -L "$dir" ] ; then   # ==> µð·ºÅ丮°¡ ½Éº¼¸¯ ¸µÅ©¶ó¸é...
            echo "+---$dir" `ls -l $dir | sed 's/^.*'$dir' //'`
	    # ==> ¼öÆò ¿¬°áÀÚ¿Í ±ä ¸ñ·Ï Ç¥½Ã(long linting)¿¡¼­ ³¯Â¥/½Ã°£ ºÎºÐÀ» 
		# ==> Á¦¿ÜÇÑ µð·ºÅ丮 À̸ªÀ» Ç¥½Ã.
         else
            echo "+---$dir"      # ==> ¼öÆò ¿¬°áÀÚ¿Í µð·ºÅ丮 À̸§ Ç¥½Ã.
            if cd "$dir" ; then  # ==> ÇÏÀ§ µð·ºÅ丮·Î µé¾î°¥ ¼ö ÀÖ´Ù¸é...
               deep=`expr $deep + 1`   # ==> ±íÀÌ Áõ°¡.
               search     # Àç±ÍÀûÀ¸·Î È£Ãâ ;-)
	                  # ==> ÀÚ±â ÀÚ½ÅÀ» ºÎ¸£´Â ÇÔ¼ö.
               numdirs=`expr $numdirs + 1`   # ==> µð·ºÅ丮 ¼ýÀÚ¸¦ Áõ°¡.
            fi
         fi
      fi
   done
   cd ..   # ==> ºÎ¸ð µð·ºÅ丮·Î ¿Ã¶ó°¨.
   if [ "$deep" ] ; then  # ==> depth = 0 À̸é(TRUEÀ» ¸®ÅÏ)...
      swfi=1              # ==> Ž»öÀÌ ³¡³µÀ½À» ¾Ë¸®´Â Ç÷¡±× ¼¼Æ®.
   fi
   deep=`expr $deep - 1`  # ==> ±íÀ̸¦ °¨¼Ò.
}

# - ¸ÞÀÎ -
if [ $# = 0 ] ; then
   cd `pwd`    # ==> ÀÎÀÚ¾øÀÌ ºÒ¸®¸é ÇöÀç µð·ºÅ丮¿¡¼­ ½ÃÀÛ.
else
   cd $1       # ==> ¾Æ´Ï¸é ÁÖ¾îÁø µð·ºÅ丮·Î À̵¿.
fi
echo "½ÃÀÛ µð·ºÅ丮 = `pwd`"
swfi=0      # ==> Ž»ö Á¾·á Ç÷¡±×.
deep=0      # ==> º¸¿©ÁÙ ±íÀÌ.
numdirs=0
zz=0

while [ "$swfi" != 1 ]   # Ç÷¡±×°¡ ¼¼Æ® ¾È µÈ µ¿¾È...
do
   search   # ==> º¯¼ö¸¦ ÃʱâÈ­ÇÏ°í ÇÔ¼ö¸¦ ºÎ¸§.
done
echo "Àüü µð·ºÅ丮 ¼ö = $numdirs"

exit 0
# ==> µ¶Àڵ鿡°Ô µµÀü: ÀÌ ½ºÅ©¸³Æ®°¡ Á¤È®È÷ ¾î¶»°Ô µ¿ÀÛÇÏ´ÂÁö ¾Ë¾Æ³» º¸¼¼¿ä.

Noah Friedman ÀÇ Çã¶ôÇÏ¿¡ ¹®ÀÚ¿­ Á¶ÀÛ C ¶óÀ̺귯¸® ÇÔ¼ö ¸î °³ÀÇ ½© ½ºÅ©¸³Æ® ¹öÀüÀ» º¸¿© ÁÝ´Ï´Ù.

¿¹ A-13. ¹®ÀÚ¿­ ÇÔ¼öµé: C ÇüÅÂÀÇ ¹®ÀÚ¿­ ÇÔ¼ö

#!/bin/bash

# string.bash --- string(3) ¶óÀ̺귯¸®ÀÇ bash ¿¡¹Ä·¹ÀÌ¼Ç ¹öÀü
# ÀúÀÚ: Noah Friedman <friedman@prep.ai.mit.edu>
# ==>     ÀúÀÚÀÇ Çã¶ôÇÏ¿¡ ÀÌ ¹®¼­¿¡ °ÔÀçÇÔ.
# Created: 1992-07-01
# Last modified: 1993-09-29
# Public domain

# Chet Ramey °¡ bash ¹öÀü 2 ¹®¹ýÀ» ¾²µµ·Ï º¯È¯

# Commentary:
# Code:

#:docstring strcat:
# Usage: strcat s1 s2
#
# Strcat Àº s2 ¸¦ s1 À¸·Î µ¡ºÙÀÓ.
#
# ¿¹Á¦:
#    a="foo"
#    b="bar"
#    strcat a b
#    echo $a
#    => foobar
#
#:end docstring:

###;;;autoload   ==> Autoloading of function commented out.
function strcat ()
{
    local s1_val s2_val

    s1_val=${!1}                        # º¯¼ö °£Á¢ÂüÁ¶ È®Àå
    s2_val=${!2}
    eval "$1"=\'"${s1_val}${s2_val}"\'
    # ==> µÎ º¯¼öÁß Çϳª¶óµµ ÀÛÀº µû¿ÈÇ¥°¡ µé¾î ÀÖÀ» °æ¿ì¿¡´Â,
    # ==> eval $1='${s1_val}${s2_val}' À̶ó°í ÇÏ¸é µË´Ï´Ù.
}

#:docstring strncat:
# »ç¿ë¹ý: strncat s1 s2 $n
# 
# strcat °ú ºñ½ÁÇÏÁö¸¸ s2 ¿¡¼­ ÃÖ´ë n ¹®ÀÚ¸¸Å­¸¸ µ¡ºÙÀÔ´Ï´Ù. s2 °¡ n º¸´Ù
# ª´Ù¸é ±×³É s2 ¸¸ º¹»çÇÕ´Ï´Ù. Echoes result on stdout.
#
# ¿¹Á¦:
#    a=foo
#    b=barbaz
#    strncat a b 3
#    echo $a
#    => foobar
#
#:end docstring:

###;;;autoload
function strncat ()
{
    local s1="$1"
    local s2="$2"
    local -i n="$3"
    local s1_val s2_val

    s1_val=${!s1}                       # ==> º¯¼ö °£Á¢ ÂüÁ¶ È®Àå
    s2_val=${!s2}

    if [ ${#s2_val} -gt ${n} ]; then
       s2_val=${s2_val:0:$n}            # ==> ¹®ÀÚ¿­Á¶°¢(substring) ÃßÃâ
    fi

    eval "$s1"=\'"${s1_val}${s2_val}"\'
    # ==> µÎ º¯¼öÁß Çϳª¶óµµ ÀÛÀº µû¿ÈÇ¥°¡ µé¾î ÀÖÀ» °æ¿ì¿¡´Â,
    # ==> eval $1='${s1_val}${s2_val}' À̶ó°í ÇÏ¸é µË´Ï´Ù.
}

#:docstring strcmp:
# »ç¿ë¹ý: strcmp $s1 $s2
#
# Strcmp ´Â µÎ ÀÎÀÚ¸¦ »çÀü»óÀÇ ¼ø¼­´ë·Î ºñ±³Çؼ­ s1 ÀÌ s2 º¸´Ù ÀÛÀ¸¸é À½¼ö,
# °°À¸¸é 0, Å©¸é ¾ç¼ö¸¦ ¸®ÅÏÇÕ´Ï´Ù.
#:end docstring:

###;;;autoload
function strcmp ()
{
    [ "$1" = "$2" ] && return 0

    [ "${1}" '<' "${2}" ] > /dev/null && return -1

    return 1
}

#:docstring strncmp:
# »ç¿ë¹ý: strncmp $s1 $s2 $n
# 
# strcmp ¿Í ºñ½ÁÇϳª ÃÖ´ë n ¹®ÀÚ¸¸Å­¸¸ ºñ±³ÇÕ´Ï´Ù( n ÀÌ 0 ÀÌÇϸé 0 À» ¸®ÅÏ).
#:end docstring:

###;;;autoload
function strncmp ()
{
    if [ -z "${3}" -o "${3}" -le "0" ]; then
       return 0
    fi
   
    if [ ${3} -ge ${#1} -a ${3} -ge ${#2} ]; then
       strcmp "$1" "$2"
       return $?
    else
       s1=${1:0:$3}
       s2=${2:0:$3}
       strcmp $s1 $s2
       return $?
    fi
}

#:docstring strlen:
# »ç¿ë¹ý: strlen s
#
# Strlen Àº s ÀÇ ±æÀ̸¦ ¸®ÅÏÇÕ´Ï´Ù.
#:end docstring:

###;;;autoload
function strlen ()
{
    eval echo "\${#${1}}"
    # ==> ÀÎÀÚ·Î ³Ñ¾î¿Â º¯¼ö°ªÀÇ ±æÀ̸¦ ¸®ÅÏ
}

#:docstring strspn:
# »ç¿ë¹ý: strspn $s1 $s2
# 
# Strspn Àº s2 Àüü¸¦ Æ÷ÇÔÇÏ´Â s1 ÀÇ ÃÖ´ë Ãʱ⠼¼±×¸ÕÆ® ±æÀ̸¦ ¸®ÅÏÇÕ´Ï´Ù.
#:end docstring:

###;;;autoload
function strspn ()
{
    # IFS ¸¦ ¾ð¼ÂÇØ ³õÀ¸¸é °ø¹é¹®ÀÚµµ ÀÏ¹Ý ¹®ÀÚó·³ ó¸®ÇÒ ¼ö ÀÖ½À´Ï´Ù.
    local IFS=
    local result="${1%%[!${2}]*}"
 
    echo ${#result}
}

#:docstring strcspn:
# »ç¿ë¹ý: strcspn $s1 $s2
#
# Strcspn Àº s2 Àüü°¡ Æ÷ÇÔµÇÁö ¾Ê´Â s1 ÀÇ ÃÖ´ë Ãʱ⠼¼±×¸ÕÆ® ±æÀ̸¦ ¸®ÅÏÇÕ´Ï´Ù.
#:end docstring:

###;;;autoload
function strcspn ()
{
    # IFS ¸¦ ¾ð¼ÂÇØ ³õÀ¸¸é °ø¹é¹®ÀÚµµ ÀÏ¹Ý ¹®ÀÚó·³ ó¸®ÇÒ ¼ö ÀÖ½À´Ï´Ù.
    local IFS=
    local result="${1%%[${2}]*}"
 
    echo ${#result}
}

#:docstring strstr:
# »ç¿ë¹ý: strstr s1 s2
# 
# Strstr Àº s1 ¿¡¼­ s2 °¡ óÀ½ ¹ß°ßµÇ´Â ¹®ÀÚ¿­Á¶°¢(substring)À» ¿¡ÄÚÇØ ÁÖ°í,
# s1 ¿¡¼­ s2 °¡ ¹ß°ßµÇÁö ¾Ê´Â´Ù¸é ±×³É ¹«½ÃÇÕ´Ï´Ù. 
# ¸¸¾à¿¡ s2 °¡ ±æÀÌ°¡ 0 ÀÎ ¹®ÀÚ¿­À» °¡¸£Å²´Ù¸é s1 À» ¸®ÅÏÇÕ´Ï´Ù.
#:end docstring:

###;;;autoload
function strstr ()
{
    # s2 °¡ °¡¸£Å°´Â ¹®ÀÚ¿­ÀÇ ±æÀÌ°¡ 0 À̶ó¸é s1 À» ¿¡ÄÚ
    [ ${#2} -eq 0 ] && { echo "$1" ; return 0; }

    # s1 ¿¡¼­ s2 °¡ ¹ß°ßµÇÁö ¾ÊÀ¸¸é ±×³É ¸®ÅÏ
    case "$1" in
    *$2*) ;;
    *) return 1;;
    esac

    # ÀÏÄ¡ÇÏ´Â ºÎºÐºÎÅÍ ³¡±îÁö¸¦ ¶¼¾î ³»±â À§ÇØ ÆÐÅÏ ¸ÅĪ »ç¿ë
    first=${1/$2*/}

    # ±× ´ÙÀ½¿¡´Â ÀÏÄ¡ÇÏÁö ù¹ø° ºÎºÐÀ» ¶¼¾î³¿
    echo "${1##$first}"
}

#:docstring strtok:
# »ç¿ë¹ý: strtok s1 s2
#
# Strtok Àº s1 ÀÌ ±¸ºÐÀÚÀÎ s2 ¿¡ µé¾î ÀÖ´Â Çϳª ÀÌ»óÀÇ ¹®ÀÚ¿­¿¡ ÀÇÇØ 
# 0 °³ ÀÌ»óÀ¸·Î ÀÌ·ç¾îÁ® ÀÖ´Ù°í °¡Á¤ÇÕ´Ï´Ù. 
# strtok ÀÌ Ã³À½ ºÒ¸®¸é(ºñ¾î ÀÖÁö ¾ÊÀº s1 À» ÁöÁ¤Çؼ­) ù¹ø° ÅäÅ«À» Æ÷ÇÔÇÑ
# ¹®ÀÚ¿­À» Ç¥ÁØÃâ·ÂÀ¸·Î ¿¡ÄÚÇØ ÁÝ´Ï´Ù. ÀÌ ÇÔ¼ö´Â ù¹ø° ÀÎÀÚ°¡ ºó ¹®ÀÚ¿­·Î 
# °è¼Ó È£ÃâµÇµµ·Ï Çؼ­ ¹Ù·Î ´ÙÀ½¿¡ µû¶ó³ª¿À´Â ÅäÅ«À» ó¸®Çϵµ·Ï Çϱâ À§Çؼ­
# È£Ãâ½Ã¸¶´Ù s1 ¿¡¼­ÀÇ ÀÚ½ÅÀÇ À§Ä¡¸¦ °è¼Ó ÃßÀûÇÕ´Ï´Ù.
# ÀÌ·± ½ÄÀ¸·Î Çؼ­ ±× ´ÙÀ½ È£ÃâÀº ´õ ÀÌ»óÀÇ ÅäÅ«ÀÌ ¾øÀ» ¶§±îÁö s1 À» ó¸®ÇÕ´Ï´Ù.
# ±¸ºÐ ¹®ÀÚ¿­ÀÎ s2 ´Â È£Ãâ½Ã¸¶´Ù ´Ù¸¦ ¼ö ÀÖ½À´Ï´Ù. s1 ¿¡ ó¸®ÇÒ ÅäÅ«ÀÌ 
# ³²¾Æ ÀÖÁö ¾Ê´Ù¸é, ºó °ªÀÌ Ç¥ÁØÃâ·ÂÀ¸·Î ¿¡Äڵ˴ϴÙ.

###;;;autoload
function strtok ()
{
 :
}

#:docstring strtrunc:
# »ç¿ë¹ý: strtrunc $n $s1 {$s2} {$...}
# strncmp ó·³ ¿©·¯ ÇÔ¼ö¿¡¼­ ¾²À̴µ¥, ºñ±³¸¦ À§Çؼ­ ÀÎÀÚ¸¦ À߶ó³À´Ï´Ù. 
# °¢°¢ÀÇ s1, s2 ... ¿¡¼­ óÀ½ n °³ÀÇ ¹®ÀÚ¸¦ Ç¥ÁØÃâ·ÂÀ¸·Î ¿¡ÄÚÇØ ÁÝ´Ï´Ù.
#:end docstring:

###;;;autoload
function strtrunc ()
{
    n=$1 ; shift
    for z; do
        echo "${z:0:$n}"
    done
}

# provide string

# string.bash ´Â ¿©±â±îÁö


# ========================================================================== #
# ==> ¿©±âºÎÅÍ´Â º» ¹®¼­ÀÇ ÀúÀÚ°¡ Ãß°¡ÇÑ ºÎºÐÀÔ´Ï´Ù.

# ==> ÀÌ ½ºÅ©¸³Æ®¸¦ ¿©·¯ºÐ ½ºÅ©¸³Æ®¿¡¼­ ¾²·Á¸é ¿©±âºÎÅÍ ³¡±îÁö Áö¿î´ÙÀ½ 
# ==> ¿©·¯ºÐ ½ºÅ©¸³Æ®¿¡¼­ ÀÌ ½ºÅ©¸³Æ®¸¦ "source" ÇϸéµË´Ï´Ù.

# strcat
string0=one
string1=two
echo
echo "\"strcat\" ÇÔ¼ö Å×½ºÆ®:"
echo "¿ø·¡ÀÇ \"string0\" = $string0"
echo "\"string1\" = $string1"
strcat string0 string1
echo "»õ \"string0\" = $string0"
echo

# strlen
echo
echo "\"strlen\" ÇÔ¼ö Å×½ºÆ®:"
str=123456789
echo "\"str\" = $str"
echo -n "\"str\" ÀÇ ±æÀÌ = "
strlen str
echo



# µ¶ÀÚµéÀ» À§ÇÑ ¿¬½À¹®Á¦:
# ¿©±â¼­ ¼Ò°³ÇÑ ¹®ÀÚ¿­ ÇÔ¼ö¸¦ ¸ðµÎ Å×½ºÆ®ÇÏ´Â Äڵ带 ÀÛ¼ºÇØ º¸¼¼¿ä.


exit 0

Stephane Chazelas ´Â Bash ½ºÅ©¸³Æ®ÀÇ °´Ã¼ ÁöÇâÀû ±¸ÇöÀ» º¸¿©Áá½À´Ï´Ù.

¿¹ A-14. °´Ã¼ ÁöÇâ µ¥ÀÌŸ º£À̽º

#!/bin/bash
# obj-oriented.sh: ½© ½ºÅ©¸³Æ®¿¡¼­ °´Ã¼ ÁöÇâÀû ÇÁ·Î±×·¡¹Ö Çϱâ.
# Stephane Chazelas ÀÛ¼º.


person.new()        # C++ ÀÇ Å¬·¡½º ¼±¾ðó·³ º¸ÀÔ´Ï´Ù.
{
  local obj_name=$1 name=$2 firstname=$3 birthdate=$4

  eval "$obj_name.set_name() {
          eval \"$obj_name.get_name() {
                   echo \$1
                 }\"
        }"

  eval "$obj_name.set_firstname() {
          eval \"$obj_name.get_firstname() {
                   echo \$1
                 }\"
        }"

  eval "$obj_name.set_birthdate() {
          eval \"$obj_name.get_birthdate() {
            echo \$1
          }\"
          eval \"$obj_name.show_birthdate() {
            echo \$(date -d \"1/1/1970 0:0:\$1 GMT\")
          }\"
          eval \"$obj_name.get_age() {
            echo \$(( (\$(date +%s) - \$1) / 3600 / 24 / 365 ))
          }\"
        }"

  $obj_name.set_name $name
  $obj_name.set_firstname $firstname
  $obj_name.set_birthdate $birthdate
}

echo

person.new self Bozeman Bozo 101272413
# "person.new" ÀνºÅϽº »ý¼º(½ÇÁ¦·Î´Â ÀÎÀÚ¸¦ ÇÔ¼ö·Î ³Ñ±â´Â °ÍÀÓ).

self.get_firstname       #   Bozo
self.get_name            #   Bozeman
self.get_age             #   28
self.get_birthdate       #   101272413
self.show_birthdate      #   Sat Mar 17 20:13:33 MST 1973

echo

# »ý¼ºµÈ ÇÔ¼ö¸¦ º¸·Á¸é 
# typeset -f
# ¶ó°í ÇØ º¸¼¼¿ä(È­¸éÀÌ ÁÖ·ç·è ¿Ã¶ó°¡´Ï±î Á¶½ÉÇϼ¼¿ä).

exit 0