산술 연산
Bash 변수는 기본적으로 문자열입니다. num=5라고 해도 Bash는 이것을 숫자 5가 아니라 문자 "5"로 저장합니다. 그래서 num + 3을 그냥 쓰면 숫자 덧셈이 아니라 문자열 연결처럼 처리되거나 오류가 납니다. 산술 연산을 하려면 명시적으로 "이건 계산이야"라고 알려줘야 합니다.
산술 연산 방법 3가지
방법 1: $(( )) — 권장
a=10b=3result=$(( a + b ))echo "${result}" # 출력: 13
$(( )) 안에서는 변수에 $를 붙이지 않아도 됩니다. $(( $a + $b ))도 되지만 $(( a + b ))가 더 깔끔합니다. 가독성이 좋고 POSIX에서도 지원합니다. 가장 권장되는 방법입니다.
방법 2: let
a=10b=3let result=a+becho "${result}" # 출력: 13# 증감도 가능let a++let b+=5
let 명령어를 이용합니다. $(( ))와 비슷하지만 결과를 변수에 직접 저장하는 방식이라 $( )로 캡처할 필요가 없습니다. 공백을 넣으면 오류가 나므로 let result = a + b처럼 쓰면 안 됩니다.
방법 3: expr — 구식 방법
a=10b=3result=$(expr $a + $b)echo "${result}" # 출력: 13
expr은 외부 명령어입니다. 연산자 앞뒤에 공백이 필요하고, *는 \*로 이스케이프해야 합니다. $(( ))가 생기기 전에 쓰던 방식으로, 지금은 거의 쓰지 않습니다. 오래된 스크립트에서 볼 수 있으므로 읽을 수 있으면 충분합니다.
지원 연산자
#!/bin/bash# 새 파일: scripts/arithmetic.sha=15b=4echo "덧셈: $(( a + b ))" # 출력: 19echo "뺄셈: $(( a - b ))" # 출력: 11echo "곱셈: $(( a * b ))" # 출력: 60echo "나눗셈: $(( a / b ))" # 출력: 3 (정수 나눗셈!)echo "나머지: $(( a % b ))" # 출력: 3echo "거듭제곱: $(( 2 ** 8 ))" # 출력: 256exit 0
$ bash scripts/arithmetic.sh
덧셈: 19
뺄셈: 11
곱셈: 60
나눗셈: 3
나머지: 3
거듭제곱: 256
나눗셈 결과가 3인 점을 주목하세요. 15 / 4 = 3.75이지만 Bash의 정수 나눗셈은 소수점을 버립니다.
증감 연산자
#!/bin/bash# 새 파일: scripts/increment.shcount=0(( count++ )) # count를 1 증가 (후위 증가)echo "count: ${count}" # 출력: 1(( count += 5 )) # count에 5 추가echo "count: ${count}" # 출력: 6(( count-- )) # count를 1 감소echo "count: ${count}" # 출력: 5(( count *= 2 )) # count에 2 곱하기echo "count: ${count}" # 출력: 10exit 0
(( )) 방식은 결과를 변수에 담지 않고 바로 연산할 때 씁니다. 반복문의 카운터로 자주 씁니다.
정수만 지원! 실수 계산은 bc
Bash의 $(( ))는 정수만 지원합니다. 소수점이 필요한 계산에는 bc를 씁니다.
#!/bin/bash# 새 파일: scripts/float_calc.sh# bc를 이용한 실수 계산# scale=2는 소수점 이하 2자리result=$(echo "scale=2; 10 / 3" | bc)echo "10 / 3 = ${result}" # 출력: 10 / 3 = 3.33# 더 많은 자리pi=$(echo "scale=10; 4 * a(1)" | bc -l)echo "pi = ${pi}" # 출력: pi = 3.1415926535# 실용 예: 파일 크기를 MB로 변환file_bytes=1572864file_mb=$(echo "scale=2; ${file_bytes} / 1048576" | bc)echo "파일 크기: ${file_mb} MB" # 출력: 파일 크기: 1.50 MBexit 0
$ bash scripts/float_calc.sh
10 / 3 = 3.33
pi = 3.1415926535
파일 크기: 1.50 MB
scale=N은 소수점 이하 자리 수를 지정합니다. bc -l은 수학 라이브러리를 불러와서 삼각함수, 로그 등을 쓸 수 있게 합니다.
실습: 간단한 계산기 스크립트
배운 내용을 모아서 두 수와 연산자를 입력받아 계산하는 스크립트를 만들어봅니다.
#!/bin/bash# 새 파일: scripts/calculator.sh# 입력 받기read -p "첫 번째 숫자: " num1read -p "연산자 (+, -, *, /): " operatorread -p "두 번째 숫자: " num2# 계산case "${operator}" in "+") result=$(( num1 + num2 )) ;; "-") result=$(( num1 - num2 )) ;; "*") result=$(( num1 * num2 )) ;; "/") if [[ "${num2}" -eq 0 ]]; then echo "오류: 0으로 나눌 수 없습니다." exit 1 fi result=$(echo "scale=2; ${num1} / ${num2}" | bc) ;; *) echo "오류: 지원하지 않는 연산자입니다." exit 1 ;;esac# 결과 출력echo ""echo "${num1} ${operator} ${num2} = ${result}"exit 0
실행 결과는 다음과 같습니다.
$ bash scripts/calculator.sh
첫 번째 숫자: 25
연산자 (+, -, *, /): /
두 번째 숫자: 4
25 / 4 = 6.25
case 문은 PART 04에서 자세히 다루지만, 여기서는 연산자에 따라 다른 계산을 수행한다는 흐름만 파악하면 됩니다. 나눗셈의 경우 bc를 써서 소수점까지 처리했습니다.
이 스크립트가 완성되면 PART 03에서 배운 내용 대부분을 담고 있습니다. 변수 선언, 사용자 입력(read), 조건 처리, 산술 연산이 모두 들어갑니다. 직접 실행해보고 다양한 수와 연산자를 넣어 결과를 확인해보세요.