스크립트에서 사용하는 조건문에는 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를 쓰지 않는 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로 시작하는 모든 문자열을 의미하게 됩니다).
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-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