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 문에 이어서 참인 경우와 거짓인 경우를 구분하여 실행한다.
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는 맨 위부터-[숫자]의 [숫자]행 만큼 파일의 내용을 출력하라는 의미이다.
if 문의 단점은 참과 거짓을 판단하는 이분화된 경우에서 사용할 수 있다는 것이다. 만약 여러가지 경우의 수가 있다면 다중으로 if 문을 사용하는 방법이 있지만 구문이 복잡해지는 것을 막기위해 case 문을 사용하여 경우의 수만큼 분류 할 수 있다.
#!/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~~
- 스크립트에서 명시한 첫 번째 파라미터 변수의 값에 따라 출력되는 문자열이 다르다.
- 명시한 케이스 중 start, stop, restart를 제외한 모든 경우는
not identifiable~~을 출력한다.- 주의할 점은 맨 뒤에 세미콜론은 두개 붙여서 작성해야한다.
#!/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
- read를 통해 answer의 입력 값을 받는다.
- yes, y, Y, Yes, YES 중 하나가 입력되면
Yes, this it centos문장을 출력한다.[nN]*)은 n이나 N이 들어가는 모든 단어를 모두 입력 값으로 받아들인다는 의미이다.- 두 가지 케이스가 아닌 다른 값이 입력되는 경우 정상적인 종료가 아니므로
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">
<!--