셸 스크립트에서 조건을 평가할 때
test 명령어를 사용하며, [ ] 기호로 축약 표현할 수 있습니다. 이 명령어는 숫자 비교, 문자열 검사, 파일 속성 확인 등 세 가지 범주로 나뉩니다. 문법은 test 조건 또는 [ 조건 ] 형태이며, 대괄호와 조건 사이, 연산자와 피연산자 사이에 반드시 공백이 있어야 합니다.
test 단독 실행 시 조건이 참이면 종료 코드 0을, 거짓이면 1을 반환합니다.
숫자 비교
| 연산자 | 의미 | 예시 |
|---|---|---|
| -eq | 같음 | [ $x -eq $y ] |
| -ne | 다름 | [ $x -ne $y ] |
| -gt | 큼 | [ $x -gt $y ] |
| -ge | 크거나 같음 | [ $x -ge $y ] |
| -lt | 작음 | [ $x -lt $y ] |
| -le | 작거나 같음 | [ $x -le $y ] |
예제
#!/bin/bash
read -p "첫 번째 정수: " val_a
read -p "두 번째 정수: " val_b
if [ $val_a -eq $val_b ]; then
echo "두 수가 같습니다"
elif [ $val_a -gt $val_b ]; then
echo "첫 번째 수가 더 큽니다"
elif [ $val_a -lt $val_b ]; then
echo "두 번째 수가 더 큽니다"
else
echo "비교할 수 없습니다"
fi
숫자가 아닌 값을 입력하면 정수 표현식 필요 오류가 발생합니다.
문자열 검사
| 연산자 | 의미 | 예시 |
|---|---|---|
| = | 문자열 같음 | [ $s1 = $s2 ] |
| != | 문자열 다름 | [ $s1 != $s2 ] |
| -z | 길이가 0 | [ -z $s1 ] |
| -n | 길이가 0이 아님 | [ -n $s1 ] |
| > | ASCII 순서상 큼 | [ $s1 \> $s2 ] |
| < | ASCII 순서상 작음 | [ $s1 \< $s2 ] |
예제
#!/bin/bash
read -p "첫 번째 문자열: " s1
read -p "두 번째 문자열: " s2
if [ "$s1" = "$s2" ]; then
echo "동일한 문자열입니다"
elif [ -n "$s1" ] && [ -n "$s2" ]; then
echo "둘 다 비어있지 않습니다"
fi
문자열 대소 비교 시 주의사항:
>,<는 리다이렉션으로 해석되므로\>,\<로 이스케이프해야 함- ASCII 코드 기준으로 비교하므로 대문자가 소문자보다 작음
- 문자열 길이가 다르더라도 첫 번째 다른 문자에서 즉시 결정됨
#!/bin/bash
read -p "문자열 1: " s1
read -p "문자열 2: " s2
if [ "$s1" \> "$s2" ]; then
echo "첫 번째가 더 큼"
else
echo "첫 번째가 더 작거나 같음"
fi
파일 속성 확인
| 연산자 | 의미 | 예시 |
|---|---|---|
| -e | 파일/디렉토리 존재 | [ -e path ] |
| -r | 존재하고 읽기 가능 | [ -r path ] |
| -w | 존재하고 쓰기 가능 | [ -w path ] |
| -x | 존재하고 실행 가능 | [ -x path ] |
| -s | 존재하고 크기가 0보다 큼 | [ -s path ] |
| -d | 존재하고 디렉토리 | [ -d path ] |
| -f | 존재하고 일반 파일 | [ -f path ] |
| -c | 존재하고 문자 장치 | [ -c path ] |
| -b | 존재하고 블록 장치 | [ -b path ] |
| -nt | 더 최신 파일 | [ f1 -nt f2 ] |
| -ot | 더 오래된 파일 | [ f1 -ot f2 ] |
| -ef | 동일 파일(하드링크, inode 동일) | [ f1 -ef f2 ] |
예제
#!/bin/bash
read -p "첫 번째 파일 경로: " -r file_a
read -p "두 번째 파일 경로: " -r file_b
if [ "$file_a" -nt "$file_b" ]; then
echo " 번째 파일이 더 최신입니다"
elif [ "$file_a" -ot "$file_b" ]; then
echo "첫 번째 파일이 더 오래되었습니다"
else
echo "시간이 같거나 비교 불가"
fi
파일 시간 비교는 mtime(수정 시각)을 기준으로 합니다. atime(접근 시각)은 반영되지 않습니다.
논리 연산자
| 연산자 | 의미 | 사용 위치 |
|---|---|---|
| -a | AND | test, [ ] 내부 |
| && | AND | [ ] 사이, [[ ]] |
| -o | OR | test, [ ] 내부 |
| || | OR | [ ] 사이, [[ ]] |
| ! | NOT | 모든 곳 |
[[ ]]와 [ ]의 차이
| 기능 | [[ ]] | [ ] |
|---|---|---|
| <, > 이스케이프 | 불필요 | 필수 |
| 산술 확장 | 지원 | 미지원 |
| 정규 표현식 (=~) | 지원 | 미지원 |
| 와일드카드 (*, ?, [ ]) | 지원 | 미지원 |
| 빈 변수 안전성 | 안전 | 따옴표 필요 |
[[ ]] 활용 예제
#!/bin/bash
# 정규 표현식 매칭
if [[ "hello_world_2024" =~ [0-9]{4} ]]; then
echo "4자리 연도를 포함하고 있습니다"
fi
# 와일드카드 사용
filename="report_backup.tar.gz"
if [[ $filename == *.tar.gz ]]; then
echo "tar.gz 아카이브 파일입니다"
fi
스크립트 매개변수 $1 등을 검사할 때는 값이 없을 경우를 대비해 [[ ]] 사용이 권장됩니다.