adsense_in_article_test


[bash: expr, bc] 산수 계산 (정수 및 실수 연산) 리눅스 bash script

리눅스 셸에서 산수 계산을 하는 방법이다.

간단한 정수 연산은 아래와 같이 할 수 있다.

expr 34 + 51

이렇게 하면 85가 출력될 것이다. 수와 연산기호 사이에는 반드시 띄어쓰기를 해 주자. 더하기(+), 빼기(-), 곱하기(\*), 나누기(/), 모듈로(modulo, %) 등을 할 수 있다. 곱하기의 경우 연산기호에 유의하자. 반드시 \* 이렇게 써야 한다.

34*51의 결과를 result 변수에 저장하려면 아래와 같이 하면 되겠다.

result=`expr 34 \* 51`
echo "$result"

정수가 아니라 실수를 사용하고 싶다거나, 연산기호가 여러개 들어가는 복잡한 계산을 하려면 expr로는 안되고 bc를 이용해야 한다.

34.8+51.2를 더하고 이 값을 제곱하려면 아래와 같이 하면 되겠다.

echo "(34.8+51.1)^2" | bc

bc를 사용할 때는 곱하기 연산기호를 평소처럼 그냥 쓰면 된다. 예를 들어 24*3은 아래와 같이 하면 된다.

echo "24*3" | bc

echo 명령으로 출력하는 수식은 반드시 따옴표로 묶어 주자.


-- 2013.7.24 추가 --

실수 나눗셈에 대한 부분을 추가로 적어 두기로 했다.

echo "1/2" | bc
0

1을 2로 나누는 예시인데, 결과가 0.5가 아니라 0이라고 나온다. 기본 설정이 정수 연산으로 되어 있어서 그러니, 제대로 된 결과를 얻으려면 scale 변수에 소수점 이하 몇자리를 출력할 것인지 지정해 주어야겠다. 소수점 이하 세자리를 출력하고 싶으면 아래와 같이 해 보자.

echo "scale=3; 1/2" | bc
0.500

이제 결과가 제대로 나왔다.



핑백

  • 반달가면 : [bash: RANDOM] 난수 생성 2013-04-03 23:37:05 #

    ... 들어 두자리수를 만들려면 난수를 100으로 나눈 나머지값을 취하면 된다. echo `expr $RANDOM % 100` 좀 더 복잡한 범위를 주고 싶다면 지난번에 올린 산수 계산 게시물에 있는 bc를 이용하자. 범위가 120이상 253이하인 난수를 만들려면 어떻게 할까? 일단 0~133 사이의 난수를 만든 후에 120을 더해 주면 ... more

  • 반달가면 : [bash: function] 함수 만들기 2013-08-19 23:26:36 #

    ... 대략 아래와 같다. 함수 이름은 arith_test이고 스크립트 안에서 arith_test 3 4 이런 식으로 호출해서 쓰면 된다. bc 명령을 이용한 산수 계산은 이전 게시물을 참고하자. # 함수 arith_test: f = (x+y)^2 function arith_test(){ echo "( $1 + $2 )^2 | b ... more

  • 반달가면 : [bash: echo, bc] 진법 변경(2진수/16진수 변환 등) 2014-06-17 23:03:29 #

    ... 산수 계산에 유용한 bc 명령을 이용하면 10진수를 2진수나 16진수로, 또는 그 반대로 변환할 수 있다. bc 명령에 대한 내용은 이전 게시물을 참고하자. 여기로 일단 아래의 예시를 보자. # 10진수를 2진수로 변환 (obase 변경) echo "obase=2; 27" | bc 11011 bc에는 출력값과 입력값의 기수 ... more

  • 반달가면 : [bash: date] 둘 날짜 사이의 시간차 구하기 2015-03-30 23:13:07 #

    ... 음 두 값의 차이를 구하면 두 날짜의 시간차(단위:초)가 된다. 초 단위의 시간차를 일 단위로 환산하려면 86400으로 나누면 되겠다(1일=86400초). 이 계산은 bc 명령을 이용하면 된다. 아래의 예시를 보자. # 날짜를 1970.1.1 자정을 기준으로 초 단위로 환산 first_date=`date -d "20140711" "+ ... more

  • 반달가면 : [bash: bc] 자연수 나눗셈에서 올림/반올림 2016-03-17 21:24:46 #

    ... 나눗셈을 할 때, 결과값은 나눈 몫의 자연수 부분이 되고 소수점 부분은 버려지게 된다. (bc를 이용한 산수 계산에 대한 좀 더 자세한 내용은 이전 게시물을 참고하자. 여기로) echo "10/3" | bc 3 만약 소수점 부분에 대해 올림이나 반올림을 적용하고 싶다면 아래과 같이 변형시켜서 계산하면 되겠다. 먼저 올림부터 보자. 변 ... more

  • 반달가면 : [bash: ((] 정수 계산 및 변수값 증가/감소 2016-06-01 20:25:07 #

    ... 값을 1 감소 (( a-- )) # a의 값을 3 증가 (( a+=3 )) # a의 값을 2 감소 (( a-=2 )) # 출력 echo "$a" 2 expr 또는 bc를 사용해도 동일한 결과를 얻을 수 있으나, 이중괄호를 사용하면 외부의 프로그램을 실행하지 않고 bash 내부에서 계산이 이루어지므로 정수 계산이 아주 많이 ... more

  • 반달가면 : [bash:awk] awk를 이용한 분산/표준편차 계산 2020-02-11 20:58:26 #

    ... cnt-1) }' data.txt` 표준편차는 분산의 제곱근을 취하면 된다. 이미 분산값을 알고 있으므로 bc를 이용해서 계산하면 되겠다. (bc에 대한 이전 게시물은 여기에) # 표준편차 계산 - stdev_p(모집단), stdev_s(표본) stdev_p=`echo "sqrt($variance_p)" | bc` stdev_s=`e ... more

  • 반달가면 : [bash: bc, sed] 1보다 작거나 -1보다 큰 계산 결과에서 앞자리에 0 표시하기 (.5 -> 0.5) 2021-02-17 21:28:28 #

    ... 우선, 리눅스에서 bc를 이용한 산수 계산에 대한 기본적인 내용은 이전 게시물을 참고하자. 여기로 bc로 계산한 결과 값이 -1에서 1 사이일 경우, 정수 자리의 0은 표시되지 않는다. 아래의 예시를 보자. echo "scale=2; 10/11" | bc . ... more

덧글

  • SY Kim 2013/04/01 21:23 # 답글

    expr은 외부 명령이라 process creation 오버헤드 때문에 최근엔 잘 쓰이지 않습니다.

    대신 bash에서 제공하는 let 명령을 쓰시면 됩니다.
    let은 사칙연산 외에 복합연산, 승수등 다양한 연산이 지원됩니다.
  • 반달가면 2013/04/01 21:38 #

    오랫 동안 솔라리스에서 ksh 쓰던 버릇 때문에 그런지 옛날식 표현을 많이 쓰게 되는 것 같습니다. 찾아 보니 let 명령도 상당히 유용하네요. 감사합니다.
댓글 입력 영역
* 비로그인 덧글의 IP 전체보기를 설정한 이글루입니다.



통계 위젯 (화이트)

18166
2716
2481984

2019 대표이글루_IT

B-Side