3.22. ¹è¿­

bash »õ ¹öÀüºÎÅÍ, 1Â÷¿ø ¹è¿­À» Áö¿øÇϱ⠽ÃÀÛÇß½À´Ï´Ù. variable[xx]ó·³ ¼±¾ðÇÒ ¼öµµ ÀÖ°í declare -a variableó·³ ¹¬½ÃÀûÀ¸·Î ¼±¾ðÇÒ ¼öµµ ÀÖ½À´Ï´Ù. ¹è¿­ º¯¼ö¸¦ ¿ªÂüÁ¶ÇÏ·Á¸é(³»¿ëÀ» ¾Ë¾Æ³»·Á¸é) ${variable[xx]}ó·³ Áß°ýÈ£(curly bracket)¸¦ ¾²¸é µË´Ï´Ù.

예 3-88. °£´ÜÇÑ ¹è¿­ »ç¿ë¹ý

#!/bin/bash


area[11]=23
area[13]=37
area[51]=UFOs

# ¹è¿­ ¸â¹öµéÀº ²À ¿¬¼ÓÀûÀÌÁö ¾Ê¾Æµµ µÇ´Â °Í¿¡ ÁÖÀÇÇϼ¼¿ä.

# ¹è¿­Áß ¸î¸î ¸â¹öµéÀ» ÃʱâÈ­ ½ÃŰÁö ¾ÊÀºÃ¤ ºñ¿ö ³öµµ ±¦Âú½À´Ï´Ù.


echo -n "area[11] = "
echo ${area[11]}
echo -n "area[13] = "
echo ${area[13]}
# {Áß°ýÈ£} °¡ ÇÊ¿äÇÕ´Ï´Ù.
echo "area[51]ÀÇ °ªÀº ${area[51]} ÀÔ´Ï´Ù."

# ÃʱâÈ­ ¾È µÈ ¹è¿­ º¯¼ö´Â ºó Ä­À» ÂïÀ» °ÍÀÔ´Ï´Ù.
echo -n "area[43] = "
echo ${area[43]}
echo "(area[43] Àº ÇÒ´çµÇÁö ¾Ê¾Ò½À´Ï´Ù)"

echo

# µÎ ¹è¿­ º¯¼öÀÇ ÇÕÀ» ¼¼ ¹øÂ°¿¡ ÇÒ´çÇÕ´Ï´Ù.
area[5]=`expr ${area[11]} + ${area[13]}`
echo "area[5] = area[11] + area[13]"
echo -n "area[5] = "
echo ${area[5]}

area[6]=`expr ${area[11]} + ${area[51]}`
echo "area[6] = area[11] + area[51]"
echo -n "area[6] = "
echo ${area[6]}
# ¹®ÀÚ¿­¿¡ Á¤¼ö¸¦ ´õÇÏ´Â °ÍÀº Çã¿ëµÇÁö ¾Ê±â ¶§¹®¿¡ µ¿ÀÛÇÏÁö ¾Ê½À´Ï´Ù.

echo
echo
echo

# -----------------------------------------------------------------
# ´Ù¸¥ ¹è¿­ÀÎ "area2"¸¦ º¾½Ã´Ù.
# ¹è¿­ º¯¼ö¿¡ °ªÀ» ÇÒ´çÇÏ´Â ´Ù¸¥ ¹æ¹ýÀ» º¸¿©ÁÝ´Ï´Ù.
# array_name=( XXX YYY ZZZ ... )

area2=( zero one two three four)

echo -n "area2[0] = "
echo ${area2[0]}
# ¾ÆÇÏ, ¹è¿­ À妽º °ªÀÌ 0ºÎÅÍ ½ÃÀÛÇϴ±º¿ä(¹è¿­ÀÇ Ã¹¹øÂ° ¿ä¼Ò´Â [0]ÀÌÁö [1]ÀÌ ¾Æ´Õ´Ï´Ù).

echo -n "area2[1] = "
echo ${area2[1]}  # [1]ÀÌ ¹è¿­ÀÇ µÎ¹øÂ° ¿ä¼Ò°¡ µË´Ï´Ù.
# -----------------------------------------------------------------


echo
echo
echo

# -----------------------------------------------
# ¶Ç ´Ù¸¥ ¹è¿­ "area3".
# ¹è¿­ º¯¼ö¿¡ °ªÀ» ÇÒ´çÇÏ´Â ¶Ç ´Ù¸¥ ¹æ¹ý.
# array_name=([xx]=XXX [yy]=YYY ...)

area3=([17]=seventeen [24]=twenty-four)

echo -n "area3[17] = "
echo ${area3[17]}

echo -n "area3[24] = "
echo ${area3[24]}
# -----------------------------------------------


exit 0

