쉘 스크립트 조건 표현식 활용 가이드

쉘 스크립트에서 조건 표현식은 프로그램의 흐름을 제어하는 핵심 요소입니다. 다양한 상황에 따라 다른 명령어 블록을 실행할 수 있도록 해줍니다.

조건문의 기본 구조

쉘에서는 주로 다음 세 가지 방식으로 조건을 처리합니다:

  • [ ]: POSIX 호환성 높은 전통적인 방법
  • [[ ]]: Bash 확장 문법으로 패턴 매칭 및 정규표현식 지원
  • (( )): 산술 연산과 비교를 위한 특수한 형태
#!/bin/bash

val1="apple"
val2="Apple"

if [[ "$val1" == "$val2" ]]; then
  echo "대소문자 구분 시 동일하지 않음"
else
  echo "값이 다릅니다"
fi

# 정규표현식 사용 예시
input="test123"
if [[ "$input" =~ ^test[0-9]+$ ]]; then
  echo "입력 형식 일치"
else
  echo "형식 불일치"
fi
#!/bin/bash

score_a=85
score_b=90

if (( score_a >= score_b )); then
  echo "A 점수가 B 이상입니다."
else
  echo "A 점수가 더 낮습니다."
fi

비교 연산자의 종류

  • 문자열: =, !=, >, <, -z(비어 있음), -n(비어 있지 않음)
  • 숫자: -eq, -ne, -gt, -lt, -ge, -le
  • 파일 상태 확인: -e(존재 여부), -f(일반 파일), -d(디렉터리), -r(읽기 가능) 등
  • 논리 연산자: -a(AND), -o(OR), !(NOT) 또는 &&/|| ([[ ]] 내에서만 사용)

문자열 비교 예제

연산자설명예시
=동일 여부[ "$x" = "hello" ]
!=다른지 확인[[ $str != "quit" ]]
>/<사전 순 비교(이스케이프 필요)[[ "abc" < "def" ]]
-z비었는지 검사[ -z "$var" ]
-n값이 있는지 확인[[ -n $var ]]
if [ "$username" = "admin" ]; then
    echo "관리자 모드 진입"
fi

if [[ "$filename" == *.txt ]]; then
    echo "텍스트 파일 발견"
fi

정수 비교 예제

연산자설명예시
-eq같음[ $a -eq 5 ]
-ne다름[[ $num -ne 0 ]]
-gt초과[ $x -gt 10 ]
-lt미만[[ $y -lt 100 ]]
-ge이상(( x >= y ))
-le이하(( a <= 50 ))
if (( $items >= 5 )); then
    echo "최소 수량 충족"
fi

if [ $age -ge 18 ]; then
    echo "성인 인증 완료"
fi

파일 속성 체크

연산자설명예시
-e존재함[ -e "/path/to/file" ]
-f일반 파일[[ -f ~/config.ini ]]
-d디렉터리[ -d "/home/user" ]
-s내용 존재[[ -s "output.log" ]]
-r읽기 권한[ -r "/etc/config" ]
-w쓰기 권한[[ -w "/tmp/data" ]]
-x실행 권한[ -x "/usr/local/bin/script.sh" ]
if [ -f "/var/log/system.log" ]; then
    echo "시스템 로그 파일 확인됨"
fi

if [[ ! -d "/temp_storage" ]]; then
    mkdir -p "/temp_storage"
fi

복합 조건 처리

구문설명예시
-aAND ([ ] 한정)[ $v -gt 0 -a $v -lt 10 ]
-oOR ([ ] 한정)[ -f "$f" -o -d "$d" ]
&&논리 AND ([[ ]])[[ $a > 5 && $b < 20 ]]
||논리 OR ([[ ]])[[ $c == ok || $c == done ]]
!NOT[ ! -e "/lock.pid" ]
if [ "$state" = "fail" -a "$attempt" -lt 3 ]; then
    echo "재시도 중..."
fi

if [[ -r "$target" && -s "$target" ]]; then
    cat "$target"
fi

고급 기능 활용

Bash 확장 문법인 [[ ]]는 다음과 같은 추가 기능을 제공합니다:

# 와일드카드 매칭
if [[ "$host" == server* ]]; then
    echo "서버 장비 식별됨"
fi
# 정규표현식 매칭
if [[ "$mail_addr" =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]]; then
    echo "유효한 이메일 주소"
fi
# 명령어 결과 기반 판단
if grep -q ERROR "$logfile"; then
    echo "오류 발생 감지"
fi

주의사항

  • 변수는 반드시 따옴표로 묶어야 함: [ "$VAR" = "value" ]
  • 공백은 필수이며 생략하면 문법 오류 발생
  • 문자열 비교(>, <)와 숫자 비교 혼동 주의
# 잘못된 예
[ $var = test ]      # 공백 부족
[ "$var">"test" ]    # 문자열 vs 숫자 판단 오류

# 올바른 예
[ "$var" = "test" ]
(( var > 10 ))

태그: bash shell-scripting linux conditional-statements file-testing

5월 20일 20:41에 게시됨