16.2. ÄÚµå ºí·° ÀçÁöÇâ

while, until, for ·çÇÁÀÇ ÄÚµå ºí·°, ½ÉÁö¾î´Â if/then Å×½ºÆ®¹® ºí·°µµ Ç¥ÁØÀÔ·ÂÀÇ ÀçÁöÇâÀ» ¹Þ¾Æ µéÀÏ ¼ö ÀÖ½À´Ï´Ù. ÇÔ¼öÁ¶Â÷µµ ÀÌ·± ÇüÅÂÀÇ ÀçÁöÇâÀ» ÇÒ ¼ö ÀÖ½À´Ï´Ù(¿¹ 23-7 Âü°í). ÀÌ·¸°Ô ÇÏ·Á¸é, ÇØ´ç ÄÚµå ºí·°ÀÇ Á¦ÀÏ ³¡¿¡ < ¿¬»êÀÚ¸¦ µÎ¸é µË´Ï´Ù.

¿¹ 16-2. ÀçÁöÇâµÈ while ·çÇÁ

#!/bin/bash

if [ -z "$1" ]
then
  Filename=names.data  # ÆÄÀÏÀ̸§ÀÌ ÁöÁ¤µÇÁö ¾ÊÀ» °æ¿ìÀÇ ±âº»°ª.
else
  Filename=$1
fi  
# Filename=${1:-names.data}
# ¶ó°í Çصµ µË´Ï´Ù(¸Å°³º¯¼ö ġȯ).

count=0

echo

while [ "$name" != Smith ]  # $name À» ¿Ö Äõ¿ìÆ® ÇßÀ»±î¿ä?
do
  read name                 # Ç¥ÁØÀÔ·ÂÀÌ ¾Æ´Ï¶ó $Filename ¿¡¼­ ÀÐÀ½.
  echo $name
  let "count += 1"
done <"$Filename"           # Ç¥ÁØÀÔ·ÂÀ» $Filename ÆÄÀÏ·Î ÀçÁöÇâ.
#    ^^^^^^^^^^^^

echo; echo "$count °³ÀÇ À̸§À» Àоú½À´Ï´Ù."; echo

# ¸î¸î ¿À·¡µÈ ½© ½ºÅ©¸³Æ® ¾ð¾î¿¡¼­´Â ÀçÁöÇâµÈ ·çÇÁ°¡ ¼­ºê½©·Î µ½´Ï´Ù.
# ±×·¸±â ¶§¹®¿¡, $count °¡ ·çÇÁ ¹Û¿¡¼­ ÃʱâÈ­µÇ¾î 0 À» ¸®ÅÏÇÕ´Ï´Ù.
# Bash ¿Í ksh Àº °¡´ÉÇÑÇÑ ¼­ºê½©À» ¾È ¶ç¿ì·Á°í Çϱ⠶§¹®¿¡
# ÀÌ ½ºÅ©¸³Æ®´Â Á¦´ë·Î µ¿ÀÛÇÕ´Ï´Ù.
# Heiner Steven ÀÌ ÀÌ Á¡À» ÁöÀûÇØ ÁÖ¾ú½À´Ï´Ù.

exit 0

¿¹ 16-3. ´Ù¸¥ ÇüÅÂÀÇ ÀçÁöÇâµÈ while ·çÇÁ

#!/bin/bash

# ÀÌ ½ºÅ©¸³Æ®´Â ¾Õ¼­ ¼Ò°³ÇØ µå·È´ø ½ºÅ©¸³Æ®ÀÇ ´Ù¸¥ ÇüÅÂÀÔ´Ï´Ù.

# Heiner Steven ÀÌ Á¦°øÇØ ÁØ °ÍÀ¸·Î, 
# ÀçÁöÇâ ·çÇÁ°¡ ¼­ºê½©·Î µ¹ °æ¿ì¿¡ ·çÇÁ ¾ÈÀÇ º¯¼ö°ªÀÌ
# ·çÇÁ Á¾·áÈÄ ±× °ªÀ» ÀÒ¾î ¹ö¸®´Â °Í¿¡ ´ëÇÑ ÇØ°áÃ¥ÀÔ´Ï´Ù.


