사랑하애오

1. test 명령

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

1.1. test 명령의 형식

test CONDITION or [ CONDITION ]

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

1.2. 조건 ( Condition )

1.2.1. 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 파일이면 참

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

<html />
[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 파일에 실행 권한을 부여한 후 파일을 실행하면 아래와 같이 결과를 확인 가능함.

<html />
[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 ~]#

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

<html />
[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 파일에 실행 권한을 부여한 후 파일을 실행하면 아래와 같은 결과 확인 가능.

<html />
[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 ~]#

 

1.2.2. 2) 문자열에 대한 조건

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

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

<html />
[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 파일에 실행 권한을 부여한 후 파일 실행을 하면 아래와 같이 결과를 확인할 수 있음.

<html />
[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 ~]#

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

 

1.2.3. 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보다 작다면 참

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

<html />
[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 파일에 실행 권한을 부여한 후 파일 실행을 하면 아래와 같이 결과를 확인할 수 있음.

<html />
[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

사랑하애오

@사랑하애

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