26Àå. ¹è¿­

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

¿¹ 26-1. °£´ÜÇÑ ¹è¿­ »ç¿ë¹ý

#!/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 ¿¬»êÀڵ鵵 ¹è¿­¿¡ ¾µ ¼ö Àִ Ưº°ÇÑ ¿É¼ÇÀ» °®°í ÀÖ½À´Ï´Ù.

 array=( zero one two three four five )

echo ${array[0]}       #  zero
echo ${array:0}        #  zero
                       #  ù¹ø° ¿ä¼ÒÀÇ ¸Å°³º¯¼ö È®Àå.
echo ${array:1}        #  ero
                       #  ù¹ø° ¿ä¼ÒÀÇ µÎ ¹ø° ¹®ÀÚ¿¡¼­ºÎÅÍ ¸Å°³º¯¼ö È®Àå.

echo ${#array}         #  4
                       #  ¹è¿­ ù¹ø° ¿ä¼ÒÀÇ ±æÀÌ.

¸î¸î Bash ³»Àå ¸í·ÉµéÀº ¹è¿­ ¹®¸Æ¿¡¼­ ±× Àǹ̰¡ ¾à°£ ¹Ù²ò´Ï´Ù. ¿¹¸¦ µé¾î, unset Àº ¹è¿­ÀÇ ÇÑ ¿ä¼Ò¸¦ Áö¿öÁְųª ¹è¿­ Àüü¸¦ Áö¿öÁÝ´Ï´Ù.

¿¹ 26-2. ¹è¿­ÀÇ Æ¯º°ÇÑ Æ¯¼º ¸î °¡Áö

#!/bin/bash

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

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

read -a colors    # ¾Æ·¡¼­ ¼³¸íÇÒ Æ¯Â¡µé ¶§¹®¿¡, ÃÖ¼ÒÇÑ 3°³ÀÇ »ö±òÀ» ³ÖÀ¸¼¼¿ä.
#  'read'ÀÇ Æ¯º°ÇÑ ¿É¼ÇÀ¸·Î ¹è¿­¿¡ ÀÐÀº °ªÀ» ³Ö¾î ÁÝ´Ï´Ù.

echo

element_count=${#colors[@]}
# ¹è¿­ ¿ä¼ÒÀÇ ÃÑ °¹¼ö¸¦ ¾Ë¾Æ³»±â À§ÇÑ Æ¯º°ÇÑ ¹®¹ý.
#     element_count=${#colors[*]} ¶ó°í Çصµ µË´Ï´Ù.
#
#  "@" º¯¼ö´Â Äõ¿ìÆ® ¾È¿¡¼­ÀÇ ³¹¸» Á¶°¢³²(word splitting)À» Çã¿ëÇØ ÁÝ´Ï´Ù.
#+ (°ø¹é¹®ÀÚ¿¡ ÀÇÇØ ³ª´²Á® ÀÖ´Â º¯¼öµéÀ» ÃßÃâÇØ ³¿).

index=0

while [ "$index" -lt "$element_count" ]
do    # ¹è¿­ÀÇ ¸ðµç ¿ä¼Ò¸¦ ³ª¿­ÇØ ÁÝ´Ï´Ù.
  echo ${colors[$index]}
  let "index = $index + 1"
done
# °¢ ¹è¿­ ¿ä¼Ò´Â ÇÑ ÁÙ¿¡ Çϳª¾¿ ÂïÈ÷´Âµ¥,
# ÀÌ°Ô ½È´Ù¸é  echo -n "${colors[$index]} " ¶ó°í ÇÏ¸é µË´Ï´Ù.
#
# ´ë½Å "for" ·çÆ®¸¦ ¾²¸é:
#   for i in "${colors[@]}"
#   do
#     echo "$i"
#   done
# (Thanks, S.C.)

echo

# Á» ´õ ¿ì¾ÆÇÑ ¹æ¹ýÀ¸·Î ¸ðµç ¹è¿­ ¿ä¼Ò¸¦ ´Ù½Ã ³ª¿­.
  echo ${colors[@]}          # echo ${colors[*]}   ¶ó°í Çصµ µË´Ï´Ù.

echo

# "unset" ¸í·É¾î´Â ¹è¿­ ¿ä¼Ò¸¦ Áö¿ì°Å³ª ¹è¿­ Àüü¸¦ Áö¿öÁÝ´Ï´Ù.
unset colors[1]              # ¹è¿­ÀÇ µÎ¹ø° ¿ä¼Ò¸¦ »èÁ¦.
                             # colors[1]=    ¶ó°í Çصµ µË´Ï´Ù.
echo  ${colors[@]}           # ¹è¿­À» ´Ù½Ã ³ª¿­Çϴµ¥ À̹ø¿¡´Â µÎ ¹ø° ¿ä¼Ò°¡ ºüÁ®ÀÖ½À´Ï´Ù.

unset colors                 # ¹è¿­ Àüü¸¦ »èÁ¦.
                             #  unset colors[*] ³ª
                             #+ unset colors[@] ¶ó°í Çصµ µË´Ï´Ù.
echo; echo -n "»ö±òÀÌ ¾ø¾îÁ³¾î¿ä."			   
echo ${colors[@]}            # ¹è¿­À» ´Ù½Ã ³ª¿­ÇØ º¸Áö¸¸ ºñ¾îÀÖÁÒ.

exit 0

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

¿¹ 26-3. ºó ¹è¿­°ú ºó ¿ø¼Ò

#!/bin/bash
# empty-array.sh

# ºó ¹è¿­°ú ºó ¿ä¼Ò¸¦ °®´Â ¹è¿­Àº ´Ù¸¨´Ï´Ù.

array0=( first second third )
array1=( '' )   # "array1" Àº ÇÑ °³ÀÇ ¿ä¼Ò¸¦ °®°í ÀÖ½À´Ï´Ù.
array2=( )      # ¿ä¼Ò°¡ ¾øÁÒ... "array2"´Â ºñ¾î ÀÖ½À´Ï´Ù.

echo

echo "array0 ÀÇ ¿ä¼Òµé:  ${array0[@]}"
echo "array1 ÀÇ ¿ä¼Òµé:  ${array1[@]}"
echo "array2 ÀÇ ¿ä¼Òµé:  ${array2[@]}"
echo
echo "array0 ÀÇ Ã¹¹ø° ¿ä¼Ò ±æÀÌ = ${#array0}"
echo "array1 ÀÇ Ã¹¹ø° ¿ä¼Ò ±æÀÌ = ${#array1}"
echo "array2 ÀÇ Ã¹¹ø° ¿ä¼Ò ±æÀÌ = ${#array2}"
echo
echo "array0 ÀÇ ¿ä¼Ò °¹¼ö = ${#array0[*]}"  # 3
echo "array1 ÀÇ ¿ä¼Ò °¹¼ö = ${#array1[*]}"  # 1  (³î¶øÁÒ!)
echo "array2 ÀÇ ¿ä¼Ò °¹¼ö = ${#array2[*]}"  # 0

echo

exit 0  # Thanks, S.C.

${array_name[@]}¿Í ${array_name[*]}ÀÇ °ü°è´Â $@ ¿Í $*ÀÇ °ü°è¿Í ºñ½ÁÇÕ´Ï´Ù. ÀÌ °­·ÂÇÑ ¹è¿­ Ç¥±â¹ýÀº ¾µ¸ð°¡ ¾ÆÁÖ ¸¹½À´Ï´Ù.

# ¹è¿­ º¹»ç.
array2=( "${array1[@]}" )

# ¹è¿­¿¡ ¿ø¼Ò Ãß°¡.
array=( "${array[@]}" "»õ ¿ø¼Ò" )
# ȤÀº
array[${#array[*]}]="»õ ¿ø¼Ò"

# Thanks, S.C.

--

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

¿¹ 26-4. ¾ÆÁÖ ¿À·¡µÈ Ä£±¸: ¹öºí Á¤·Ä(Bubble Sort)

#!/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 °°Àº ÄÄÆÄÀÏ ¾ð¾î·Î ¾²¿©Á®¾ß ÇÕ´Ï´Ù. ÀÌ ½© ½ºÅ©¸³Æ® ¹öÀüÀº ±²ÀåÈ÷ ´À¸®°Ô µ¿ÀÛÇÕ´Ï´Ù.

¿¹ 26-5. º¹ÀâÇÑ ¹è¿­ ¾îÇø®ÄÉÀ̼Ç: ¿¡¶óÅ佺Å׳׽ºÀÇ Ã¼(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



# ----------------------------------------------- #
# ´ÙÀ½ ÄÚµå´Â ½ÇÇàµÇÁö ¾Ê½À´Ï´Ù.

# ÀÌ°ÍÀº Stephane Chazelas ÀÇ Çâ»óµÈ ¹öÀüÀ¸·Î ½ÇÇà ¼Óµµ°¡ Á» ´õ ºü¸¨´Ï´Ù.

# ¼Ò¼öÀÇ ÃÖ´ë ÇѰ踦 ¸í·É¾îÁÙ¿¡¼­ ÁöÁ¤ÇØ ÁÖ¾î¾ß µË´Ï´Ù.

UPPER_LIMIT=$1                  # ¸í·É¾îÁÙ¿¡¼­ÀÇ ÀÔ·Â.
let SPLIT=UPPER_LIMIT/2         # ÃÖ´ë¼öÀÇ Áß°£.

Primes=( '' $(seq $UPPER_LIMIT) )

i=1
until (( ( i += 1 ) > SPLIT ))  # Áß°£±îÁö¸¸ È®ÀÎ ÇÊ¿ä.
do
  if [[ -n $Primes[i] ]]
  then
    t=$i
    until (( ( t += i ) > UPPER_LIMIT ))
    do
      Primes[t]=
    done
  fi  
done  
echo ${Primes[*]}

exit 0

ÀÌ ¹è¿­ ±â¹ÝÀÇ ¼Ò¼ö »ý¼º±â¿Í ¹è¿­À» ¾²Áö ¾Ê´Â ¿¹ A-11¸¦ ºñ±³ÇØ º¸¼¼¿ä.

--

¹è¿­ÀÇ "÷ÀÚ"(subscript)¸¦ ´É¼÷ÇÏ°Ô Á¶ÀÛÇÏ·Á¸é Àӽ÷Π¾µ º¯¼ö°¡ ÀÖ¾î¾ß ÇÕ´Ï´Ù. ´Ù½Ã ¸»ÇÏÁö¸¸, ÀÌ·± ÀÏÀÌ ÇÊ¿äÇÑ ÇÁ·ÎÁ§Æ®µéÀº ÆÞÀ̳ª C ó·³ ´õ °­·ÂÇÑ ÇÁ·Î±×·¡¹Ö ¾ð¾îÀÇ »ç¿ëÀ» °í·ÁÇØ º¸±â ¹Ù¶ø´Ï´Ù.

¿¹ 26-6. º¹ÀâÇÑ ¹è¿­ ¾îÇø®ÄÉÀ̼Ç: ±â¹¦ÇÑ ¼öÇÐ ±Þ¼ö Ž»ö(Exploring a weird mathematical series)

#!/bin/bash

# Douglas Hofstadter ÀÇ À¯¸íÇÑ "Q-±Þ¼ö"(Q-series):

# Q(1) = Q(2) = 1
# Q(n) = Q(n - Q(n-1)) + Q(n - Q(n-2)), for n>2

# "¹«Áú¼­ÇÑ" Q-±Þ¼ö´Â ÀÌ»óÇÏ°í ¿¹ÃøÇÒ ¼ö ¾ø´Â ÇൿÀ» º¸ÀÔ´Ï´Ù.
# ÀÌ ±Þ¼öÀÇ Ã³À½ 20°³ Ç×Àº ´ÙÀ½°ú °°½À´Ï´Ù:
# 1 1 2 3 3 4 5 5 6 6 6 8 8 8 10 9 10 11 11 12 

# Hofstadter ˂ ̴, "Goedel, Escher, Bach: An Eternal Golden Braid",
# p. 137, ff. ¸¦ Âü°íÇϼ¼¿ä.


LIMIT=100     # °è»êÇÒ Ç× ¼ö
LINEWIDTH=20  # ÇÑ ÁÙ¿¡ Ãâ·ÂÇÒ Ç× ¼ö

Q[1]=1        # óÀ½ µÎ Ç×Àº 1.
Q[2]=1

echo
echo "Q-±Þ¼ö [$LIMIT Ç×]:"
echo -n "${Q[1]} "             # óÀ½ µÎ Ç×À» Ãâ·Â
echo -n "${Q[2]} "

for ((n=3; n <= $LIMIT; n++))  # C ÇüÅÂÀÇ ·çÇÁ Á¶°Ç.
do   # Q[n] = Q[n - Q[n-1]] + Q[n - Q[n-2]]  for n>2
# Bash ´Â º¹ÀâÇÑ ¹è¿­ ¿¬»êÀ» Àß Ã³¸®ÇÒ ¼ö ¾ø±â ¶§¹®¿¡
# À§ÀÇ ½ÄÀ» Çѹø¿¡ °è»êÇÏÁö ¾Ê°í Áß°£¿¡ ´Ù¸¥ Ç×À» µÎ¾î °è»êÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù.

  let "n1 = $n - 1"        # n-1
  let "n2 = $n - 2"        # n-2
  
  t0=`expr $n - ${Q[n1]}`  # n - Q[n-1]
  t1=`expr $n - ${Q[n2]}`  # n - Q[n-2]
  
  T0=${Q[t0]}              # Q[n - Q[n-1]]
  T1=${Q[t1]}              # Q[n - Q[n-2]]

Q[n]=`expr $T0 + $T1`      # Q[n - Q[n-1]] + Q[n - ![n-2]]
echo -n "${Q[n]} "

if [ `expr $n % $LINEWIDTH` -eq 0 ]    # ¿¹»Û Ãâ·Â
then   #    ³ª¸ÓÁö
  echo # °¢ ÁÙÀÌ ±¸ºÐµÇµµ·Ï ÇØ ÁÜ.
fi

done

echo

exit 0

# ¿©±â¼­´Â Q-±Þ¼ö¸¦ ¹Ýº¹ÀûÀ¸·Î ±¸ÇöÇß½À´Ï´Ù.
# Á» ´õ Á÷°üÀûÀÎ Àç±ÍÀû ±¸ÇöÀº µ¶ÀÚµéÀ» À§ÇØ ³²°Ü ³õ°Ú½À´Ï´Ù.
# °æ°í: ÀÌ ±Þ¼ö¸¦ Àç±ÍÀûÀ¸·Î °è»êÇϸé "¾ÆÁÖ" ±ä ½Ã°£ÀÌ °É¸³´Ï´Ù.

--

bash´Â 1Â÷¿ø ¹è¿­¸¸ Áö¿øÇÕ´Ï´Ù¸¸, ¾à°£ÀÇ ¼ÓÀÓ¼ö¸¦ ¾²¸é ´ÙÂ÷¿ø ¹è¿­À» Èä³»³¾ ¼ö ÀÖ½À´Ï´Ù.

¿¹ 26-7. 2Â÷¿ø ¹è¿­À» Èä³»³½ ´ÙÀ½, ±â¿ïÀ̱â(tilting it)

#!/bin/bash
# 2Â÷¿ø ¹è¿­À» ½Ã¹Ä·¹ÀÌÆ®.

# 2Â÷¿ø ¹è¿­Àº ¿­(row)À» ¿¬¼ÓÀûÀ¸·Î ÀúÀåÇؼ­ ±¸ÇöÇÕ´Ï´Ù.

Rows=5
Columns=5

declare -a alpha     # C ¿¡¼­ 
                     # char alpha[Rows][Columns];
					 # ÀÎ °Íó·³. ÇÏÁö¸¸ ºÒÇÊ¿äÇÑ ¼±¾ðÀÔ´Ï´Ù.

load_alpha ()
{
local rc=0
local index


for i in A B C D E F G H I J K L M N O P Q R S T U V W X Y
do
  local row=`expr $rc / $Columns`
  local column=`expr $rc % $Rows`
  let "index = $row * $Rows + $column"
  alpha[$index]=$i   # alpha[$row][$column]
  let "rc += 1"
done  

# declare -a alpha=( A B C D E F G H I J K L M N O P Q R S T U V W X Y )
# ¶ó°í ÇÏ´Â °Í°ú ºñ½ÁÇÏÁö¸¸ ÀÌ·¸°Ô Çϸé À¢Áö 2Â÷¿ø ¹è¿­°°Àº ´À³¦ÀÌ µéÁö ¾Ê½À´Ï´Ù.
}

print_alpha ()
{
local row=0
local index

echo

while [ "$row" -lt "$Rows" ]   # "¿­ ¿ì¼±"(row major) ¼ø¼­·Î Ãâ·Â
                               # ¿­(¹Ù±ù ·çÇÁ)Àº ±×´ë·Î°í ÇàÀÌ º¯ÇÔ.
do                            
  local column=0
  
  while [ "$column" -lt "$Columns" ]
  do
    let "index = $row * $Rows + $column"
    echo -n "${alpha[index]} "  # alpha[$row][$column]
    let "column += 1"
  done

  let "row += 1"
  echo

done  

# °£´ÜÇÏ°Ô ´ÙÀ½Ã³·³ ÇÒ ¼öµµ ÀÖ½À´Ï´Ù.
#   echo ${alpha[*]} | xargs -n $Columns

echo
}

filter ()     # ¹è¿­ÀÇ À½¼ö À妽º¸¦ °É·¯³¿.
{

echo -n "  "  # ±â¿ïÀÓ(tilt) Á¦°ø.

if [[ "$1" -ge 0 &&  "$1" -lt "$Rows" && "$2" -ge 0 && "$2" -lt "$Columns" ]]
then
    let "index = $1 * $Rows + $2"
    # ÀÌÁ¦, ȸÀü(rotate)½ÃÄÑ Ãâ·Â.
    echo -n " ${alpha[index]}"  # alpha[$row][$column]
fi    

}
  



rotate ()  # ¹è¿­ ¿ÞÂÊ ¾Æ·¡¸¦ ±âÁØÀ¸·Î 45µµ ȸÀü.
{
local row
local column

for (( row = Rows; row > -Rows; row-- ))  # ¹è¿­À» µÚ¿¡¼­ºÎÅÍ Çϳª¾¿ ó¸®.
do

  for (( column = 0; column < Columns; column++ ))
  do

    if [ "$row" -ge 0 ]
    then
      let "t1 = $column - $row"
      let "t2 = $column"
    else
      let "t1 = $column"
      let "t2 = $column + $row"
    fi  

    filter $t1 $t2   # ¹è¿­ÀÇ À½¼ö À妽º¸¦ °É·¯³¿.
  done

  echo; echo

done 

# ¹è¿­ ȸÀü(array rotation)Àº Herbert Mayer °¡ ¾´
# "Advanced C Programming on the IBM PC"¿¡ ³ª¿Â ¿¹Á¦(143-146 ÂÊ)¿¡¼­
# ¿µ°¨À» ¹Þ¾Æ ÀÛ¼ºÇß½À´Ï´Ù(¼­Áö»çÇ× Âü°í).

}


#-----------------------------------------------------#
load_alpha     # ¹è¿­À» Àаí,
print_alpha    # Ãâ·ÂÇÑ ´ÙÀ½,
rotate         # ¹Ý½Ã°è ¹æÇâÀ¸·Î 45µµ ȸÀü.
#-----------------------------------------------------#


# ÀÌ ½ºÅ©¸³Æ®´Â ¿¹Á¦¸¦ À§ÇÑ ¿¹Á¦À̱⠶§¹®¿¡ ¾à°£ ¾î»öÇÑ ¸éÀÌ ÀÖ½À´Ï´Ù.
#
# µ¶ÀÚ¸¦ À§ÇÑ ¿¬½À¹®Á¦ 1:
# ¹è¿­À» ÀÐ¾î µéÀÌ°í Ãâ·ÂÇÏ´Â ÇÔ¼ö¸¦ 
# Á» ´õ ±³À°ÀûÀÌ°í ¿ì¾ÆÇÏ°Ô ´Ù½Ã ÀÛ¼ºÇØ º¸¼¼¿ä.
#
# ¿¬½À¹®Á¦ 2:
# ¹è¿­ ȸÀü ÇÔ¼ö°¡ ¾î¶»°Ô µ¿ÀÛÇÏ´ÂÁö ¾Ë¾Æ³» º¸¼¼¿ä.
# ÈùÆ®: ¹è¿­ÀÇ ¿ªÀ妽ÌÀÌ ÀǹÌÇÏ´Â ¹Ù°¡ ¹»±î¿ä?

exit 0