ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Ubuntu/Linux] 쉘스크립트 test 명령문의 모든 것
    IT 2015. 7. 11. 00:00

    쉘스크립트에서 자주 등장하는 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


Designed by Tistory.