쉘스크립트에서 자주 등장하는 test 문을 파헤쳐보겠습니다.

얼마나 깊게 팔지는 모르겠지만,

그저 사용하는데 불편함이 없는 정도 만이라도 제대로 파내면 좋겠습니다.


쉘의 조건문에 어김없이 등장하는 test 명령문을 익혀서,

쉘 스크립트에 한 걸음 더 다가가 보도록 하겠습니다.



test는 파일 존재유무 / 타입 / 권한을 체크할 때 사용합니다.

조건문이 들어가야할 위치에 test가 광범위하게 사용되고 있습니다.


쉘스크립트에서 아래 두 가지 형태로 사용하고 있습니다.

test expression

혹은

[ expression ]

두번째 방식으로 사용하려면 반드시 [] 대괄호와 expression 사이에는 빈칸이 있어야 합니다.

왜냐하면, '['도 명령문이기 때문입니다.

유닉스 시스템에서는 명령문과 아규먼트 사이에 빈칸이 있어야 합니다.


아래 명령의 결과 긍정이면 '0'이 리턴되고, 부정이면 '1'이 리턴됩니다.

C언어와 반대이니 헛갈려 실수하지 않도록 주의해야합니다.


-e 파일이름 - 파일이 존재하는지 여부

-f 파일이름 - 일반파일인지 여부

-b 파일이름 - 파일이 블록파일로 존재하는지 여부

-c 파일이름 - 파일이 캐릭터파일로 존재하는지 여부

-d 파일이름 - 파일이 디렉토리인지 여부


dvd는 블록장치이므로 -b로 체크하면 리턴값은 '0'이 됩니다.

$ test -b /dev/dvd
$ echo $?
0


console은 캐릭터장치이므로 -c로 체크하면 리턴값은 '0'이 됩니다.

$ test -c /dev/console 
$ echo $?
0


캐릭터나 블록장치를 -f로 체크하면 아래처럼 '1'을 리턴합니다.

$ test -f /dev/console 
$ echo $?
1


-g 파일이름 - SGID가 설정되어있는지 여부

-u 파일이름 - SUID가 설정되어있는지 여부

-k 파일이름 - sticky bit가 설정되어있는지 여부

   sticky bit가 설정된 파일/디렉토리는 생성한 유저만이 삭제할 수 있습니다.


-h 파일이름 - 파일이 심볼릭 링크인지 여부

-L 파일이름 - 파일이 심볼릭 링크인지 여부

     -h와 -L은 동일한 기능을 수행합니다.


-r 파일이름 - 현 프로세스가 파일에 읽기 권한이 있는지 여부.

-w 파일이름 - 파일에 쓰기 권한이 있는지 여부. read-only 파일시스템에서는 쓰기권한이 있어도 쓰기가 안될 수 있습니다.

-x 파일이름 - 파일에 실행 권한이 있는지 여부. 디렉토리에 실행권한이 있으면 cd를 할 수 있습니다.


-p 파일이름 - 파일이 이름있는 파이프인지 여부(FIFO)

-s 파일이름 - 파일사이즈가 0 초과인지 여부

-t FileDescriptor - 파일디스크팁터가 현 터미널에서 열렸는지 여부


표준입력(0)/표준출력(1)/표준에러(2)는 열려있습니다. 3번은 열려있지 않네요.

$ test -t 0
$ echo $?
0
$ test -t 1
$ echo $?
0
$ test -t 2
$ echo $?
0
$ test -t 3
$ echo $?
1


file1 -nt file2 - file1이 file2보다 새로운 파일인지 여부(newer than)

$ touch old
$ touch new
$ test old -nt new
$ echo $?
1

위의 예에서 old가 더 새로운 파일은 아니므로 '1'이 리턴되었습니다.


file1 -ot file2 - file1이 file2보다 오래된 파일인지 여부(older than)

$ test old -ot new
$ echo $?
0

old가 더 오래된 파일이므로 이번에는 0을 리턴하였습니다.


file1 -ef file2 - file1이 file2의 또 다른 이름인지 여부(symbolic link 또는 hard link)

$ ln -s new new.link
$ test new -ef new.link
$ echo $?
0

위처럼 new 파일의 소프트링크 new.link 파일을 만들었습니다.

그리고 -ef 옵션을 사용하여 new와 new.link를 비교하였습니다.

결과는 두 개의 파일이 동일하다는 리턴값 '0'이 나왔습니다.

이는 하드링크에서도 동일합니다.


-n String1 - String1의 길이가 0 초과(nonzero)

-z String1 - String1의 길이가 0(zero)

String1 = String2 - String1과 String2가 일치

String1 != String2 - String1과 String2가 불일치

String1 - String1은 NOT NULL


Integer1 -eq Integer2 - Integer1과 Integer2는 일치

-ne - 불일치

-gt - 보다 큰

-ge - 크거나 같은

-lt - 보다 작은

-le - 작거나 같은


! - 부정

-a - AND

-o - OR(-a 연산자가 -o 보다 우선순위가 높습니다.)

\(Expression\) - '\'과 함께 쓰이는 괄호는 그룹을 지정할 때 사용


이상과 같이 test에 대해 알아보았습니다.

이제 조건문을 보다 자유롭게 채워넣을 수 있겠군요.


그럼 좋은 하루 보내세요~

끝_


* References

https://en.wikipedia.org/wiki/Test_%28Unix%29


+ Recent posts