6 분 소요

Shell 연산자 (Operators)

쉘 스크립트에서 숫자와 문자, 파일을 처리하기 위한 다양한 연산자를 제공합니다.


1. 비교 연산자 (관계 연산자)

기본 개념

  • 쉘 스크립트에서 숫자와 문자, 파일을 처리하는 방법
  • 실행 결과를 true(0) 또는 false(1)로 리턴
  • 형식: [ 명령어 ] 또는 test <명령어>

중요: [ 명령어 ] 사용 시 명령어 사이 양쪽에 공백 필수

# 올바른 사용
[ $a -gt $b ]

# 잘못된 사용 (공백 없음)
[$a -gt $b]

a) 숫자 크기 비교

숫자 크기를 비교하지만 소수점 이하의 숫자는 무시됩니다.

표현방식 의미
[ $A -gt $B ] A가 B보다 크다 (greater than)
[ $A -lt $B ] A가 B보다 작다 (less than)
[ $A -ge $B ] A가 B보다 크거나 같다 (greater or equal)
[ $A -le $B ] A가 B보다 작거나 같다 (less or equal)
[ $A -eq $B ] A와 B가 같다 (equal)
[ $A -ne $B ] A와 B가 같지 않다 (not equal)

예제:

#!/bin/bash

a=10
b=20

if [ $a -lt $b ]; then
    echo "$a는 $b보다 작습니다"
fi

if [ $a -eq 10 ]; then
    echo "a는 10과 같습니다"
fi

b) 문자열 비교

문자열 비교 시 반드시 좌우에 ” “ 따옴표를 사용해야 합니다.

표현방식 참이 되는 경우
[ "문자열1" ]=[ "문자열2" ] 두 문자열이 같으면(== 도 가능) 참
[ "문자열1" ] ! [ "문자열2" ] 두 문자열이 다르면 참
[ -z "string" ] 문자열이 길이가 0 이면 참 (zero/empty string: true)
[ -n "string" ] 문자열의 길이가 0보다 크면 참 (not empty string : true)

예제:

#!/bin/bash

str1="hello"
str2="world"

if [ "$str1" = "$str2" ]; then
    echo "문자열이 같습니다"
else
    echo "문자열이 다릅니다"
fi

if [ -z "$str1" ]; then
    echo "문자열이 비어있습니다"
else
    echo "문자열이 비어있지 않습니다"
fi

c) 파일 테스트 연산자

표현방식 의미
[ -f 파일 ] 파일이 존재하고 일반 파일이면 참
[ -d 디렉터리 ] 디렉터리가 존재하면 참
[ -e 파일 ] 파일이나 디렉터리가 존재하면 참
[ -r 파일 ] 파일이 읽기 가능하면 참
[ -w 파일 ] 파일이 쓰기 가능하면 참
[ -x 파일 ] 파일이 실행 가능하면 참
[ -s 파일 ] 파일 크기가 0보다 크면 참

예제:

#!/bin/bash

file="/etc/passwd"

if [ -f "$file" ]; then
    echo "$file 파일이 존재합니다"
fi

if [ -r "$file" ]; then
    echo "$file 파일을 읽을 수 있습니다"
fi

2. 산술 연산자

기본 산술 연산 방법

쉘에서 숫자 계산을 위한 4가지 방법:

  1. expr - 간단한 연산용
  2. bc - 복잡한 연산 및 소수점 계산용
  3. let - 변수 계산용
  4. $(( )) - 가장 많이 사용되는 방법

1) expr 사용

