shell - test
shell 에서 test는 파일 형식 확인 및 값 비교를 위해 사용
7.1. if에 대한 소개
7.1.1. 일반적인
명령의 성공 또는 실패에 따라 쉘 스크립트에서 수행할 다른 작업 과정을 지정해야 하는 경우가 있습니다. if 구성을 사용하면 이러한 조건을 지정할 수 있습니다.
if 명령 의 가장 간결한 구문은 다음과 같습니다.
if TEST-COMMANDS; then CONSEQUENT-COMMANDS; fi
TEST-COMMAND 목록 이 실행되고 반환 상태가 0이면 CONSEQUENT-COMMANDS 목록이 실행됩니다. 반환 상태는 마지막으로 실행된 명령의 종료 상태이거나 true로 테스트된 조건이 없으면 0입니다.
TEST-COMMAND 는 숫자 또는 문자열 비교 테스트를 포함하지만 성공하면 0 상태를 반환하고 실패하면 다른 상태를 반환합니다.
단항 표현식은 종종 파일의 상태를 검사하는 데 사용됩니다. stdin , stdout 및 stderr 및 각각의 파일 설명자를 테스트에 사용할 수도 있습니다.
7.1.1.1. if와 함께 사용되는 표현식
아래 표에는 TEST-COMMAND 명령은 조건식의 테스트를 나타내기 위해 대괄호( [] ) 사이에 넣습니다.
표 7-1. 기본 표현식
주요한의미[ - 파일 ] | FILE 이 있으면 참 입니다. |
[ -b 파일 ] | FILE 이 존재하고 블록 특수 파일 이면 참 입니다. |
[ -c 파일 ] | FILE 이 존재하고 문자 특수 파일 이면 참 입니다. |
[ -d 파일 ] | FILE 이 존재하고 디렉토리 이면 참 입니다. |
[ -e 파일 ] | FILE 이 있으면 참 입니다. |
[ -f 파일 ] | FILE 이 존재하고 일반 파일 이면 참 입니다. |
[ -g 파일 ] | FILE 이 존재하고 SGID 비트가 설정되어 있으면 참 입니다. |
[ -h 파일 ] | FILE 이 존재하고 심볼릭 링크 이면 참 입니다. |
[ -k 파일 ] | FILE 이 존재하고 고정 비트가 설정되어 있으면 참 입니다. |
[ -p 파일 ] | FILE 이 존재하고 명명된 파이프(FIFO)인 경우 참 입니다. |
[ -r 파일 ] | FILE 이 존재하고 읽을 수 있으면 참 입니다. |
[ -s 파일 ] | FILE 이 존재하고 크기가 0보다 크면 참 입니다. |
[ -t FD ] | 파일 설명자 FD 가 열려 있고 터미널을 참조하는 경우 참 입니다. |
[ -u 파일 ] | FILE 이 존재하고 SUID(사용자 ID 설정) 비트가 설정되어 있으면 참 입니다. |
[ -w 파일 ] | FILE 이 존재하고 쓰기 가능한 경우 참 입니다. |
[ -x 파일 ] | FILE 이 존재하고 실행 가능한 경우 참 입니다. |
[ -O 파일 ] | FILE 이 존재하고 유효 사용자 ID가 소유한 경우 참 입니다. |
[ -G 파일 ] | FILE 이 존재하고 유효 그룹 ID가 소유한 경우 참 입니다. |
[ -L 파일 ] | FILE 이 존재하고 심볼릭 링크 이면 참 입니다. |
[ -N 파일 ] | FILE 이 존재하고 마지막으로 읽은 이후 수정 되었으면 참 입니다. |
[ -S 파일 ] | FILE 이 존재하고 소켓 이면 참 입니다. |
[ 파일 1 - 파일 2 ] | FILE1 이 FILE2 보다 최근에 변경 되었거나 FILE1 이 있고 FILE2 가 없는 경우 true 입니다. |
[ 파일 1 - 파일 2 ] | FILE1 이 FILE2 보다 오래된 경우 또는 FILE2 가 있고 FILE1 이 없는 경우 참 입니다. |
[ 파일1 -ef 파일 2 ] | FILE1 및 FILE2 가 동일한 장치 및 inode 번호를 참조하는 경우 참 입니다. |
[ -o 옵션 이름 ] | 셸 옵션 "OPTIONNAME" 이 활성화된 경우 True입니다. |
[ -z 문자열 ] | "STRING" 이 0 이면 길이가 참입니다. space나 tab 만으로 구성된 경우에도 문자열 길이가 0 입니다. |
[ -n STRING ] 또는 [ STRING ] | "STRING" 의 길이 가 0이 아니면 참 입니다. |
[ STRING1 == STRING2 ] | 문자열이 같으면 참입니다. 엄격한 POSIX 준수를 위해 " =" 대신 "=" 를 사용할 수 있습니다. |
[ STRING1 != STRING2 ] | 문자열이 같지 않으면 참입니다. |
[ STRING1 < STRING2 ] | "STRING1 " 이 현재 로케일에서 사전 순으로 "STRING2" 보다 먼저 정렬 되면 true 입니다. |
[ STRING1 > STRING2 ] | "STRING1" 이 현재 로케일에서 사전 순으로 " STRING2" 다음에 정렬 되면 참 입니다. |
[ ARG1 OP ARG2 ] | "OP" 는 -eq , -ne , -lt , -le , -gt 또는 -ge 중 하나입니다 . 이러한 산술 이항 연산자는 각각 "ARG1" 이 "ARG2" 와 같거나 같지 않거나 작거나 같거나 크거나 같으면 true를 반환합니다 . "ARG1" 및 "ARG2" 는 정수입니다. |
표 7-2. 표현식 결합
[ ! EXPR] | EXPR 이 거짓 이면 참 입니다. |
[ ( EXPR) ] | EXPR 값을 반환합니다 . 이것은 연산자의 일반적인 우선 순위를 무시하는 데 사용할 수 있습니다. |
[ EXPR1 -a EXPR2 ] | EXPR1 과 EXPR2 가 모두 참이면 참입니다. |
[ EXPR1 -o EXPR2 ] | EXPR1 또는 EXPR2 가 참 이면 참입니다. |
if 가 fi 로 닫히는 것처럼 여는 대괄호는 조건이 나열된 후에 닫아야 합니다.
7.1.1.2. then 문 다음에 나오는 명령
then 문 다음에 오는 CONSEQUENT-COMMANDS 목록은 fi 를 제외하고 모든 유효한 UNIX 명령, 실행 프로그램, 실행 가능한 셸 스크립트문이 될 수 있습니다 . then 과 fi 는 쉘에서 분리된 문장으로 간주됩니다 . 따라서 명령줄에서 실행될 때 세미콜론으로 구분됩니다.
7.1.1.3. 파일 확인 중
첫 번째 예는 파일의 존재하는지를 확인합니다.
$ cat filecheck.sh
#!/bin/bash
echo "This scripts checks the existence of the messages file."
echo "Checking..."
if [ -f /var/log/messages ]
then
echo "/var/log/messages exists."
fi
echo
echo "...done."
$ filecheck.sh
This scripts checks the existence of the messages file.
Checking...
/var/log/messages exists.
...done.
7.1.2. if의 간단한 응용
7.1.2.1. 종료 상태 테스트
? 변수는 이전에 실행된 명령(가장 최근에 완료된 포그라운드 프로세스)의 종료 상태를 유지합니다.
다음 예는 간단한 테스트를 보여줍니다.
#!/bin/bash
echo '$? : check return value'
if [ $? -eq 0 ]
then
echo 'before task is successful!'
fi
## Result
before task is successful!
7.1.2.2. 수치 비교
아래 예에서는 숫자 비교를 사용합니다.
#!/bin/bash
num=201
if [ "$num" -gt "150" ]
then
echo "you've worked hard enough for today."
fi
## Result
you've worked hard enough for today
7.1.2.3. 문자열 비교
사용자 ID 테스트를 위한 문자열 비교의 예:
if [ "$(whoami)" != 'root' ]; then
echo "You have no permission to run $0 as non-root user."
exit 1;
fi
-- Result
You have no permission to run ./script.sh as non-root user.
Bash를 사용하면 위의 내용을 다음과 같이 간결하게 쓸 수 있습니다.
[ "$(whoami)" != 'root' ] && ( echo "you are using a non-privileged account"; exit 1 )
"&&"는 테스트가 true인 경우 수행할 작업을 지정합니다 . "||" 테스트가 false인 경우 수행할 작업을 지정합니다.
비교에 정규 표현식을 사용할 수도 있습니다.
#!/bin/bash
gender="female"
if [[ "$gender" == f* ]]
then
echo "Pleasure to meet you.";
fi
## Result
Pleasure to meet you.