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