리눅스

쉘 프로그래밍 [조건문 if]

작성자
heukchoo
작성일
2021-01-17 23:57
조회
555
엑셀 중급 이상이라면 조건문은 한번쯤 사용해 봤을 것이다.

조건문은 명시한 조건에 따라 실행할 명령을 분기시키는 역할을 한다.


조건문 구조1


(1) 조건 하나에 분기 명령 하나

조건이 맞으면 명령어1을 실행, 조건이 틀리면 넘어감
if [ 조건 ]
then
명령어1
fi


(2) 조건 하나에 분기 명령 두개

조건이 맞으면 명령어1을 실행, 조건이 틀리면 명령어2를 실행
if [ 조건 ]
then
명령어1
else
명령어2
fi


(3) 조건이 두개인 경우

조건1이 맞으면 명령어1 실행, 조건1이 틀리면 조건2를 검사
조건2가 맞으면 명령어2 실행, 조건2도 틀리면 명령어3 실행
if [ 조건1 ]
then
명령어1
elif [ 조건2 ]
명령어2
else
명령어3
fi

조건을 두개 이상 나열하고 싶으면 elif를 중간에 계속 추가하면 된다.

유의할 것은 if  또는 elif와 대괄호 [ 사이에 공백이 있어야 하며 조건 양 옆의 대괄호 []와 조건 사이에 공백이 있어야 한다.

재미있는것은 if로 시작하면 끝을 나타내는 문자는 if를 뒤집은 fi이다.
다른 명령문에도 같은 방식을 사용하니 알아두면 좋다.


조건은 보통 사용하는 <, >, = 가 아니라 아래 표와 같이 사용한다.
(<, > 등도 사용이 되긴하지만 더 아래의 조건문 구조2를 참고하라)


-z 문자열의 길이가 0이면 참 [ -z 문자열 ]
-n 문자열의 길이가 0이 아니면 참 [ -n 문자열 ]
= 두 문자열이 같으면 참 [ 문자열1 = 문자열2 ]
!= 두 문자열이 다르면 참 [ 문자열1 != 문자열2 ]

-eq 두 정수가 같으면 참 [ 정수1 -eq 정수2 ]
-ne 두 정수가 다르면 참 [ 정수1 -ne 정수2 ]
-gt 정수1 > 정수2 [ 정수1 -gt 정수2 ]
-ge 정수1 >= 정수2 [ 정수1 -ge 정수2 ]
-lt 정수1 < 정수2 [ 정수1 -lt 정수2 ]
-le 정수1 <= 정수2 [ 정수1 -le 정수2 ]

-a and 연산(&&), 두개 조건을 모두 만족하면 참 [ 조건1 -a 조건2 ]
-o or 연산(||), 두개 조건 중 하나만 만족해도 참 [ 조건1 -o 조건2 ]
if [[ 조건1 && 조건2 ]]
if [ 조건1 ] && [ 조건2 ] 형식으로도 사용가능


-d 디렉토리가 있으면 참 [ -d 디렉토리 ]
-e 파일이 있으면 참 [ -e 파일 ]
-L 심볼릭 링크 파일이면 참 [ -L 파일 ]
-r 읽기 가능한 파일이면 참 [ -r 파일 ]
-w 쓰기 가능한 파일이면 참 [ -w 파일 ]
-x 실행 가능한 파일이면 참 [ -x 파일 ]
-s 파일 크기가 0보다 크면 참 [ -s 파일 ]
-nt 파일1이 파일2보다 최신이면 참 [ 파일1 -nt 파일2 ]
-ot 파일2가 파일1보다 최신이면 참 [ 파일1 -ot 파일2 ]
-ef 파일1이 파일2와 같으면 참 [ 파일1 -ef 파일2 ]


조건문 구조1 예시

 

#!/bin/bash

var1=2

var2="heuk choo"

if [ $var1 -eq 2 ]
then
echo "var1 is 2"
elif [ "$var2" = "heuk choo" ]
echo "var2 is heuk choo"
else
echo "error"
fi


문자열을 비교할 때에는 공백을 포함할 수 있으므로 변수와 비교값을 큰 따옴표("")로 묶는 것이 좋다.


조건문 구조2


<, >, =, !=을 사용할 때는 보통 아래의 조건문 형식을 사용한다.
if (( 정수1 > 정수2 ))
then
명령어1
fi

어려운 것은 없으니 예시는 생략한다.


실수의 비교


위의 조건 예시를 보면 비교 값을 모두 정수만 사용하였다.

즉, 실수는 기본적으로 쉘 조건문에서 비교가 안된다.


따라서 아래와 같이 bc 명령을 추가로 사용하여 실수를 비교한다.

#!/bin/bash

var=2.1

if [ `echo $var > 1.1 | bc` -eq 1 ]
then
echo "var > 1.1"
else
echo "var <= 1.1"
fi



bc 명령으로 실수값 비교를 하였고 참이면 1을 거짓이면 0을 반환한다.

1과 같으면(-eq) 실수값 비교가 참인 상황으로 then 이하의 명령을 실행한다.
전체 0