본문 바로가기
목차
shell

Shell Script Conditionals(조건문)-test, [], [[]],(())

by ds31x 2025. 7. 25.
728x90
반응형

https://devhints.io/bash

위의 그림은 가장 많이 애용되는 Extended Conditionals 를 정리(Bash 기준)한 것임.

 

이외에도 셸 스크립트에서 조건을 검사할 때는 test 또는 다양한 괄호 구문을 사용함 .

 

대표적으로 다음 네 가지 방법이 있음:

  1. test명령어 사용: test 조건식
  2. 대괄호 한 쌍 사용: [ 조건식 ]
  3. 이중 대괄호 사용: [[ 조건식 ]]
  4. 괄호 두 개 사용: (( 산술식 ))

Conditional Syntax Types

구문 형태 (Syntax Type) 설명 (Description)
test 명령 (test EXPR) POSIX-compliant tes command
대괄호 한 쌍 ([ EXPR ]) test 명령과 동일한 기능을 갖는 대체 문법 (Bracket syntax equivalent to test)
이중 대괄호 ([[ EXPR ]]) Extended conditional expression syntax in Bash/Zsh)
산술 조건문 ((( EXPR ))) 정수 산술 전용 조건문 (Arithmetic evaluation syntax for integers only)
  • test 또는 [ ] 는 POSIX 표준
  • [[ ]] 는 bash와 zsh에서 제공하는 확장 구문으로 glob 패턴 매칭과 정규표현식 을 지원하며, 논리 연산 등을 간결하게 표현가능 (recommanded)
  • (( )) 는 산술 전용 조건문으로, 정수 계산과 비교를 간결하게 수행할 수 있어서 수학적 비교에 적합

구문별 기능 비교 (Feature Comparison by Syntax)