if [ -z "$1" ]
then
  Filename=names.data     # ÆÄÀÏÀ̸§ÀÌ ÁöÁ¤µÇÁö ¾Ê¾ÒÀ» °æ¿ìÀÇ ±âº»°ª.
else
  Filename=$1
fi  


exec 3<&0                 # Ç¥ÁØÀÔ·ÂÀ» 3¹ø ÆÄÀÏ µð½ºÅ©¸³ÅÍ·Î ÀúÀå.
exec 0<"$Filename"        # Ç¥ÁØÀÔ·ÂÀ» ÀçÁöÇâ.

count=0
echo


while [ "$name" != Smith ]
do
  read name               # ÀçÁöÇâµÈ Ç¥ÁØÀÔ·Â($Filename)¿¡¼­ ÀÐÀ½.
  echo $name
  let "count += 1"
done <"$Filename"         # ·çÇÁ´Â $Filename ÆÄÀÏ¿¡¼­ ÀÔ·ÂÀ» ¹ÞÀ½.
#    ^^^^^^^^^^^^


exec 0<&3                 # ¿ø·¡ Ç¥ÁØÀÔ·ÂÀ» º¹±¸.
exec 3<&-                 # Àӽà ÆÄÀÏ µð½ºÅ©¸³ÅÍ 3¹øÀ» ´ÝÀ½.

echo; echo "$count °³ÀÇ À̸§À» Àоú½À´Ï´Ù."; echo

exit 0

¿¹ 16-4. ÀçÁöÇâµÈ until ·çÇÁ

#!/bin/bash
# ¾ÕÀÇ ¿¹Á¦¿Í ¶È°°À¸³ª "until" ·çÆ®¸¦ »ç¿ë.

if [ -z "$1" ]
then
  Filename=names.data         # ÆÄÀÏÀ̸§ÀÌ ÁöÁ¤µÇÁö ¾Ê¾ÒÀ» °æ¿ìÀÇ ±âº»°ª.
else
  Filename=$1
fi  

# while [ "$name" != Smith ]
until [ "$name" = Smith ]     # != ¸¦ = ·Î ¹Ù²ãÁÖ¼¼¿ä.
do
  read name                   # Ç¥ÁØÀÔ·ÂÀÌ ¾Æ´Ï¶ó $Filename ¿¡¼­ ÀÐ¾î µéÀÔ´Ï´Ù.
  echo $name
done <"$Filename"             # Ç¥ÁØÀÔ·ÂÀ» $Filename ÆÄÀÏ·Î ÀçÁöÇâ.
#    ^^^^^^^^^^^^

# ¾Õ ¿¹Á¦ÀÇ "while" ·çÇÁ¿Í ¶È°°Àº °á°ú°¡ ³ª¿É´Ï´Ù.

exit 0

¿¹ 16-5. ÀçÁöÇâµÈ for ·çÇÁ

#!/bin/bash

if [ -z "$1" ]
then
  Filename=names.data          # ÆÄÀÏÀ̸§ÀÌ ÁöÁ¤µÇÁö ¾ÊÀ» °æ¿ìÀÇ ±âº»°ª.
else
  Filename=$1
fi  

line_count=`wc $Filename | awk '{ print $1 }'`  # ´ë»ó ÆÄÀÏÀÇ ÁÙ ¼ö.
# "for" ·çÇÁ¿¡¼­ Ç¥ÁØÀÔ·ÂÀ» ÀçÁöÇâ ÇÏ´Â°Ô ¾ÆÁÖ ºÎÀÚ¿¬½º·¯¿ö º¸ÀÌ°í
# ±¸ÇöÇϱ⠱î´Ù·Ó°ÚÁö¸¸, ¿©·¯ºÐÀÌ ÃæºÐÈ÷ ¶È¶ÈÇÏ´Ù¸é °¡´ÉÇÕ´Ï´Ù.
#
# Á» ´õ °£´ÜÇÏ°Ô ÇÏ·Á¸é       line_count=$(wc < "$Filename")


