쉘 스크립트에서 조건 표현식은 프로그램의 흐름을 제어하는 핵심 요소입니다. 다양한 상황에 따라 다른 명령어 블록을 실행할 수 있도록 해줍니다.
조건문의 기본 구조
쉘에서는 주로 다음 세 가지 방식으로 조건을 처리합니다:
- [ ]: 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
복합 조건 처리
| 구문 | 설명 | 예시 |
-a | AND ([ ] 한정) | [ $v -gt 0 -a $v -lt 10 ] |
-o | OR ([ ] 한정) | [ -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 ))