리눅스에서 Bash 스크립트를 작성할 때 조건문의 다양한 사용 문법이 생각이 안 날때가 많았다. 스크립트를 작성하거나 작성된 스크립트를 해석할 때 도움이 되고자 Bash 조건문의 문법을 정리해보자.
Bash에서 조건문은 다음과 같은 문법을 따른다.
if [ expression1 ]
then
statement1
elif [ expression2 ]
then
statement2
else
statement3
fi
일반적인 프로그래밍 언어의 조건문과 크게 다르지 않다.
expression1, expression2 부분에 사용할 수 있는 비교 연산은 다음과 같다.
Bash if - 정수 비교
사용예 | 의미 |
if [ "$a" -eq "$b" ] | $a와 $b가 같은 경우 (equal) |
if [ "$a" -ne "$b" ] | $a와 $b가 다른 경우 (not equal) |
if [ "$a" -lt "$b" ] | $a가 $b 보다 작은 경우 (less than) |
if (( "$a" < "$b" )) | |
if [ "$a" -gt "$b" ] | $a가 $b 보다 큰 경우 (greater than) |
if (( "$a" > "$b" )) | |
if [ "$a" -le "$b" ] | $a가 $b 보다 작거나 같은 경우 (less than or equal to) |
if (( "$a" <= "$b" )) | |
if [ "$a" -ge "$b" ] | $a가 $b 보다 크거나 같은 경우 (greater than or equal to) |
if (( "$a" >= "$b" )) |
영어 단어와 함께 기억하면 편하다.
Bash if - 문자열 비교
사용예 | 의미 |
if [ "$a" == "$b" ] | 두 문자열이 같은 경우 |
if [ "$a" = "$b" ] | 두 문자열 모두 빈 칸인 경우 |
if [ "$a" != "$b" ] | 두 문자열이 다른 경우 |
if [ -z "$a" ] | 문자열의 길이가 0인 경우 |
if [ -n "$a" ] | 문자열의 길이가 0이 아닌 경우 |
Bash if - 파일 연산
사용예 | 의미 |
if [ -a <FILE> ] | 파일이 존재하는 경우 |
if [ -d <FILE> ] | 파일이 존재하고, 디렉토리인 경우 |
if [ -f <FILE> ] | 파일이 존재하고, 정규파일인 경우 |
if [ -x <FILE> ] | 파일이 존재하고, 실행가능한 파일인 경우 (Excutable) |
if [ -b <FILE> ] | 파일이 존재하고, 블럭 디바이스인 경우 |
if [ -c <FILE> ] | 파일이 존재하고, 캐릭터 디바이스인 경우 |
if [ -e <FILE> ] | 파일이 존재하는 경우 |
if [ ! -e <FILE> ] | 파일이 존재하지 않는 경우 |
if [ -g <FILE> ] | 파일이 존재하고, set-group-id 파일인 경우 |
if [ -h <FILE> ] | 파일이 존재하고, 심볼릭 링크인 경우 |
if [ -L <FILE> ] | 파일이 존재하고, 심볼릭 링크인 경우 |
if [ -k <FILE> ] | 파일이 존재하고, Sticky bit가 세팅되어 있는 경우 |
if [ -p <FILE> ] | 파일이 존재하고, 네임드파이프(FIFO)인 경우 |
if [ -r <FILE> ] | 파일이 존재하고, 읽을 수 있는 경우 |
if [ -s <FILE> ] | 파일이 존재하고, 사이즈가 0보다 큰 경우 |
if [ -S <FILE> ] | 파일이 존재하고, 소켓인 경우 |
if [ -t <FILE> ] | FD가 열려진 터미널인 경우 |
if [ -u <FILE> ] | 파일이 존재하고, SUID(set user id) 비트가 설정되어 있는 경우 |
if [ -w <FILE> ] | 파일이 존재하고, 쓸 수 있는 경우 |
if [ -O <FILE> ] | 파일이 존재하고, 소유자가 현재 사용자인 경우 (effective user ID) |
if [ -G <FILE> ] | 파일이 존재하고, 소유그룹이 현재 그룹인 경우 (effective user group) |
if [ -N <FILE> ] | 파일이 존재하고, 지난번 이후로 수정된 경우 |
if [ <FILE1> -nt <FILE2> ] | FILE1이 FILE2보다 새로운 파일인 경우 (newer than) |
if [ <FILE1> -ot <FILE2> ] | FILE1이 FILE2보다 오래된 파일인 경우 (older than) |
if [ <FILE1> -et <FILE2> ] | FILE1이 FILE2의 하드링크인 경우 |
Bash if - 논리연산
사용예 | 의미 |
if [[ condition1 && condition2 ]] | condition1, condition2가 모두 참인 경우 |
if [ condition1 ] && [ condition2 ] | |
if [ condition1 -a condition2 ] | |
if [[ condition1 || condition2 ]] | condition1, condition2중 하나라도 참인 경우 |
if [ condition1 ] || [ condition2 ] | |
if [ condition1 -o condition2 ] | |
if [ ! condition] | condition이 참이면 거짓, 거짓이면 참 |
if [ ( EXPR ) ] | EXPR의 결과값을 반환 |
Bash if - 기타
사용예 | 의미 |
if [ -o OPTIONNAME ] | Shell 옵션 "OPTIONNAME"이 enable 된 경우 |
댓글