Linux test 명령어 활용법

셸 스크립트에서 조건을 평가할 때 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(접근 시각)은 반영되지 않습니다.

논리 연산자

연산자의미사용 위치
-aANDtest, [ ] 내부
&&AND[ ] 사이, [[ ]]
-oORtest, [ ] 내부
||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 등을 검사할 때는 값이 없을 경우를 대비해 [[ ]] 사용이 권장됩니다.

태그: bash shell-script linux test-command conditional-expression

7월 18일 09:41에 게시됨