본문 바로가기
리눅스 (Linux)

산술연산 관련 명령어들 (expr, bc, awk)

by 멸치김밥 2021. 12. 22.

쉘 스크립트 내에서 산술연산을 할 때는

$((x+y))

$((5*7))

같이 소괄호 두개로 묶는 형태로 입력한다.

#!/bin/bash
x=3
y=4

echo $((   x +y))
echo $(($x* $y ))

변수를 사용하기 위해서는 변수앞에 $를 붙이는데

$(( )) 안에서는 붙여도 되고 붙이지 않아도 된다.

또 $(( )) 안에서는 띄어쓰기도 따로 엄격하지 않아서 위처럼 공백이 막 있어도 정상적으로 작동한다.


  • let

let 명령어를 이용한 변수선언 안에서는 $도, ()도 없이 변수를 이용한 산술연산이 가능하다.

#!/bin/bash
x=3
y=4
let z=x*y
let a=10/2
echo $z
echo $a

  • expr

expr 명령어를 사용하면 네가지 연산을 할 수 있다.

  • 산술 : + - * / %
  • 논리 : | &
  • 관계 : = != > >= < <=
  • 문자열 : : (일치 혹은 substitute)

expr에서는 연산자와 피연산자 사이에 공백' ' 이 있어야한다.

없으면 통으로 하나의 문자열로 인식한다.

또한 쉘 스크립트에서 이미 특수문자를 사용하고 있기 때문에 expr에서 사용할 특수문자와 겹치는 것은 따옴표나 쌍따옴표로 감싸거나 앞에 \를 붙여준다.

 

해당 특수문자

  • * all 전체
  • & bg
  • | pipe 파이프
  • > 리다이렉션
  • < 리다이렉션
  • ( ) grouping 그룹화
#!/bin/bash
x=3
y=4

echo $(expr 2+2)         <-----잘못된것
echo $(expr x+y)         <-----잘못된것
echo $(expr 2 + 2)
echo $(expr $x + $y + -22)
echo $(expr $x '*' $y)
echo $(expr $x "*" $y)
echo $(expr $x \* $y)

  • awk

awk는 소수점도 사용이 가능하다

위의 expr과 같은 경우는 소수점이 없는 정수형이어서 나머지가 생기는 나누기와 같은 연산을 하면 소수점은 버린 결과를 보여주지만 awk는 소수점까지 나온다.

그러나 사용 방법이 번거롭다

$ echo 3 4 | awk '{print $1+$2}'
7
$ echo 3 4 | awk '{print $1/$2}'
0.75
$ echo | awk '{print 10*5}'
50

파이프 없이 echo awk '{print 10*5}' 이렇게 쓰면 awk {print 10*5} 문자가 출력될뿐이다


  • bc

basic calculator의 약자이다

실수, 사칙연산, 거듭제곱 등 고급 기능도 있으면서 가벼운것이 특징이다

사용법은 연산 전체를 따옴표로 묶고 파이프를 통해 bc 명령어를 거치기만 하면 된다

$ echo '10/4' | bc
2
$ echo 'scale=2;10/4' | bc
2.50
echo '3^3' | bc
27
echo '3^3^3' | bc
7625597484987

scale을 통해 소수점 몇자리까지 표현할것인지 정할 수 있다

거듭제곱은 일반적인것과는 다르게 뒤에서부터 소괄호( )로 묶여있는것처럼 계산되어 나온다

위 예시를 보면


3^3^3은 원래 19,683이 나와야 하지만

이녀석의 계산방식은 3^(3^3) 이런 방식이다

그래서 원래는 27^3 이어야 할것이 3^27이 되므로 결과가 달라진다

댓글