[shell script] 다양한 if-then 구문

HYEOB KIM·2022년 4월 13일
0

Shell

목록 보기
8/71

스크립트에서 사용하는 조건문에는 if-then 구문이 있습니다.

스크립트에서 사용하는 if-then 구문은 아래와 같은 형식으로 작성합니다.

if command
then
	commands
else
	commands
fi

작동 방식은 다음과 같습니다.

if 뒤에 오는 명령문(command)을 실행하고, 명령문의 종료 상태를 반환합니다.
종료 상태가 0이면 then 뒤의 명령어들(commands)을 실행하고,
종료 상태가 0이 아니면, else 뒤의 명령어들(commands)을 실행합니다.

예를 들어, 아래와 같이 스크립트를 작성해보고 결과를 출력해봅시다.

$ cat test1
#!/bin/bash
if notCommand
then
        echo "worked"
        ls
else
        echo "not worked"
        mount | tail -5
fi

$ ./test1
./test1: line 2: notCommand: command not found
not worked
/var/lib/snapd/snaps/snapd_15177.snap on /snap/snapd/15177 type squashfs (ro,nodev,relatime,x-gdu.hide)
/var/lib/snapd/snaps/core18_2284.snap on /snap/core18/2284 type squashfs (ro,nodev,relatime,x-gdu.hide)
tmpfs on /run/snapd/ns type tmpfs (rw,nosuid,nodev,noexec,relatime,size=402604k,mode=755)
nsfs on /run/snapd/ns/lxd.mnt type nsfs (rw)
tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=402600k,mode=700,uid=1000,gid=1000)

if 뒤에 notCommand라는 없는 명령어가 실행되었습니다.
따라서, 명령 결과 종료 상태는 127을 반환할 것입니다.
종료 상태가 0이 아니기 때문에 else 뒤의 명령어들을 실행하는 모습을 볼 수 있습니다.

else를 쓰지 않은 구문

단순히 else를 쓰지 않는 if-then을 작성할 수도 있습니다.

if 뒤의 명령이 종료 상태를 0으로 반환하지 않으면 if-then의 명령어들을 아예 실행되지 않고 넘어가게 됩니다.

$ cat test1
#!/bin/bash
user=notUser
if grep $user /etc/passwd
then
        echo "worked"
        ls
fi

$ ./test1
$

/etc/passwd는 사용자 목록을 나타냅니다. user 변수에 있는 사용자가 사용자 목록에 있으면 해당 명령은 종료 상태 0을 반환할 것입니다.

user 변수에 해당하는 사용자가 목록에 존재하지 않으므로 then 뒤의 명령어들은 실행되지 않고 넘어가므로, 스크립트 파일을 실행했을 때 아무 결과도 출력되지 않습니다.

간단한 실습

if-then을 이용해서 간단하게 user 변수에 할당된 사용자가 사용자 목록에 존재한다면, 해당 사용자의 홈 디렉토리에 있는 bash 파일 목록을 불러오는 스크립트를 작성해보겠습니다.

$ cat test1
#!/bin/bash
user=hyeob
if grep $user /etc/passwd
then
        echo "bash files for $user: "
        ls -a /home/$user/.b*
else
        echo "$user doesn't exist on this system"
fi

$ ./test1
hyeob:x:1000:1000:hyeob:/home/hyeob:/bin/bash
bash files for hyeob:
/home/hyeob/.bash_history  /home/hyeob/.bash_logout  /home/hyeob/.bashrc

.b*은 정규표현식이 사용된 예로 *는 없는 문자를 포함한 모든 길이의 아무 문자를 의미합니다(즉, .bash, .ba, .busii 등의 .b로 시작하는 모든 문자열을 의미하게 됩니다).

if-elif-else

else-if 구문에 대해서는 아래와 같이 작성할 수 있습니다.

if command1
then
	commands
elif command2
then
	commands
elif command3
then
	commands
fi

예를 들어, 특정 숫자가 어떤 범위에 속할 때 해당 명령을 실행하게 하도록 스크립트를 작성해 봅시다.

$ cat test1
#!/bin/bash
num=51
if [ $num -gt 60 ]
then
        echo "$num is greater than 60 "
elif [ $num -gt 50 ]
then
        echo "$num is greater than 50"
else
        echo "$num is less than 49"
fi

$ ./test1
51 is greater than 50

해당 스크립트에는 비교연산자가 사용되었습니다.
비교연산자를 이용할 때 조건문은 [ 조건문 ]으로 작성합니다.

  • -eq : 같다
  • -ne : 같지 않다
  • -ge : 이상
  • -gt : 초과
  • -le : 이하
  • -lt : 미만

비교연산자를 이용할 때는 반드시 대괄호와 조건문 사이에 빈 칸이 있어야 합니다.

if 속의 if

위의 if-elif-else 구문은 if 속의 if문으로 작성할 수도 있습니다.

$ cat test1
#!/bin/bash
num=51
if [ $num -gt 60 ]
then
        echo "$num is greater than 60 "
else
        if [ $num -gt 50 ]
        then
                echo "$num is greater than 50"
        else
                echo "$num is less than 49"
        fi
fi

$ ./test1
51 is greater than 50
profile
Devops Engineer

0개의 댓글