[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 |