본문 바로가기
프로...Linux

[SHELL] bash/sh 실수 계산 작업

by 크크다스 2019. 4. 2.
반응형

[SHELL] bash/sh 실수 계산 작업


실수에 대한 계산이나 조건이 체크가 안되어 찾기 시작함.



기본 : expr 사용

while [ $price <= $PRICE_MAX ]

do

    price=`expr "$price" + "$step"`

done



정수처리에는 문제가 없으나 실수처리로 가면 에러가 발생함.


실수 처리용 : bc 사용

while [ `echo "$price <= $PRICE_MAX" | bc` -eq "1" ]

do

        do_sum $amount $price rand

        price=`echo "$price + $step" | bc`

done



아래 사이트가 참 잘 설명되어  있다.


참고> expr & bc 명령어 (정수 및 실수 연산을 bash에서 쓰기)


출처: https://knight76.tistory.com/entry/expr-bc-명령어-정수-및-실수-연산을-bash에서-쓰기 [김용환 블로그(2004-2018)]


백업용으로 옮겨본다.

--------------------------


bash script로 정수 연산이 가능하다. expr를 사용하면 가능하다. 


$ a=1

$ b=2

$ c=`expr $a + $b`

$ echo $c

3



참고로 expr 사용시 공백이 연산자 주변에 있지 않으면 문자열로 인식한다. (;;;;)


$ c=`expr $a-$b`

$ echo $c

1-2



만약 실수 연산을 하면 decimal 숫자가 없다고 expr 에러가 발생한다.


$ a=1.1

$ b=2.2

$ c=`expr $a + $b`

expr: not a decimal number: '1.1'




실수 연산을 하려면 bc 명령어를 활용한다. bc는  An arbitrary precision calculator language 이다.


echo 연산식에 파이프라인으로 bc를 추가한다.


 $ echo $a+$b |bc

3.3




여러 연산을 동시에 하려면 세미콜론(;)을 사용하고, 마지막 연산 값을 last 또는 점(.)으로 활용할 수 있다.


$ echo "$a+$b;last/2;last+1" | bc

3.3

1

2



$ echo "$a+$b;./2;.+1" | bc

3.3

1

2


<<< 을 사용하면 bc 커맨드를 맨 앞으로 위치시킬 수 있다.


$ bc <<< $a+$b

3.3


정확도가 높은 실수 계산을 bc -l을 사용한다. 


$ echo "$a/$b;./3;.+1.11" | bc -l

.50000000000000000000

.16666666666666666666

1.27666666666666666666



sqrt도 함께 사용할 수 있다. 참고로 read로 파일도 읽을 수 있다.


$ echo "sqrt(10^2)" | bc

10



지수도 함께 사용할 수 있다.


$ echo "e(1)" | bc -l

2.71828182845904523536




실수를 표현하다 보니, 길이에 대한 개념이 있다. lengh와 scale 속성을 이용한다. length는 숫자의 전체 개수이고, scala는 소수점(.)뒤에 개수를 의미한다. 


scale=10을 주면, 소수점 10자리를 표현한다.


$ echo "scale=10;e(1)" | bc -l

2.7182818284




scale=200을 주면, 소수점 10자리를 표현한다.


$ echo "scale=200;e(1)" | bc -l

2.718281828459045235360287471352662497757247093699959574966967627724\

07663035354759457138217852516642742746639193200305992181741359662904\

357290033429526059563073813232862794349076323382988075319525101901




출처: https://knight76.tistory.com/entry/expr-bc-명령어-정수-및-실수-연산을-bash에서-쓰기 [김용환 블로그(2004-2018)]

반응형

'프로...Linux' 카테고리의 다른 글

[Process] Zombie  (0) 2019.05.28
[Perl] 인코딩 변환  (0) 2019.04.03
[Locale] 언어 설정(ko_KR : euckr / utf8)  (1) 2019.04.01
[APT] 저장소(repository) 변경하기  (0) 2019.03.31
[SHELL] bash/sh 스트링(String) 변수 작업  (0) 2019.03.21