사랑하애오

test 명령

파일/디렉토리의 존재 유무 판단, 문자열 비교, 숫자 비교를 하기 위해 사용하는 test 명령.
쉘 프로그래밍을 하기 위해 자주 이용이 되는 명령 중 하나

test 명령의 형식

test CONDITION or [ CONDITION ]

주로 IF문에서 많이 사용하고 조건에 대한 참, 거짓 [ CONDITION ] 형식으로 많이 사용됨,
괄호([ ])와 CONDITION 사이는 반드시 빈칸으로 띄어쓰기를 해야함. 하지 않으면 에러 발생

조건 ( Condition )

1) 파일에 대한 조건

조건 설명
-b filename 파일이 존재하고 block special 파일이면 참
-c filename 파일이 존재하고 character special 파일이면 참
-d filename 파일이 존재하고 디렉토리가 존재하면 참
-e filename 파일이 존재하면 참
-f filename 파일이 존재하고 정규 파일이면 참
-g filename 파일이 존재하고 setgid가 적용되어 있으면 참
-k filename 파일이 존재하고 sticky bit가 적용되어 있으면 참
-L filename 파일이 존재하고 심볼릭 링크면 참
-p filename 파일이 존재하고 named pipe 파일이면 참
-r filename 파일이 존재하고 읽기 권한이 있다면 참
-w filename 파이링 존재하고 쓰기 권한이 있다면 참
-x filename 파일이 존재하고 실행 권한이 있다면 참
-s filename 파일이 존재하고 파일크기가 0 byte 보다 크다면 참
-S filename 파일이 존재하고 Socket 파일이면 참

파일에 대한 조건에 대해 몇 가지 예를 들면 아래와 같고,
아래는 사용자로부터 파일 이름을 입력 받아 그 파일의 존재 유무를 판단하는 스크립트임.

[root@shell01 ~]# vi testcomm1.sh

#!/bin/bash
#

echo -n "type a filename : "
read FILENAME

if [ -f $FILENAME ]; then
echo "$FILENAME file exists."
else
echo "$FILENAME file dose not exists."
fi

[root@shell01 ~]#

testcomm1.sh 파일에 실행 권한을 부여한 후 파일을 실행하면 아래와 같이 결과를 확인 가능함.

[root@shell01 ~]# ./testcomm1.sh

type a filename : /etc/passwd
/etc/passwd file exists.

[root@shell01 ~]# ./testcomm1.sh

type a filename: /etc/ls
/etc/ls file dose not exists.

[root@shell01 ~]#

아래는 사용자로부터 디렉토리 이름을 입력받아 그 디렉토리의 존재 유무를 판단하는 스크립트

[root@shell01 ~]# cat testcomm2.sh

#!/bin/bash
#

echo -n "type a director name : "
read DIRNAME

if [ -e $DIRNAME -a -d $DIRNAME ]; then
echo "$DIRNAME directory exists."
elif [ -e $DIRNAME ]; then
echo "$DIRNAME is not directory"
file $DIRNAME
else
echo "$DIRNAME directory dose not exists."
fi

[root@shell01 ~]#

testcomm2.sh 파일에 실행 권한을 부여한 후 파일을 실행하면 아래와 같은 결과 확인 가능.

[root@shell01 ~]# ./testcomm2.sh

type a directory name : /etc
/etc directory exists.

[root@shell01 ~]# ./testcomm2.sh

type a directory name : /etc/passwd
/etc/passwd is not directory
/etc/passwd: ASCII text

[root@shell01 ~]# ./testcomm2.sh

type a directory name : /etc/pass
/etc/pass directory dose not exists.

[root@shell01 ~]#

 

2) 문자열에 대한 조건

조건 설명
문자열1 = 문자열2 문자열1과 문자열2가 같다면 참
문자열1 != 문자열2 문자열1과 문자열2가 다르다면 참
-z 문자열 문자열 길이가 0이라면 참
-n 문자열 문자열 길이가 0이 아니라면 참

문자열에 대한 조건의 예제는 아래와 같음.

[root@shell01 ~]# cat testcomm3.sh

#!/bin/bash

if [ -z $1 ]; then
echo "there is no argument"
elif [ -n $1 -a $1 = start ]; then
echo "argument value is start"
else
echo "argument value is $1"
fi

[root$shell01 ~]#

testcomm3.sh 파일에 실행 권한을 부여한 후 파일 실행을 하면 아래와 같이 결과를 확인할 수 있음.

[root@shell01 ~]# ./testcomm3.sh start

argument value is start

[root@shell01 ~]# ./testcomm2.sh stop

argument value is stop

[root@shell01 ~]# ./testcomm3.sh

there is no argument

[root@shell01 ~]#

쉘의 첫번째 인자값을 어떠한 문자열로 사용하느냐에 따라 다르게 결과값이 출력됨.

 

3) 숫자에 대한 조건

조건 설명
N1 -eq N2 N1과 N2의 숫자가 같다면 참
N1 -ne N2 N1과 N2의 숫자가 다르면 참
N1 -ge N2 N1이 N2보다 크거나 같다면 참
N1 -gt N2 N1이 N2보다 크다면 참
N1 -le N2 N1이 N2보다 작거나 같다면 참
N1 -lt N2 N1이 N2보다 작다면 참

숫자 비교에 대한 조건의 예제는 아래와 같음.

[root@shell01 ~]# cat testcomm4.sh

#!/bin/bash

echo -n "type your age : "
read AGE

if [ $AGE -ge 18 ]; then
echo "You are adult"
else
echo "You are uderage"
fi

[root@shell01 ~]#

testcomm4.sh 파일에 실행 권한을 부여한 후 파일 실행을 하면 아래와 같이 결과를 확인할 수 있음.

[root@shell01 ~]# ./testcomm4.sh

type your age : 12
You are underage

[root@shell01 ~]# ./testcomm4.sh

type your age : 18
You are adult

[root@shell01 ~]#

사용자로부터 받은 숫자 값이 18 이상이면 성인으로 출력되게 만들었음.
파일/숫자에 대한 조건은 많이 사용하니 관련된 옵션을 외워두면 편함.

'Linux' 카테고리의 다른 글

리눅스 오늘 날짜 파일 생성하기  (0) 2021.12.20
리눅스 비교연산, 산술연산 - expr과 bc명령  (0) 2021.12.17
리눅스 Shell Script 변수정리  (0) 2021.12.17
리눅스 Shell Script 정리  (0) 2021.12.16
리눅스 wget 정리  (0) 2021.12.16
profile

사랑하애오

@사랑하애

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!