쉘스크립트에서 자주 등장하는 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
'IT' 카테고리의 다른 글
[Ubuntu/Linux] 자바(Java, JRE 1.8.0) - 톰캣8(tomcat8) - OpenGrok 연결하기 (30) | 2015.07.18 |
---|---|
[Ubuntu/Linux] 쉘스크립트 expr의 모든 것 (4) | 2015.07.15 |
[Ubuntu/Linux] 쉘스크립트 변수의 모든 것 (0) | 2015.07.14 |
[Ubuntu/Linux] 쉘스크립트 인용부호의 모든 것 (30) | 2015.07.13 |
[Ubuntu/Linux] 쉘스크립트 패턴의 모든 것 (0) | 2015.07.12 |
[Ubuntu/Linux] 쉘스크립트 Flow control - for, case 문법의 모든 것 (0) | 2015.07.10 |
[Ubuntu/Linux] 쉘스크립트 Flow control - while, until 문법의 모든 것 (0) | 2015.07.09 |
[Ubuntu/Linux] 쉘스크립트 Flow control - if 문법의 모든 것 (0) | 2015.07.08 |
[Ubuntu/Linux] 본쉘(Bourne shell)에 없는 것과 있는 것 (0) | 2015.07.06 |
[algospot/알고리즘] 알고스팟 '초보' 난이도 URI 풀기 (0) | 2015.07.05 |