
위의 그림은 가장 많이 애용되는 Extended Conditionals 를 정리(Bash 기준)한 것임.
이외에도 셸 스크립트에서 조건을 검사할 때는 test 또는 다양한 괄호 구문을 사용함 .
대표적으로 다음 네 가지 방법이 있음:
test명령어 사용:test 조건식- 대괄호 한 쌍 사용:
[ 조건식 ] - 이중 대괄호 사용:
[[ 조건식 ]] - 괄호 두 개 사용:
(( 산술식 ))
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 패턴 또는 정규식 사용이 필요한 경우
[[ ]]를 사용하는 것이 유리: 패턴 매칭, 정규 표현식, 논리 연산 등 확장 기능 제공 - 정수 산술 비교만 필요한 경우
(( ))이 가장 유리함: 높은 가독성의 간결한 표현식이 가능함.
연습
- POSIX 호환 구문 (test 또는 [ ])
file="test.txt"
touch "$file"
[ -f "${file}" ]
echo $? # 결과: 0 (파일 존재)
str="abc"
[ "${str}" = "abc" ]
echo $? # 결과: 0 (같음)
num=7
[ "${num}" -lt 10 ]
echo $? # 결과: 0 (작음)
- 확장 조건문 ([[ ... ]])
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 (첫 조건이 참)
- 산술 조건문 ((( ... )))
a=7
(( a > 5 && a < 10 ))
echo $? # 결과: 0 (참)
count=12
(( count % 2 == 0 ))
echo $? # 결과: 0 (짝수이므로 참)
같이 보면 좋은 자료들
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
'shell' 카테고리의 다른 글
| kill: Process에게 Signal을 보내기. (3) | 2025.07.25 |
|---|---|
| Shell 함수 기본: bash, zsh에서 함수 사용하기 (3) | 2025.07.25 |
| [Bash] File과 directory 관련 command (0) | 2024.05.20 |
| [Shell] command substitution (1) | 2023.10.01 |
| [Bash] shell 기본 : 변수 설정 및 반복구문 (0) | 2023.07.19 |