for name in `seq $line_count`  # "seq"°¡ ¿¬¼ÓµÈ ¼ýÀÚ¸¦ Ãâ·ÂÇÑ´Ù´Â °Å, ±â¾ï³ª½ÃÁÒ?
# while [ "$name" != Smith ]   --   "while" ·çÇÁº¸´Ù ´õ º¹ÀâÇÕ´Ï´Ù.   --
do
  read name                    # Ç¥ÁØÀÔ·ÂÀÌ ¾Æ´Ñ $Filename ¿¡¼­ ÀÐ¾î µéÀÔ´Ï´Ù.
  echo $name
  if [ "$name" = Smith ]       # ÀÌ·± ÀÛ¾÷À» Ãß°¡ÀûÀ¸·Î µ¡ºÙ¿©¾ß ÇÕ´Ï´Ù.
  then
    break
  fi  
done <"$Filename"              # Ç¥ÁØÀÔ·ÂÀÌ $Filename ¿¡¼­ ÀçÁöÇâ µÊ.
#    ^^^^^^^^^^^^

exit 0

¹Ù·Î ¾ÕÀÇ ¿¹Á¦¸¦ Á¶±Ý º¯°æÇÏ¸é ·çÇÁÀÇ Ãâ·Âµµ ÀçÁöÇâ ÇÒ ¼ö ÀÖ½À´Ï´Ù.

¿¹ 16-6. ÀçÁöÇâµÈ for ·çÇÁ(Ç¥ÁØÀÔ·Â, Ç¥ÁØÃâ·Â ¸ðµÎ ÀçÁöÇâµÊ)

#!/bin/bash

if [ -z "$1" ]
then
  Filename=names.data          # ÆÄÀÏÀ̸§ÀÌ ÁöÁ¤µÇÁö ¾ÊÀ» °æ¿ìÀÇ ±âº»°ª.
else
  Filename=$1
fi  

Savefile=$Filename.new         # °á°ú¸¦ ÀúÀåÇÒ ÆÄÀÏÀ̸§.
FinalName=Jonah                # "read" ½Ã¿¡ ¸¶Áö¸· ÀÔ·ÂÀÌ µÉ À̸§.

line_count=`wc $Filename | awk '{ print $1 }'`  # ´ë»ó ÆÄÀÏÀÇ ÁÙ ¼ö.


for name in `seq $line_count`
do
  read name
  echo "$name"
  if [ "$name" = "$FinalName" ]
  then
    break
  fi  
done < "$Filename" > "$Savefile"     # Ç¥ÁØÀÔ·ÂÀ» $FilenameÀ¸·Î ÀçÁöÇâÇÏ°í,
#    ^^^^^^^^^^^^^^^^^^^^^^^^^^^       ±× °á°ú¸¦ ¹é¾÷ ÆÄÀÏ·Î ÀúÀå.

exit 0

¿¹ 16-7. ÀçÁöÇâµÈ if/then Å×½ºÆ®

#!/bin/bash

if [ -z "$1" ]
then
  Filename=names.data   # ÆÄÀÏÀ̸§ÀÌ ÁöÁ¤µÇÁö ¾ÊÀ» °æ¿ìÀÇ ±âº»°ª.
else
  Filename=$1
fi  

TRUE=1

if [ "$TRUE" ]          # if true    ¿Í   if :   µµ µ¿ÀÛÇÕ´Ï´Ù.
then
 read name
 echo $name
fi <"$Filename"
#  ^^^^^^^^^^^^

# ÆÄÀÏÀÇ Ã¹¹ø° ÁÙ¸¸ ÀÐ¾î µéÀÓ.
# "if/then" Å×½ºÆ®¹®Àº ·çÇÁ¾È¿¡¼­ ¾²ÀÌÁö ¾Ê´Â ÇÑ, ¹Ýº¹Çؼ­ ºñ±³ÇÒ ¹æ¹ýÀÌ ¾ø½À´Ï´Ù.

exit 0

ÄÚµå ºí·°ÀÇ Ç¥ÁØÃâ·ÂÀ» ÀçÁöÇâÇÏ´Â °ÍÀº ±× Ãâ·ÂÀ» ÆÄÀÏ·Î ÀúÀåÇÏ´Â È¿°ú¸¦ °¡Á®¿É´Ï´Ù. ¿¹ 4-2¸¦ Âü°íÇϼ¼¿ä.

Âü°í: Here documents´Â Ưº°ÇÑ Á¾·ùÀÇ ÀçÁöÇâµÈ ÄÚµå ºí·°ÀÔ´Ï´Ù.