Computer >> 컴퓨터 >  >> 프로그래밍 >> Bash 프로그래밍

Bash/Shell 스크립트의 수학·산술 연산 – 예제로 배우기

수학은 쉽고, Bash 스크립트 작성도 쉽습니다. 그렇다면 Bash/Shell 스크립트에서 수학·산술 연산을 수행하는 일 역시 어렵지 않아야 마땅합니다. 실제로도 그렇습니다. 지금부터 그 방법을 하나씩 살펴보겠습니다.

정수(Integer) 다루기

Bash의 내장 산술 연산은 정수 값만 처리할 수 있습니다. 만약 정수가 아닌 값으로 변수를 선언하려고 하면:

declare -i e=2.5

다음과 같은 오류 메시지가 출력됩니다:

bash: declare: 2.5: syntax error: invalid arithmetic operator (error token is ".5")

정수가 아닌 숫자를 다루려면 외부 프로그램을 사용해 계산을 수행해야 합니다. 하지만 그 전에, 먼저 Bash 내장 산술 연산으로 정수를 다루는 방법부터 알아보겠습니다.

변수 선언(declare) 활용하기

변수를 declare 문으로 정수형으로 선언했다면, 별도의 특별한 처리 없이도 바로 산술 연산을 수행할 수 있습니다:

# 변수를 정수형으로 선언
declare -i x=4
declare -i y=2

# 정수형 변수로 산술 연산 수행
result=x/y

echo $result

실행 결과는 다음과 같습니다:

2

변수가 정수형으로 선언된 경우에는 수식을 괄호로 감싸 평가하지 않아도 됩니다.

이중 괄호(Double Brackets/Parenthesis) 사용하기

변수가 정수형으로 명시적으로 선언되지 않았거나, 스크립트 매개변수로 전달되었거나, 프로그램의 출력 결과라면 기본적으로 문자열로 취급됩니다.

Bash는 산술 연산에서 문자열도 처리할 수 있습니다. 단, 이중 괄호를 사용해 해당 식이 산술 표현식임을 명시한 경우에만 가능합니다. 아래 예제를 확인해 보세요:

x=6
((y=$x+3))
echo $y

위 Bash 스크립트 조각은 표현식의 올바른 계산 결과를 출력합니다:

9

…괄호로 묶인 산술 표현식 안의 변수들이 문자열이 아닌 숫자로 올바르게 해석되었기 때문입니다.

만약 괄호가 없다면:

y=$x+3

출력 결과는 다음과 같습니다:

6+3

표현식이 두 개의 문자열을 단순히 이어 붙인 것으로 취급되며, 실제 계산은 이루어지지 않습니다.

지원되는 수학 연산자

Bash 내장 산술 연산은 다음과 같은 연산자를 지원합니다:

연산자 설명
+ 덧셈
뺄셈
++ 증가(Increment)
감소(Decrement)
* 곱셈
/ 나눗셈
% 나머지
** 거듭제곱

불리언(Boolean) 연산과 산술

불리언 연산자를 사용할 때도 이중 괄호가 등장합니다. 평가된 표현식은 0 또는 1을 반환합니다:

if (( x > y )); then
    echo "x is greater than y"
fi

Bash 불리언 연산에 대해 더 자세한 내용은 관련 문서를 참고하세요.

소수(Decimal) 값 다루기

bc 명령어 사용하기

앞서 살펴본 것처럼, 정수가 아닌 값을 대상으로 Bash 산술 연산을 수행하면 오류가 발생합니다.

bc 명령어는 소수 값(그리고 더 복잡한 수학 연산)까지 처리할 수 있습니다. 기본 문법은 다음과 같습니다:

bc OPTIONS FILE

여기서 각 항목의 의미는 다음과 같습니다:

  • OPTIONS는 사용할 옵션 목록입니다(전체 옵션 목록은 관련 문서 참조)
  • FILE은 풀어야 할 산술식이 담긴 텍스트 파일의 경로입니다.

bc는 파이프로 전달되는 입력을 받을 수 있으므로, 굳이 수식을 파일에 저장하지 않아도 콘솔에서 직접 파이프로 넘겨줄 수 있습니다:

echo "2.32+3.45" | bc

…정확한 답이 출력됩니다:

5.77

명령줄 애플리케이션의 입력과 출력을 파이핑하고 리디렉션하는 방법에 대한 자세한 내용도 함께 참고하면 좋습니다.

bc의 전체 사용자 설명서는 다음 명령어로 확인할 수 있습니다:

man bc

bc 명령어는 복잡한 수학 연산을 위한 고급 문법도 다수 제공하며, 자세한 내용은 사용자 설명서에 정리되어 있으니 필요할 때마다 참조하시기 바랍니다.