expr 사용 시 주의사항 (3가지):

  1. expr로 지정하는 경우 백틱(`) 을 사용해야 합니다
  2. 연산자 * 와 괄호 앞에는 백슬래시() 를 같이 사용해야 합니다
  3. 연산자와 숫자, 변수, 기호 사이에는 공백(Space)이 존재해야 합니다
수식 의미 수식 의미
expr 숫자 계산 * 곱하기 ( W* )로 사용
+ 더하기 / 나누기
- 빼기 % 나머지 값

예제:

#!/bin/bash

# expr 사용 (백틱 사용)
result=`expr 10 + 5`
echo "10 + 5 = $result"

# 곱셈은 백슬래시 필요
result=`expr 10 \* 5`
echo "10 * 5 = $result"

# 나눗셈
result=`expr 10 / 3`
echo "10 / 3 = $result"

# 나머지
result=`expr 10 % 3`
echo "10 % 3 = $result"

2) bc 명령어 (복잡한 연산용)

장점:

  • 띄어쓰기와 이스케이프 문자 변환이 필요 없음
  • 소수점 계산 가능
  • echo와 pipe를 사용하거나 bc 명령어만 입력하여 사용
수식 의미 수식 의미
bc 숫자 계산 * 곱하기 ( W* )로 사용
+ 더하기 / 나누기
- 빼기 % 나머지 값

예제:

#!/bin/bash

# 기본 사용
echo "10 + 5" | bc
# 출력: 15

# 소수점 계산 (scale=소수점 자릿수)
echo "scale=3; 8/3" | bc
# 출력: 2.666

# 변수 사용
a=10
b=3
result=$(echo "scale=2; $a / $b" | bc)
echo "10 / 3 = $result"

참고: scale=3 은 소수점 3자리에서 끊어주는 명령어

3) let 또는 $(( ))

가장 간편하고 많이 사용되는 방법입니다.

예제:

#!/bin/bash

# let 사용
let sum=10+5
echo "let sum = $sum"

# (( )) 사용
((sum=10+5))
echo "((sum)) = $sum"

# $(( )) 사용 (가장 권장)
sum=$((10+5))
echo "\$((sum)) = $sum"

# 복잡한 연산
result=$((10 * 5 + 3))
echo "10 * 5 + 3 = $result"

Shell에서 산술연산 정리

1. (( ))

  • 산술 연산을 그룹화 할 때 사용
  • 계산된 결과를 변수에 저장하지 않고 즉시 사용할 때 사용
((sum=10+5))

2. $(( ))

  • 산술 연산 결과를 명시적으로 변수에 저장하거나 다른 명령어처럼 사용하고 싶을 때 사용
  • 중첩명령: $( )은 명령어를 실행하고 그 출력을 반환
sum=$((10+5))
echo "결과: $sum"

4) 증가, 감소 연산자

연산자 기능 연산 예
++ 값을 1씩 더함 val=++num (먼저 num 값이 1 증가한 후 val 변수에 대입)
val=num++ (val 변수에 기존 num 값을 먼저 대입한 후 num 값 1 증가)
– 값을 1씩 뺌 val=–num (먼저 num 값이 1 감소한 후 val 변수에 대입)
val=num– (val 변수에 기존 num 값을 먼저 대입한 후 num 값 1 감소)

예제:

#!/bin/bash

num=10

# 전위 증가
echo "num = $num"
((++num))
echo "++num = $num"

# 후위 증가
result=$((num++))
echo "num++ = $result (num은 이제 $num)"

3. 논리 연산자

기본 논리 연산자

  • && : and 연산자 (또는 -a)
  • || : or 연산자 (또는 -o)

예제:

#!/bin/bash

age=25

# AND 연산
if [ $age -gt 18 ] && [ $age -lt 30 ]; then
    echo "나이는 18세 초과 30세 미만입니다"
fi

# OR 연산
if [ $age -lt 18 ] || [ $age -gt 60 ]; then
    echo "청소년이거나 노인입니다"
else
    echo "성인입니다"
fi

# -a, -o 사용 (한 개의 [ ] 안에서 사용)
if [ $age -gt 18 -a $age -lt 30 ]; then
    echo "나이는 18세 초과 30세 미만입니다"
fi

삼항 연산자 (Ternary Operator)

형식: 조건1 && 조건2 || 조건3

조건 1이 참인 경우 조건 2를 실행하고, 거짓이면 조건3을 실행합니다.

예제:

#!/bin/bash

age=20

# 삼항 연산자
[ $age -ge 18 ] && echo "성인입니다" || echo "미성년자입니다"

# 변수 할당에도 사용 가능
status=$([ $age -ge 18 ] && echo "adult" || echo "minor")
echo "Status: $status"

실전 예제

예제 1: 계산기 프로그램

#!/bin/bash

echo "=== 간단한 계산기 ==="
echo -n "첫 번째 숫자: "
read num1
echo -n "두 번째 숫자: "
read num2

echo "덧셈: $((num1 + num2))"
echo "뺄셈: $((num1 - num2))"
echo "곱셈: $((num1 * num2))"
echo "나눗셈: $(echo "scale=2; $num1 / $num2" | bc)"

예제 2: 파일 검사 스크립트

#!/bin/bash

file=$1

if [ -z "$file" ]; then
    echo "사용법: $0 <파일명>"
    exit 1
fi

echo "=== 파일 검사: $file ==="

[ -e "$file" ] && echo "파일이 존재합니다" || echo "파일이 존재하지 않습니다"
[ -f "$file" ] && echo "일반 파일입니다"
[ -d "$file" ] && echo "디렉터리입니다"
[ -r "$file" ] && echo "읽기 가능합니다"
[ -w "$file" ] && echo "쓰기 가능합니다"
[ -x "$file" ] && echo "실행 가능합니다"

예제 3: 숫자 비교 프로그램

#!/bin/bash

echo -n "첫 번째 숫자를 입력하세요: "
read a
echo -n "두 번째 숫자를 입력하세요: "
read b

if [ $a -gt $b ]; then
    echo "$a가 $b보다 큽니다"
elif [ $a -lt $b ]; then
    echo "$a가 $b보다 작습니다"
else
    echo "$a와 $b는 같습니다"
fi

주요 포인트 정리

  1. 비교 연산자
    • 숫자 비교: -gt, -lt, -ge, -le, -eq, -ne
    • 문자열 비교: =, !=, -z, -n (반드시 따옴표 사용)
    • 파일 테스트: -f, -d, -e, -r, -w, -x, -s
  2. 산술 연산자
    • expr: 간단한 연산 (공백 필수, * 앞에 \ 필요)
    • bc: 복잡한 연산, 소수점 계산 가능
    • let, (( )), $(( )): 가장 편리한 방법
  3. 논리 연산자
    • && (AND), || (OR)
    • -a (AND), -o (OR) - [ ] 안에서 사용
  4. 주의사항
    • [ ] 사용 시 양쪽 공백 필수
    • 문자열 비교 시 따옴표 필수
    • expr 사용 시 연산자와 피연산자 사이 공백 필수

댓글 남기기