Bash에서의 산술 연산: 다양한 계산 방법과 활용

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+=ni = i + n과 동일
i*=ni = 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}"  # 더 빠름

태그: bash Shell scripting arithmetic operations expr let

6월 17일 05:11에 게시됨