쉘 스크립트에서 if문은 프로그램의 흐름을 결정하는 핵심입니다.
하지만 #!/bin/sh 환경에서는 우리가 흔히 쓰는 Bash 전용 문법([[ ]])을 사용할 수 없습니다.
어디서나 돌아가는 견고한 스크립트를 위한 POSIX 표준 if 문법을 정리합니다.
기본 구조
가장 중요한 것은 if, then, fi의 짝을 맞추는 것입니다.
if [ 조건식 ]; then
# 조건이 참(True)일 때 실행
elif [ 조건식 ]; then
# 앞의 조건이 거짓이고, 현재 조건이 참일 때 실행
else
# 모든 조건이 거짓일 때 실행
fi
주의: [ 뒤와 ] 앞에는 반드시 공백이 있어야 합니다. [는 사실 test라는 이름의 명령어이기 때문입니다.
문자열 비교 (String Comparison)
문자열을 비교할 때는 =와 !=를 사용합니다.
| 조건식 | 설명 |
[ "$A" = "$B" ] | A와 B가 같으면 참 |
[ "$A" != "$B" ] | A와 B가 다르면 참 |
[ -z "$A" ] | 문자열 A의 길이가 0이면 참 (Empty) |
[ -n "$A" ] | 문자열 A의 길이가 0이 아니면 참 (Not Empty) |
핵심 팁: 변수는 반드시 쌍따옴표(" ")로 감싸세요.
변수가 비어있을 경우 발생할 수 있는 구문 오류를 방지해줍니다.
숫자 비교 (Integer Comparison)
숫자는 부등호(<, >) 대신 문자 약어를 사용합니다.
| 조건식 | 의미 | Full Name |
[ "$A" -eq "$B" ] | 같음 | Equal |
[ "$A" -ne "$B" ] | 다름 | Not Equal |
[ "$A" -gt "$B" ] | 초과 | Greater Than |
[ "$A" -ge "$B" ] | 이상 | Greater or Equal |
[ "$A" -lt "$B" ] | 미만 | Less Than |
[ "$A" -le "$B" ] | 이하 | Less or Equal |
파일 상태 확인 (File Test)
쉘 스크립트에서 가장 많이 쓰이는 강력한 기능입니다.
[ -f "file" ]: 일반 파일이 존재하면 참[ -d "dir" ]: 디렉토리가 존재하면 참[ -e "path" ]: 파일이든 디렉토리든 존재만 하면 참[ -r "file" ]: 읽기 권한이 있으면 참[ -x "file" ]: 실행 권한이 있으면 참
논리 연산 (AND, OR)
여러 조건을 조합할 때 POSIX에서는 두 가지 방법을 씁니다.
-a (AND), -o (OR): 하나의 [ ] 안에서 사용
if [ "$A" = "1" -a "$B" = "2" ]
&&, || 활용: 여러 개의 [ ]를 연결 (더 권장됨)
if [ "$A" = "1" ] && [ "$B" = "2" ]
사용 예시
#!/bin/sh
APP_NAME="TestApp"
CONFIG_FILE="./config.conf"
DEBUG_MODE="ON"
printf "시스템 체크를 시작합니다...\n"
# 1. 설정 파일 존재 여부 체크 (파일 테스트)
if [ -f "$CONFIG_FILE" ]; then
printf "[OK] 설정 파일을 찾았습니다.\n"
else
printf "[Error] %s 파일이 없습니다.\n" "$CONFIG_FILE"
# exit 1 # 실제 스크립트라면 여기서 종료 가능
fi
# 2. 디버그 모드 확인 (문자열 비교)
if [ "$DEBUG_MODE" = "ON" ]; then
printf "[Log] 디버그 모드가 활성화되어 있습니다.\n"
fi
# 3. 인자 개수 확인 (숫자 비교)
# $#는 스크립트에 전달된 인자의 개수입니다.
if [ "$#" -lt 1 ]; then
printf "사용법: %s [start|stop]\n" "$0"
else
if [ "$1" = "start" ]; then
printf "%s을 시작합니다...\n" "$APP_NAME"
elif [ "$1" = "stop" ]; then
printf "%s을 중지합니다...\n" "$APP_NAME"
else
printf "알 수 없는 명령입니다: %s\n" "$1"
fi
fi
$ ./01_hello.sh start
시스템 체크를 시작합니다...
[OK] 설정 파일을 찾았습니다.
[Log] 디버그 모드가 활성화되어 있습니다.
TestApp을 시작합니다...


