POSIX Shell: if

쉘 스크립트에서 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을 시작합니다...

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