셸 - if, case

김상우·2022년 8월 14일

Shell

목록 보기
2/4
post-thumbnail

If문, Case문

if 문

  • 기본 형태
if [ condition ]
then
	execute if true
fi

[ condition ] 부분에서 각 단어에는 모두 공백이 있어야 한다.

  • 예시
#!/bin/sh
if [ "test" = "test" ]
then
        echo "true"
fi      
exit 0
  • 결과
[root@localhost ~]# sh if1.sh
true

예시 스크립트에서 if [ "test" = "test" ] 부분을 보면 '='의 의미는 앞과 뒤가 같은지 비교하는 연산을 하벼 '!='으로도 비교연산이 가능하다.

if~else 문

if 문에 이어서 참인 경우와 거짓인 경우를 구분하여 실행한다.

  • 기본 형태
if [ condition ]
then
	execute if true
else
	excute if false
fi
  • 예시
#!/bin/sh
if [ "test" != "test" ]
then    
        echo "true"
else    
        echo "false"
fi      
exit 0
  • 결과
[root@localhost ~]# sh if2.sh
false

'!='으로 비교했기 때문에 else에 해당하는 false가 출력된다. 중복 if를 사용하기 위해서는 다른 프로그래밍 언어와 마찬가지로 elif 구문도 사용이 가능하다.

비교 연산자

  • 문자열 비교
비교결과
"문자열1" = "문자열2"두 개의 문자열이 같으면 참
"문자열1" != "문자열2"두 개의 문자열이 다르면 참
-n "문자열"문자열이 NULL(비어있는 문자열)이 아니면 참
-z "문자열"문자열이 NULL(비어있는 문자열)인 경우 참
  • 산술 비교
비교결과
수식1 -eq 수식2두 수식(또는 변수)이 같으면 참
수식1 -ne 수식2두 수식(또는 변수)이 다르면 참
수식1 -gt 수식2수식1이 크면 참
수식1 -ge 수식2수식1이 크거나 같으면 참
수식1 -lt 수식2수식1이 작으면 참
수식1 -le 수식2수식1이 작거나 같으면 참
!수식수식이 거짓이면 참
  • 예시
#!/bin/sh
if [ 100 -eq 200 ]
then    
        echo "100 = 200"
else    
        echo "100 != 200"
fi      
exit 0
  • 결과
[root@localhost ~]# sh if3.sh
100 != 200

파일 조건

파일 조건결과
-d [파일이름]파일이 디렉토리면 참
-e [파일이름]파일이 존재한다면 참
-f [파일이름]파일이 일반파일이면 참
-g [파일이름]파일에 set-group-id가 설정되면 참
-r [파일이름]파일이 읽기 가능하면 참
-s [파일이름]파일 크기가 0이 아니면 참
-u [파일이름]파일에 set-user-id가 설정되면 참
-w [파일이름]파일이 쓰기 가능하면 참
-x [파일이름]파일이 실행 가능하면 참
  • 예시
#!/bin/sh
fname=/lib/systemd/system/sshd_service
if [ -f $fname ]
then    
        head -3 $fname
else    
        echo "not installd sshd"
fi      
exit 0s
  • 결과
[root@localhost ~]# sh if4.sh
[Unit]
Description=OpenBSD Secure Shell server
Documentation=man:sshd(8) man:sshd_config(5)

예시에서 head는 맨 위부터 -[숫자]의 [숫자]행 만큼 파일의 내용을 출력하라는 의미이다.

case~esac

if 문의 단점은 참과 거짓을 판단하는 이분화된 경우에서 사용할 수 있다는 것이다. 만약 여러가지 경우의 수가 있다면 다중으로 if 문을 사용하는 방법이 있지만 구문이 복잡해지는 것을 막기위해 case 문을 사용하여 경우의 수만큼 분류 할 수 있다.

  • 예시1
#!/bin/sh
case "$1" in
        start)
                echo "start~~";;
        stop)
                echo "stop~~";;
        restart)
                echo "restart~~";;
        *)      
                echo "not identifiable~~";;
esac
exit 0
  • 결과
[root@localhost ~]# sh case1.sh start
start~~
[root@localhost ~]# sh case1.sh restart
restart~~
[root@localhost ~]# sh case1.sh stop
stop~~
[root@localhost ~]# sh case1.sh
not identifiable~~
  1. 스크립트에서 명시한 첫 번째 파라미터 변수의 값에 따라 출력되는 문자열이 다르다.
  2. 명시한 케이스 중 start, stop, restart를 제외한 모든 경우는 not identifiable~~ 을 출력한다.
  3. 주의할 점은 맨 뒤에 세미콜론은 두개 붙여서 작성해야한다.
  • 예시2
#!/bin/sh
echo "is this centos? (yes / no)"
read answer
case $answer in
        yes | y | Y | Yes | YES)
                echo "Yes, this is centos";;
        [nN]*)  
                echo "This is not centos";;
        *)      
                echo "wrong answer"
                exit 1;;
esac            
exit 0
  • 결과
[root@localhost ~]# sh case2.sh
is this centos? (yes / no)
y
Yes, this is centos
  1. read를 통해 answer의 입력 값을 받는다.
  2. yes, y, Y, Yes, YES 중 하나가 입력되면 Yes, this it centos 문장을 출력한다.
  3. [nN]*)은 n이나 N이 들어가는 모든 단어를 모두 입력 값으로 받아들인다는 의미이다.
  4. 두 가지 케이스가 아닌 다른 값이 입력되는 경우 정상적인 종료가 아니므로 exit 1로 종료한다.

관계 연산자

조건문에서는 and, or의 의미를 가진 관계 연산자를 사용할 수 있다. and는 -a 또는 &&를 사용하며, or는 -o 또는 ||을 사용한다. -a, -o는 테스트문인 ([])안에서 사용가능하지만 괄호 등의 특수문자 앞에는 ()를 붙여줘야 한다.

  • 예시
#!/bin/sh
echo "filenmae"
read fname
if [ -f $fname ] && [ -s $fname ]
then    
        head -3 $fname
else    
        echo "there is not exist or size is 0MB"
fi      
exit 0
  • 결과
[root@localhost ~]# sh andor.sh
filenmae
/var/www/html/index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <!--
profile
아침엔 운동하고 밤엔 잠을 잔다.

0개의 댓글