°í±Þ Bash ½ºÅ©¸³Æà °¡À̵å: Bash¸¦ ÀÌ¿ëÇÑ ½© ½ºÅ©¸³Æà ¿ÏÀü °¡À̵å | ||
---|---|---|
ÀÌÀü | 12Àå. ¿ÜºÎ ÇÊÅÍ, ÇÁ·Î±×·¥, ¸í·É¾î | ´ÙÀ½ |
Á¤¼ö¸¦ ¼Ò¼ö·Î ÀμöºÐÇØÇÕ´Ï´Ù.
bash$ factor 27417 27417: 3 13 19 37 |
¹«ÇÑ Á¤¹Ðµµ(arbitrary precision)ÀÇ °è»êÀ» °¡´ÉÄÉ ÇØ ÁÖ´Â À¯¿¬ÇÑ À¯Æ¿¸®Æ¼.
bc´Â ¾à°£ ¾Ö¸ÅÇÑ C ¹®¹ýÀ» µû¸¨´Ï´Ù.
dc´Â RPN("¿ªÆú¶õµå½Ä Ç¥±â¹ý, Reverse Polish Notation")À» ¾¹´Ï´Ù.
µÑ Áß¿¡¼ ½ºÅ©¸³Æ®¿¡¼ ¾²±â¿¡´Â bc°¡ ´õ À¯¿ëÇØ º¸ÀÔ´Ï´Ù. bc´Â ²Ï Àß µ¿ÀÛÇÏ´Â À¯´Ð½º À¯Æ¿¸®Æ¼À̱⠶§¹®¿¡ ÆÄÀÌÇÁ¿¡¼ ¾²ÀÏ ¼öµµ ÀÖ½À´Ï´Ù.
bash´Â ºÎµ¿¼Ò¼öÁ¡ ¿¬»êÀ» ÇÒ ¼ö ¾ø°í ¸î¸î Áß¿äÇÑ »ê¼úÀûÀÎ ±â´ÉÀÌ ºüÁ® ÀÖÁö¸¸ ´ÙÇàÈ÷, bc°¡ ÀÌ·± ºÎºÐÀ» ¸Þ²ãÁÝ´Ï´Ù.
´ÙÀ½Àº bc·Î ½ºÅ©¸³Æ® º¯¼ö¸¦ °è»êÇϱâ À§ÇÑ °£´ÜÇÑ Æ²ÀÔ´Ï´Ù. ¿©±â¼´Â ¸í·É¾î ġȯÀ» »ç¿ëÇÕ´Ï´Ù.
variable=$(echo "OPTIONS; OPERATIONS" | bc) |
¿¹ 12-28. Àú´ç¿¡ ´ëÇÑ ¿ù »óȯ¾×(Monthly Payment on a Mortgage)
#!/bin/bash # monthlypmt.sh: Àú´ç¿¡ ´ëÇÑ ¿ù »óȯ¾×À» °è»ê. # ÀÌ ½ºÅ©¸³Æ®´Â Jeff Schmidt ¿Í Mendel Cooper(ÀÌ ¹®¼ÀÇ ÀúÀÚÀÎ º»ÀÎ)ÀÌ ÀÛ¼ºÇÑ # "mcalc"(Àú´ç¾× °è»ê±â, mortgage calculator) ÆÐÅ°ÁöÀÇ ¼öÁ¤º»ÀÔ´Ï´Ù. # http://www.ibiblio.org/pub/Linux/apps/financial/mcalc-1.6.tar.gz [15k] echo echo "¿ø±Ý, ÀÌÀÚÀ², Àú´ç ±â°£À» ÀÔ·ÂÇÏ¸é ¿ù »óȯ¾×À» °è»êÇÕ´Ï´Ù." bottom=1.0 echo echo -n "¿ø±ÝÀ» ³ÖÀ¸¼¼¿ä(ÄÞ¸¶ ¾øÀÌ) " read principal echo -n "ÀÌÀÚÀ²À» ³ÖÀ¸¼¼¿ä(ÆÛ¼¾Æ®·Î) " # ¸¸¾à¿¡ 12% ¶ó¸é ".12"°¡ ¾Æ´Ï°í "12"¶ó°í ÀÔ·Â. read interest_r echo -n "±â°£À» ³ÖÀ¸¼¼¿ä(¿ù ´ÜÀ§) " read term interest_r=$(echo "scale=9; $interest_r/100.0" | bc) # ¼Ò¼ö·Î º¯È¯. # "scale" ·Î ¼Ò¼öÁ¡ ÀÌÇÏ ¸î ÀÚ¸®±îÁö Ç¥ÇöÇÒ °ÍÀÎÁö¸¦ °áÁ¤. interest_rate=$(echo "scale=9; $interest_r/12 + 1.0" | bc) top=$(echo "scale=9; $principal*$interest_rate^$term" | bc) echo; echo "½Ã°£ÀÌ Á» °É¸®¹Ç·Î, ´À±ßÇÏ°Ô ±â´Ù¸®±â ¹Ù¶ø´Ï´Ù." let "months = $term - 1" for ((x=$months; x > 0; x--)) do bot=$(echo "scale=9; $interest_rate^$x" | bc) bottom=$(echo "scale=9; $bottom+$bot" | bc) # bottom = $(($bottom + $bot")) done # let "payment = $top/$bottom" payment=$(echo "scale=2; $top/$bottom" | bc) # ´Þ·¯¿Í ¼¾Æ® Ç¥½Ã¸¦ À§ÇØ ¼Ò¼öÁ¡ ÀÌÇÏ µÎ ÀÚ¸®¸¸ Ç¥½Ã. echo echo "¿ù »óȯ¾× = \$$payment" # °á°ú ¾Õ¿¡ ´Þ·¯ Ç¥½Ã¸¦ ¿¡ÄÚ. echo exit 0 # ¿¬½À¹®Á¦: # 1) ¿ø±Ý ÀԷ½à ÄÞ¸¶¸¦ ¾µ ¼ö ÀÖ°Ô ÇØ º¸¼¼¿ä. # 2) ÀÌÀÚ ÀԷ½à ÆÛ¼¾Æ® Ç¥½Ã³ª ¼Ò¼öÁ¡ Ç¥½Ã µÑ ´Ù ¾µ ¼ö ÀÖ°Ô ÇØ º¸¼¼¿ä. # 3) ´õ ¸ÚÀÖ´Â ½ºÅ©¸³Æ®·Î ¸¸µé·Á¸é, # ¿ÏÀüÇÑ ºÎä »óȯǥ(amortization tables)¸¦ Ãâ·ÂÇϵµ·Ï °íÃÄ º¸¼¼¿ä. |
¿¹ 12-29. Áø¹ý º¯È¯(Base Conversion)
: ########################################################################## # Shellscript: base.sh - ¼ýÀÚ¸¦ ´Ù¸¥ Áø¹ýÀ¸·Î º¸¿©ÁÜ(Bourne Shell) # Author : Heiner Steven (heiner.steven@odn.de) # Date : 07-03-95 # Category : Desktop # $Id: base.sh,v 1.2 2000/02/06 19:55:35 heiner Exp $ ########################################################################## # Description # # Changes # 21-03-95 stv ÀÔ·ÂÀÌ 0xb ÀÏ °æ¿ì »ý±â´Â ¿¡·¯ °íħ(0.2) ########################################################################## # ==> ½ºÅ©¸³Æ® ÀúÀÚÀÇ Çã¶ôÇÏ¿¡ »ç¿ëÇÔ. # ==> ÀÌ Ç¥½Ã´Â ÀÌ ¹®¼ÀÇ ÀúÀÚ°¡ ÁÖ¼®À» ºÙÀÎ °ÍÀÓ. NOARGS=65 PN=`basename "$0"` # ÇÁ·Î±×·¥ À̸§ VER=`echo '$Revision: 1.2 $' | cut -d' ' -f2` # ==> VER=1.2 Usage () { echo "$PN - ¼ýÀÚ¸¦ ´Ù¸¥ Áø¹ýÀ¸·Î º¸¿©ÁÜ, $VER (stv '95) »ç¿ë¹ý: $PN [¼ýÀÚ ...] ¼ýÀÚ¸¦ ¾Ë·ÁÁÖÁö ¾ÊÀ¸¸é Ç¥ÁØ ÀԷ¿¡¼ ÀнÀ´Ï´Ù. °¡´ÉÇÑ ¼ýÀڷδ 2 Áø¼ö 0b ·Î ½ÃÀÛ(Áï, 0b1100) 8 Áø¼ö 0 À¸·Î ½ÃÀÛ(Áï, 014) 16 Áø¼ö 0x ·Î ½ÃÀÛ(Áï, 0xc) 10 Áø¼ö ±× ¿Ü(Áï, 12)" >&2 exit $NOARGS } # ==> »ç¿ë¹ýÀ» ¾Ë·Á ÁÖ´Â ÇÔ¼ö. Msg () { for i # ==> in [list] °¡ ºüÁ® ÀÖ½À´Ï´Ù. do echo "$PN: $i" >&2 done } Fatal () { Msg "$@"; exit 66; } PrintBases () { # ¼ýÀÚÀÇ Áø¹ýÀ» °áÁ¤. for i # ==> in [list] °¡ ºüÁ® ÀÖ¾î¼... do # ==> ¸í·É¾îÁÙ ÀÎÀÚ(µé)¿¡ ´ëÇؼ µ¿ÀÛ. case "$i" in 0b*) ibase=2;; # 2Áø¼ö 0x*|[a-f]*|[A-F]*) ibase=16;; # 16Áø¼ö 0*) ibase=8;; # 8Áø¼ö [1-9]*) ibase=10;; # 10Áø¼ö *) Msg "ºÎÀûÀýÇÑ ¼ýÀÚ($i)¶ó ¹«½ÃÇÕ´Ï´Ù." continue;; esac # Á¢µÎ»ç¸¦ Á¦°ÅÇÏ°í, 16Áø¼ö¸¦ ´ë¹®ÀÚ·Î º¯È¯(bc¿¡¼ ÇÊ¿äÇÔ). number=`echo "$i" | sed -e 's:^0[bBxX]::' | tr '[a-f]' '[A-F]'` # ==> sed ±¸ºÐÀÚ·Î "/"°¡ ¾Æ´Ñ ":"¸¦ ½è³×¿ä. # ÀÏ´Ü 10Áø¼ö·Î º¯È¯ dec=`echo "ibase=$ibase; $number" | bc` # ==> 'bc' ´Â °è»ê¿ë À¯Æ¿¸®Æ¼ÁÒ. case "$dec" in [0-9]*) ;; # µÆ±º¿ä. *) continue;; # ¿¡·¯³×¿ä. ¹«½ÃÇÕ´Ï´Ù. esac # º¯È¯µÈ ¼ýÀÚµéÀ» ÇÑ ÁÙ·Î Ãâ·ÂÇÕ´Ï´Ù. # ==> 'here document' ´Â ¸í·É¾î ¸ñ·ÏÀ» 'bc'·Î ÀԷ½ÃÄÑ ÁÝ´Ï´Ù. echo `bc <<! obase=16; "hex="; $dec obase=10; "dec="; $dec obase=8; "oct="; $dec obase=2; "bin="; $dec ! ` | sed -e 's: : :g' done } while [ $# -gt 0 ] do case "$1" in --) shift; break;; -h) Usage;; # ==> µµ¿ò¸». -*) Usage;; *) break;; # ù¹ø° ¼ýÀÚ. esac # ==> ÀԷ¿¡ ´ëÇؼ ¿¡·¯ üũ¸¦ ´õ Çϸé Á» ´õ À¯¿ëÇÏ°Ô ¾µ ¼ö ÀÖÀ» °Ì´Ï´Ù. shift done if [ $# -gt 0 ] then PrintBases "$@" else # Ç¥ÁØÀԷ¿¡¼ Àбâ. while read line do PrintBases $line done fi |
bc¸¦ ½ÇÇà½ÃÅ°´Â ´Ù¸¥ ¹æ¹ýÀ¸·Î´Â ¸í·É¾î ġȯ ºí·° ¾È¿¡¼ here document¸¦ ¾²´Â °ÍÀÔ´Ï´Ù. ÀÌ ¹æ¹ýÀº ½ºÅ©¸³Æ®¿¡¼ bc·Î ¿É¼Ç°ú ¸í·É¾î¸¦ ³Ñ±â·Á°í ÇÒ ¶§ ƯÈ÷ Àû´çÇÕ´Ï´Ù.
variable=`bc << LIMIT_STRING options statements operations LIMIT_STRING ` ...¾Æ´Ï¸é... variable=$(bc << LIMIT_STRING options statements operations LIMIT_STRING ) |
¿¹ 12-30. ´Ù¸¥ ¹æ¹ýÀ¸·Î bc ½ÇÇà
#!/bin/bash # 'bc'¸¦ 'here document'¿Í °°ÀÌ ¾´ °ÍÀ» ¸í·É¾î ġȯÀ» ½á¼ ½ÇÇà. var1=`bc << EOF 18.33 * 19.78 EOF ` echo $var1 # 362.56 # $( ... ) Ç¥±â¹ýµµ ¿ª½Ã µË´Ï´Ù. v1=23.53 v2=17.881 v3=83.501 v4=171.63 var2=$(bc << EOF scale = 4 a = ( $v1 + $v2 ) b = ( $v3 * $v4 ) a * b + 15.35 EOF ) echo $var2 # 593487.8452 var3=$(bc -l << EOF scale = 9 s ( 1.7 ) EOF ) # 1.7 ¶óµð¾ÈÀÇ »çÀΰªÀ» ¸®ÅÏ. # "-l" ¿É¼ÇÀº 'bc'ÀÇ ¼öÇÐ ¶óÀ̺귯¸®¸¦ È£ÃâÇÕ´Ï´Ù. echo $var3 # .991664810 # ÀÌÁ¦, ÇÔ¼ö¿¡¼ ÇØ º¸ÁÒ... hyp= # Àü¿ª º¯¼ö ¼±¾ð. hypotenuse () # Á¤»ï°¢ÇüÀÇ ºøº¯À» °è»ê. { hyp=$(bc -l << EOF scale = 9 sqrt ( $1 * $1 + $2 * $2 ) EOF ) # ºÒÇàÇÏ°Ôµµ, Bash ÇÔ¼ö¿¡¼´Â ºÎµ¿Çü °ªÀ» ¸®ÅÏÇÒ ¼ö ¾ø½À´Ï´Ù. } hypotenuse 3.68 7.31 echo "hypotenuse = $hyp" # 8.184039344 exit 0 |