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






Posted by 김용환 '김용환'

댓글을 달아 주세요