¹è¿­ º¯¼öµéÀº ÀڽŸ¸ÀÇ ¹®¹ýÀÌ ÀÖ½À´Ï´Ù. ¶ÇÇÑ, Ç¥ÁØ bash ¿¬»êÀڵ鵵 ¹è¿­¿¡ ¾µ Ưº°ÇÑ ¿É¼ÇÀ» °®°í ÀÖ½À´Ï´Ù.

예 3-89. ¹è¿­ÀÇ Æ¯º°ÇÑ Æ¯¼º ¸î °¡Áö

#!/bin/bash

declare -a colors
# ¹è¿­À» Å©±â ÁöÁ¤¾øÀÌ ¼±¾ðÇÏ°Ô ÇØÁÝ´Ï´Ù.

echo "ÁÁ¾ÆÇÏ´Â »ö±òÀ» ³ÖÀ¸¼¼¿ä(ºó Ä­À¸·Î ±¸ºÐÇØ ÁÖ¼¼¿ä)."

read -a colors
# 'read' ÀÇ Æ¯º°ÇÑ ¿É¼ÇÀ¸·Î ¹è¿­¿¡ ÀÐÀº °ªÀ» ³Ö¾î ÁÝ´Ï´Ù.

echo

  element_count=${#colors[@]} # ¹è¿­ÀÇ ÃÑ °¹¼ö¸¦ ¾Ë¾Æ³»±â À§ÇÑ Æ¯º°ÇÑ ¹®¹ý
# element_count=${#colors[*]} µµ °°½À´Ï´Ù.
index=0

# ¹è¿­ÀÇ ¸ðµç ¿ä¼Ò¸¦ º¸¿©ÁÝ´Ï´Ù.
while [ $index -lt $element_count ]
do
  echo ${colors[$index]}
  let "index = $index + 1"
done
# °¢ ¹è¿­ ¿ä¼Ò´Â ÇÑ ÁÙ¿¡ Çϳª¾¿ ÂïÈ÷´Âµ¥
# ÀÌ·¸°Ô Çϱ⠽ÈÀ¸¸é echo -n "${colors[$index]} " ¶ó°í Çϼ¼¿ä.

echo

# ¹è¿­ÀÇ ¸ðµç ¿ä¼Ò¸¦ ´Ù½Ã º¸¿©Áִµ¥ À̹ø¿¡´Â Á» ´õ ¿ì¾ÆÇÑ ¹æ¹ýÀ» ¾¹´Ï´Ù.
  echo ${colors[@]}
# echo ${colors[*]} µµ ¶È°°ÀÌ µ¿ÀÛÇÕ´Ï´Ù.


echo

exit 0

À§ ¿¹Á¦¿¡¼­ º» °Íó·³ ${array_name[@]}³ª ${array_name[*]}´Â ¹è¿­ÀÇ ¸ðµç ¿ø¼ÒµéÀ» ³ªÅ¸³À´Ï´Ù. ¹è¿­ÀÇ ¿ø¼Ò °¹¼ö¸¦ ³ªÅ¸³»·Á¸é ¾ÕÀÇ Ç¥Çö°ú ºñ½ÁÇÏ°Ô ${#array_name[@]}³ª ${#array_name[*]}¶ó°í ÇÏ¸é µË´Ï´Ù.

--

¹è¿­À» ¾²¸é ½© ½ºÅ©¸³Æ®¿¡¼­µµ ¿À·¡µÇ°í Àͼ÷ÇÑ ¾Ë°í¸®ÁòµéÀ» ±¸ÇöÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. ¹°·Ð, ÀÌ·¸°Ô ÇÏ´Â °ÍÀÌ ¹Ýµå½Ã ÁÁÀº »ý°¢ÀÎÁö ¾Æ´ÑÁö´Â µ¶ÀÚ ¿©·¯ºÐÀÌ °áÁ¤ÇÒ ÀÏÀÔ´Ï´Ù.

예 3-90. ¾ÆÁÖ ¿À·¡µÈ Ä£±¸: ¹öºí ¼ÒÆ®

#!/bin/bash

# ºÒ¿ÏÀüÇÑ ¹öºí Á¤·Ä

# ¹öºí Á¤·Ä ¾Ë°í¸®ÁòÀ» ´Ù½Ã »ý°¢ÇØ º¸¼¼¿ä. ÀÌ ½ºÅ©¸³Æ®¿¡¼­´Â...

# Á¤·ÄÇÒ ¹è¿­À» ¸Å¹ø Ž»öÇÒ ¶§ ¸¶´Ù ÀÎÁ¢ÇÑ µÎ ¿ø¼Ò¸¦ ºñ±³Çؼ­ ¼ø¼­°¡ 
# ´Ù¸£¸é µÎ °³¸¦ ¹Ù²ß´Ï´Ù.
# ù¹øÂ° Ž»ö¿¡¼­´Â "°¡Àå Å«" ¿ø¼Ò°¡ Á¦ÀÏ ³¡À¸·Î °©´Ï´Ù.
# µÎ¹øÂ° Ž»ö¿¡¼­´Â µÎ¹øÂ°·Î "°¡Àå Å«" ¿ø¼Ò°¡ ³¡¿¡¼­ µÎ ¹øÂ°·Î °©´Ï´Ù.
# ÀÌ·¸°Ô ÇÏ¸é °¢ Ž»ö ´Ü°è´Â ¹è¿­º¸´Ù ÀÛÀº ¼ö ¸¸Å­À» °Ë»öÇÏ°Ô µÇ°í,
# µÚ·Î °¥¼ö·Ï Ž»ö ¼Óµµ°¡ »¡¶óÁö´Â °ÍÀ» ´À³¥ ¼ö ÀÖÀ» °Ì´Ï´Ù.


exchange()
{
  # ¹è¿­ÀÇ µÎ ¸â¹ö¸¦ ¹Ù²ãÄ¡±â ÇÕ´Ï´Ù.
  local temp=${Countries[$1]} # ¹Ù²ãÄ¡±âÇÒ µÎ º¯¼ö¸¦ À§ÇÑ Àӽà ÀúÀå¼Ò
  Countries[$1]=${Countries[$2]}
  Countries[$2]=$temp
  
  return
}  

declare -a Countries  # º¯¼ö Á¤ÀÇ, ¹Ø¿¡¼­ ÃʱâÈ­ µÇ±â ¶§¹®¿¡ ¿©±â¼­´Â ¾È ½áµµ µË´Ï´Ù.

Countries=(Netherlands Ukraine Zair Turkey Russia Yemen Syria Brazil Argentina Nicaragua Japan Mexico Venezuela Greece England Israel Peru Canada Oman Denmark Wales France Kashmir Qatar Liechtenstein Hungary)
# X·Î ½ÃÀÛÇÏ´Â ³ª¶ó À̸§Àº »ý°¢ÀÌ ¾È ³ª³×¿ä, ÂÁ...

clear  # ½ÃÀÛÇϱâ Àü¿¡ È­¸éÀ» ±ú²ýÀÌ Áö¿ì°í...

echo "0: ${Countries[*]}"  # 0¹øÂ° Ž»öÀÇ ¹è¿­ Àüü¸¦ º¸¿©ÁÜ.

number_of_elements=${#Countries[@]}
let "comparisons = $number_of_elements - 1"

count=1 # Ž»ö Ƚ¼ö.

while [ $comparisons -gt 0 ]   # ¹Ù±ùÂÊ ·çÇÁÀÇ ½ÃÀÛ
do

  index=0  # °¢ Ž»ö ´Ü°è¸¶´Ù ¹è¿­ÀÇ ½ÃÀÛ À妽º¸¦ 0À¸·Î ÀâÀ½

  while [ $index -lt $comparisons ] # ¾ÈÂÊ ·çÇÁÀÇ ½ÃÀÛ
  do
    if [ ${Countries[$index]} \> ${Countries[`expr $index + 1`]} ]
    # ¼ø¼­°¡ Ʋ¸®¸é...
    # \> °¡ ¾Æ½ºÅ° ºñ±³ ¿¬»êÀÚ¿´´ø°Å ±â¾ï³ª½ÃÁÒ?
    then
      exchange $index `expr $index + 1`  # ¹Ù²ß½Ã´Ù.
    fi  
    let "index += 1"
  done # ¾ÈÂÊ ·çÇÁÀÇ ³¡
  

let "comparisons -= 1"
# "°¡Àå Å«" ¿ø¼Ò°¡ Á¦ÀÏ ³¡À¸·Î °¬±â ¶§¹®¿¡ ºñ±³È½¼ö¸¦ Çϳª ÁÙÀÏ Çʿ䰡 ÀÖ½À´Ï´Ù.

echo
echo "$count: ${Countries[@]}"
# °¢ Ž»ö ´Ü°è°¡ ³¡³ª¸é °á°ú¸¦ º¸¿©ÁÝ´Ï´Ù.
echo
let "count += 1"   # Ž»ö Ƚ¼ö¸¦ ´Ã¸³´Ï´Ù.

done  # ¹Ù±ùÂÊ ·çÇÁÀÇ ³¡

# ³¡!

exit 0

--

¹è¿­À» ¾²¸é ¿¡¶óÅ佺Å׳׽ºÀÇ Ã¼(Sieve of Erastosthenes)ÀÇ ½© ½ºÅ©¸³Æ® ¹öÀüÀ» ±¸ÇöÇÒ ¼ö ÀÖ½À´Ï´Ù. ¹°·Ð, ÀÌ·¸°Ô öÀúÇÏ°Ô ¸®¼Ò½º¿¡ ÀÇÁ¸ÇÏ´Â ¾îÇø®ÄÉÀ̼ÇÀº C °°Àº ÄÄÆÄÀÏ ¾ð¾î·Î ¾²¿©Á®¾ß ÇÕ´Ï´Ù. ÀÌ ½© ½ºÅ©¸³Æ® ¹öÀüÀº ±²ÀåÈ÷ ´À¸®°Ô µ¿ÀÛÇÕ´Ï´Ù.

예 3-91. º¹ÀâÇÑ ¹è¿­ ¾îÇø®ÄÉÀ̼Ç: ¿¡¶óÅ佺Å׳׽ºÀÇ Ã¼(Sieve of Erastosthenes)

#!/bin/bash

# sieve.sh
# ¿¡¶óÅ佺Å׳׽ºÀÇ Ã¼(Sieve of Erastosthenes)
# ¼Ò¼ö¸¦ ã¾ÆÁÖ´Â °í´ëÀÇ ¾Ë°í¸®Áò

# ÀÌ ½ºÅ©¸³Æ®´Â ¶È°°Àº C ÇÁ·Î±×·¥º¸´Ù 
# µÎ ¼¼¹è´Â ´À¸®°Ô µ¿ÀÛÇÕ´Ï´Ù.

LOWER_LIMIT=1
# 1ºÎÅÍ
UPPER_LIMIT=1000
# 1000±îÁö
# (½Ã°£ÀÌ ÁÖüÇÏÁö ¸øÇÒ Á¤µµ·Î ³²¾Æ µ·´Ù¸é 
# ÀÌ °ªÀ» ´õ ³ô°Ô Àâ¾Æµµ µË´Ï´Ù.)

PRIME=1
NON_PRIME=0

let SPLIT=UPPER_LIMIT/2
# ÃÖÀûÈ­:
# ¿ÀÁ÷ »óÇѰªÀÇ ¹Ý ¸¸ È®ÀÎÇØ º¸·Á°í ÇÒ °æ¿ì


declare -a Primes
# Primes[] Àº ¹è¿­ÀÔ´Ï´Ù.


initialize ()
{
# ¹è¿­À» ÃʱâÈ­

i=$LOWER_LIMIT
until [ $i -gt $UPPER_LIMIT ]
do
  Primes[i]=$PRIME
  let "i += 1"
done
# ¹«Á˰¡ ¹àÇôÁö±â Àü¿¡´Â ¹è¿­ÀÇ ¸ðµç °ªÀÌ À¯ÁË(¼Ò¼ö)¶ó°í °¡Á¤
}

print_primes ()
{
# Primes[]ÀÇ ¿ø¼ÒÁß ¼Ò¼ö¶ó°í ¹àÇôÁø °ÍµéÀ» º¸¿©ÁÝ´Ï´Ù.

i=$LOWER_LIMIT

until [ $i -gt $UPPER_LIMIT ]
do

  if [ ${Primes[i]} -eq $PRIME ]
  then
    printf "%8d" $i
    # ¼ýÀÚ´ç 8Ä­À» ÁÖ¾î ¿¹»Ú°Ô º¸¿©ÁÝ´Ï´Ù.
  fi
  
  let "i += 1"
  
done

}

sift ()
{
# ¼Ò¼ö°¡ ¾Æ´Ñ ¼ö¸¦ °É·¯³À´Ï´Ù.

let i=$LOWER_LIMIT+1
# 1ÀÌ ¼Ò¼öÀΰÍÀº ¾Ë°í ÀÖÀ¸´Ï±î 2ºÎÅÍ ½ÃÀÛÇÕ´Ï´Ù.

until [ $i -gt $UPPER_LIMIT ]
do

if [ ${Primes[i]} -eq $PRIME ]
# ÀÌ¹Ì °É·¯Áø ¼ýÀÚ(¼Ò¼ö°¡ ¾Æ´Ñ ¼ö)´Â °Ç³Ê¶Ý´Ï´Ù.
then

  t=$i

  while [ $t -le $UPPER_LIMIT ]
  do
    let "t += $i "
    Primes[t]=$NON_PRIME
    # ¸ðµç ¹è¼ö¸¦ ¼Ò¼ö°¡ ¾Æ´Ï¶ó°í Ç¥½ÃÇÕ´Ï´Ù.
  done

fi  

  let "i += 1"
done  


}


# ÇÔ¼öµéÀ» ¼ø¼­´ë·Î ºÎ¸¨´Ï´Ù.
initialize
sift
print_primes
echo
# ÀÌ·±°ÍÀ» ¹Ù·Î ±¸Á¶Àû ÇÁ·Î±×·¡¹ÖÀ̶ó°í ÇÑ´ä´Ï´Ù.

exit 0