" 目录:RHCA+ -> 5 Shell脚本 -> 10 if判断 "

让脚本根据不同条件自动执行不同的命令
条件判断可使用\[\]测试,也可用test命令
命令序列中可以有一条命令,也可以有多条命令;表示命令的集合
if和then在同一行时,then前一定要加;;例:if 条件; then
条件:
命令的执行结果:` `和$()包含命令,判断的就是执行结果;通过执行结果判断
命令的执行状态:直接输入命令(ls等),判断的就是执行状态(是否执行成功),执行结果被忽略;判断语句都可直接接受执行状态作为判断条件
1、单分支结构
|--------------------|--------------------|
| 语法格式 | 作用 |
| if 条件 then 命令序列 fi | 如果条件判断成功,则执行,否则不执行 |
root@wuzuniao \~# vim 1.sh #判断/root/1目录是否存在,若不存在则创建此目录,否则退出判断语句
#!/bin/bash
DIR="/root/1"
if ! -d $DIR
then
mkdir -p $DIR
fi
root@wuzuniao \~# bash 1.sh #执行脚本不会有输出信息,因为命令序列里面没有输出提示命令
root@wuzuniao \~# ls -ld /root/1 #使用ls命令验证/root/1目录已经成功创建
drwxr-xr-x. 2 root root 6 Feb 20 23:59 /root/1
root@wuzuniao \~# vim 1.sh #判断当前用户uid是否为0,如果为0输出root
#!/bin/bash
if "$(id -u)" -eq "0" ; then
echo "root";
fi
root@wuzuniao \~# bash 1.sh #执行脚本验证成功
root
root@wuzuniao \~#
2、双分支结构
|--------------------------------|-----------------------------|
| 语法格式 | 作用 |
| if 条件 then 命令序列1 else 命令序列2 fi | 如果条件判断成功,则执行命令序列1,否则执行命令序列2 |
root@wuzuniao \~# vim 2.sh #验证主机是否在线
#!/bin/bash
ping -c 3 -i 0.2 -W 3 1 \&\> /dev/null #1表示输入的第一个参数,将结果重定向到/dev/null,避免一直回显;-c指定只ping三次,-i指定包发送间隔,-W指定包等待超时时间
if $? -eq 0 #判断上条语句是否执行成功,成功则$?变量会为0,失败为非零整值
then
echo "Host $1 is On-line."
else
echo "Host $1 is Off-line."
fi
root@wuzuniao \~# bash 2.sh #不输入参数时$1为空,主机不在线
Host is Off-line.
root@wuzuniao \~# bash 2.sh 192.168.1.1 #输入一个在线ip时,可以看到能ping通
Host 192.168.1.1 is On-line.
root@wuzuniao \~#
3、多分支结构
多分支场景下,elif可以有任意个
|---------------------------------------------------------------|-------------------------------------------------------------------------------------|
| 语法格式 | 作用 |
| if 条件1 then 命令序列1 elif 条件2 命令序列2 elif 条件3 命令序列3 else 命令序列4 fi | 如果条件1判断成功,则执行命令序列1; 否则判断条件2,若条件2判断成功,则执行命令序列2; 否则判断条件3,若条件3判断成功,则执行命令序列3; 否则执行命令序列4 |
root@wuzuniao \~# vim 3.sh #输入分数大于等于85分且小于等于100分时,输出Excellent;不满足条件时,继续判断分数是否大于等于70分且小于等于84分,匹配成功时,输出Pass;都匹配失败时,输出Fail
#!/bin/bash
read -p "Enter your score(0-100):" GRADE #把接收到的用户输入信息赋值给后面的指定变量GRADE;read可读取用户输入信息,-p用来指定提示信息
if $GRADE -ge 85 && $GRADE -le 100 ; then
echo "$GRADE is Excellent"
elif $GRADE -ge 70 && $GRADE -le 84 ; then
echo "$GRADE is Pass"
else
echo "$GRADE is Fail"
fi
root@wuzuniao \~# bash 3.sh
Enter your score(0-100):90
90 is Excellent
root@wuzuniao \~# bash 3.sh
Enter your score(0-100):75
75 is Pass
root@wuzuniao \~# bash 3.sh
Enter your score(0-100):2
2 is Fail
root@wuzuniao \~# bash 3.sh
Enter your score(0-100):101 #没匹配到预设判断条件时,会执行最后语句
101 is Fail
root@wuzuniao \~#