1. Bash 스크립트에서 정수 연산하기
Bash는 기본적으로 문자열을 다루지만, 정수형 산술 연산은 내장된 여러 방법으로 수행할 수 있습니다. 주로 사용되는 방식은 다음 네 가지입니다:
$(( ... ))$[ ... ](권장되지 않음)expr명령어let명령어
$(( ... )) 구문 사용 (가장 권장됨)
이 방식은 쉘 내장 기능이며, 속도가 빠르고 가독성이 좋습니다. 변수 이름 앞에 $를 붙일 수도 있고 생략할 수도 있습니다.
a=5
b=3
result=$((a + b))
echo "$result" # 출력: 8
# 복잡한 수식도 가능
total=$(( (a * 2) + (b ** 2) - 1 ))
echo "$total" # 출력: 18
expr 명령어 사용
expr는 외부 명령어로, 연산자와 피연산자 사이에 반드시 공백이 필요하며, 곱셈 기호 *는 이스케이프(\*) 처리해야 합니다.
x=4
y=6
product=$(expr $x \* $y)
echo "$product" # 출력: 24
remainder=$(expr $y % $x)
echo "$remainder" # 출력: 2
단점은 프로세스 생성 오버헤드가 있어 성능이 낮으며, 입력값 검증이 중요합니다.
let 명령어 사용
let은 변수에 대한 연산만 수행하며 결과를 출력하지 않습니다. 주로 증감 연산에 적합합니다.
counter=10
let counter+=5
echo "$counter" # 출력: 15
let "counter *= 2"
echo "$counter" # 출력: 30
따옴표를 사용하면 공백 없이 표현식을 작성할 수 있습니다.
배열 스타일 $[ ... ] 구문
이전 버전 호환성을 위해 존재하지만, 현재는 비추천됩니다. 대신 $(( ))를 사용하는 것이 좋습니다.
echo $[5 + 3] # 출력: 8 (권장되지 않음)
2. 증감 연산 및 단축 표현
변수의 값을 1씩 늘리거나 줄이는 경우 다음과 같은 표현이 가능합니다.
| 표현식 | 의미 |
|---|---|
i++ | 현재 값 사용 후 증가 (후위) |
++i | 먼저 증가 후 사용 (전위) |
i--, --i | 감소 연산 |
i+=n | i = i + n과 동일 |
i*=n | i = i * n과 동일 |
예제: 전위 vs 후위 차이
j=7
echo $(($j++)) # 출력: 7, 이후 j는 8
echo "$j" # 출력: 8
k=7
echo $(($++k)) # 출력: 8, k는 이미 8
3. 실수 연산: bc 명령어 활용
Bash 자체는 실수 연산을 지원하지 않으므로, 외부 도구인 bc를 사용해야 합니다. 특히 소수점 자릿수 조절이 가능합니다.
# 간단한 덧셈
echo "3.14 + 2.86" | bc # 출력: 6.00
# 소수점 이하 자리수 설정 (scale)
echo "scale=3; 10 / 3" | bc # 출력: 3.333
# 제곱 및 과학적 계산
echo "scale=2; 2.5 ^ 3" | bc # 출력: 15.62
# 진법 변환 (10진 → 2진)
echo "obase=2; 10" | bc # 출력: 1010
실용 예: 시퀀스 합계 계산
# 1부터 100까지의 합
seq -s "+" 1 100 | bc # 출력: 5050
4. 입력 유효성 검사
사용자 입력이 정수인지 확인하는 패턴은 expr을 활용할 수 있습니다.
read -p "숫자 입력: " input
# 입력값이 정수인지 테스트
if expr "$input" + 0 >/dev/null 2>&1; then
echo "정수입니다: $input"
else
echo "유효하지 않은 입력입니다."
fi
5. 간단한 CLI 계산기 만들기
입력된 수식을 받아 계산하는 스크립트 예제입니다.
#!/bin/bash
# calc.sh - 간단한 사칙연산 계산기
if [ $# -ne 3 ]; then
echo "사용법: $0 <숫자1> <연산자> <숫자2>"
exit 1
fi
num1=$1
op=$2
num2=$3
case $op in
"+") result=$((num1 + num2)) ;;
"-") result=$((num1 - num2)) ;;
"*") result=$((num1 * num2)) ;;
"/")
if [ "$num2" -eq 0 ]; then
echo "오류: 0으로 나눌 수 없습니다."
exit 1
fi
result=$((num1 / num2))
;;
"**") result=$((num1 ** num2)) ;;
"%") result=$((num1 % num2)) ;;
*)
echo "지원하지 않는 연산자: $op"
exit 1
;;
esac
echo "$num1 $op $num2 = $result"
실행 예
$ ./calc.sh 8 + 5
8 + 5 = 13
6. 고급 활용: 문자열 길이 측정
expr length는 문자열의 바이트 길이를 반환합니다.
text="Hello World"
len=$(expr length "$text")
echo "$len" # 출력: 11
대신 Bash 내장 기능인 ${#var} 사용을 권장합니다.
echo "${#text}" # 더 빠름