Feature test, [ ] 사용 시 [[ ]] 사용 시 (( )) 사용 시
String Comparison 지원 ( = 또는 != 사용) 지원 ( ==, !=, glob 패턴 가능) 미지원
Numeric Comparison 제한적 지원 ( -eq, -lt, -gt 등 전용 연산자 사용) 지원 (==, <, >, <=, >= 가능) 지원 (==, <, >, <=, >= 가능)
파일 검사 지원 (-f, -d, -r, -x 등) 지원 미지원
Glob Matching 미지원 지원 (==, != 연산자로 glob 패턴 매칭 가능) 미지원
정규식 매칭 (Regex Matching) 미지원 지원 (=~ 연산자로 정규 표현식 사용 가능) 미지원
논리 연산 (Logical Operators) 제한적 지원 (-a = and, -o = or) 지원 (AND: &&, OR: `  

예시

다음의 예의 각 라인을 terminal에서 실행하고 echo $?를 수행하여 0이면 True, 1이면 False임.

 

POSIX 호환 구문 (Using test or [ ])

[ -f "${file}" ]                    # 파일 존재 여부 (Check if file exists)
[ "${str}" = "abc" ]                # 문자열 비교 (String equality)
[ "${num}" -lt 10 ]                 # 숫자 비교 (Integer less than)

 

확장 조건문 [[ ... ]] (Extended Conditionals)

[[ "${file}" == *.sh ]]                  # glob 패턴 매칭 (pattern match)
[[ "${id}" =~ ^user[0-9]+$ ]]            # 정규식 매칭 (regex match)
[[ "${a}" == "${b}" || "${c}" == "${d}" ]]  # 논리 연산 (logical OR)

 

산술 조건문 (( ... ))

(( a > 5 && a < 10 ))             # 산술 조건 (arithmetic comparison)
(( count % 2 == 0 ))              # 짝수 판별 (even number test)
  • (( )) 내부에서는 $ 없이 변수명 사용 가능

POSIX 호환인 test[ ]의 단점

test 또는 [ ] 구문은 POSIX표준으로 거의 대부분의 Shell에서 동작하나 기능에 일부 제한이 있음:

  • 숫자 비교를 위해 반드시 전용 연산자를 써야 함. 예를 들어:
    • -eq (equal)
    • -ne (not equal)
    • -lt (less than)
    • -le (less than or equal)
    • -gt (greater than)
    • -ge (greater than or equal)
  • 논리 연산자도 -a (and), -o (or)만 제공
    • 복잡한 조건에서는 괄호 조합이 어렵고
    • 우선순위를 명확하게 기재하기 쉽지않음.
  • regex 및 glob 패턴 지원 안함.

정규 표현식과 glob 패턴 (Regex and Glob)

이중 대괄호 [[ ]] 구문은 glob 패턴과 정규 표현식을 직접 지원함:

그리고 Bash와 Zsh에서 사용가능(거의 모든 장비에서 이 두 셀 중 하나를 지원)

  • glob 예: [[ "${file}" == *.txt ]]
    • 문자열이 .txt로 끝나는지 검사
  • 정규식 예: [[ "${id}" =~ ^user[0-9]+$ ]]
    • 문자열이 “user” 다음에 숫자가 붙은 형태인지 검사
    • ~= 연산자를 사용함.

test[ ] 구문은 glob이나 RE(정규식)을 지원하지 않음.
사실상 거의 모든 장비가 Bash와 Zsh를 지원하므로 [[ ]]를 사용하길 권함.


산술 조건문 (( )) (Arithmetic Conditions)

산술 비교가 필요한 경우 (( )) 구문을 사용하는 것이 가장 간결함.

참고로 지원하는 연산자는 C 언어 스타일임.

  • == (equal), != (not equal)
  • <, >, <=, >= (less than, greater than 등)
  • % (modulo), +, -, *, / (산술 연산)

예시:

(( x > 0 && x < 100 ))   # x가 0보다 크고 100보다 작을 때
(( total % 2 == 0 ))     # 짝수 판별
  • (( )) 내부에서는 변수 앞에 달러 기호 $를 생략 가능함.
  • 매우 높은 가독성!!

변수 사용 시 주의사항 (Safe Variable Expansion)

조건문 안에서 변수를 사용할 때는 "${변수명}" 를 권장함.
이 방식은 공백, 탭, 줄바꿈, 특수기호 등이 변수 값에 들어 있더라도 오작동하지 않음.
공백이나 특수문자가 포함된 변수 비교 시 "${변수명}" 형태로 감싸서 사용 안전하게 문자열 전체를 하나의 단위로 인식시키는 것이 요구됨.

[ "${파일명}" = "test file.txt" ]    # 안전
[ $파일명 = test file.txt ]          # 위험: 단어 분리 발생 가능

상황별 추천 구문 요약 (Recommended Syntax by Use Case)

  • POSIX 호환 스크립트 는 이식성에서 가장 우수하나, 복잡한 처리가 어려움.
  • glob 패턴 또는 정규식 사용이 필요한 경우 [[ ]]를 사용하는 것이 유리: 패턴 매칭, 정규 표현식, 논리 연산 등 확장 기능 제공
  • 정수 산술 비교만 필요한 경우 (( ))이 가장 유리함: 높은 가독성의 간결한 표현식이 가능함.

연습

  1. POSIX 호환 구문 (test 또는 [ ])
file="test.txt"
touch "$file"
[ -f "${file}" ]
echo $?   # 결과: 0 (파일 존재)
str="abc"
[ "${str}" = "abc" ]
echo $?   # 결과: 0 (같음)

num=7
[ "${num}" -lt 10 ]
echo $?   # 결과: 0 (작음)

  1. 확장 조건문 ([[ ... ]])
file="script.sh"
touch "$file"
[[ "${file}" == *.sh ]]
echo $?   # 결과: 0 (확장자가 .sh인 파일명)
id="user42"
[[ "${id}" =~ ^user[0-9]+$ ]]
echo $?   # 결과: 0 (정규식과 일치)
a="x"
b="x"
c="y"
d="z"
[[ "${a}" == "${b}" || "${c}" == "${d}" ]]
echo $?   # 결과: 0 (첫 조건이 참)

  1. 산술 조건문 ((( ... )))
a=7
(( a > 5 && a < 10 ))
echo $?   # 결과: 0 (참)
count=12
(( count % 2 == 0 ))
echo $?   # 결과: 0 (짝수이므로 참)

같이 보면 좋은 자료들

https://devhints.io/bash

 

Bash scripting cheatsheet

Variables · Functions · Interpolation · Brace expansions · Loops · Conditional execution · Command substitution · One-page guide to Bash scripting

devhints.io

2023.07.19 - [Linux/shell] - [Bash] shell 기본 : 변수 설정 및 반복구문

 

[Bash] shell 기본 : 변수 설정 및 반복구문

shell script란shell에서 동작하는 script로,여러 command 들을 하나의 파일로 저장하고 해당 파일을 line별로 interpreting하여 수행시킬 수 있게 해주는 것을 가르킴.(.py파일이 python interptreter에 의해 동작하

ds31x.tistory.com

2023.10.01 - [Linux/shell] - [Shell] command substitution

 

[Shell] command substitution

command substitution (명령어치환)우리나라말로 명령어 치환 이라고 불리며,특정 명령어의 수행결과를 문자열로 입력받는 형태로 셀프로그래밍 등에서 사용됨.command substitution 사용법아래 예제는 resu

ds31x.tistory.com

 

728x90