if条件测试语句
if条件语句可以让脚本根据实际情况的不同而自动切换命令执行方案,从技术角度上来说分为单分支结构、双分支结构、多分支结构,复杂度随着灵活度一起逐级上升。详情请关注《linux就该这么学》。
操作方法
- 01
单分支的if条件语句结构,这种结构仅用if、then、fi关键词组成,只在条件成立后才执行预设命令,相当于口语的“如果……那么……”,属于最简单的一种条件判断结构,操作语法如图所示: 使用单分支的if条件语句来判断某个目录是否存在,若已经存在就结束条件判断和整个Shell脚本,而如果不存在则去创建这个目录: [root@linuxprobe ~]# vim mkcdrom.sh #!/bin/bash DIR="/media/cdrom" if [ ! -e $DIR ] then mkdir -p $DIR fi 因为第5章才会去学习用户身份与权限,此时继续直接用“bash 脚本名称”的方式来执行脚本即可,顺利执行脚本文件后正常情况下是没有任何输出信息的,咱们可以使用ls命令验证下这个目录是否已经成功创建: [root@linuxprobe ~]# bash mkcdrom.sh [root@linuxprobe ~]# ls -d /media/cdrom /media/cdrom
- 02
双分支的if条件语句结构,这种结构仅用if、then、else、fi关键词组成,进行两次条件判断匹配,两次判断中任何一项匹配成功后都会执行预设命令,相当于口语的“如果……那么……或者……那么……”,也是属于很简单的一种条件判断结构,操作语法如图所示: 使用双分支的if条件语句来验证某个主机是否在线,然后根据判断执行返回值结果分别给予对方主机是在线还是不在线的提示信息。脚本中我主要是使用ping命令来测试与对方主机的网络联通性,而linux系统中的ping命令不像windows系统一样仅会尝试四次就结束,因此为了避免用户等待时间过长,而通过-c参数来规定尝试的次数,-i参数定义每个数据包的发送间隔时间以及-W参数定义最长的等待超时时间。 [root@linuxprobe ~]# vim chkhost.sh #! /bin/bash ping -c 3 -i 0.2 -W 3 $1 &> /dev/null if [ $? -eq 0 ] then echo "Host $1 is On-line." else echo "Host $1 is Off-line." fi
- 03
咱们在4.2.3小节中用过$?变量,作用是显示上一次命令的执行返回结果,若上一条语句是顺利执行成功的则会返回数字0,而若上一条语句执行是失败的则返回一个非零的数字(随系统版本差异可能会是1或者2都有可能),因此可以通过用数字条件测试的方法判断$?变量是否等于零来获知上一条语句的最终判断情况,192.168.10.10是服务器本机地址,验证下脚本的效果吧: [root@linuxprobe ~]# bash chkhost.sh 192.168.10.10 Host 192.168.10.10 is On-line. [root@linuxprobe ~]# bash chkhost.sh 192.168.10.20 Host 192.168.10.20 is Off-line.
- 04
多分支的if条件语句结构,这种结构需要使用if、then、else、elif、fi关键词组成,进行多次条件判断匹配,多次判断中任何一项匹配成功后都会执行预设命令,相当于口语的“如果……那么……如果……那么……N次等等”,这是一种工作中最常使用的条件判断结构,虽然相对复杂但更加灵活,操作语法如图所示: 使用多分支的if条件语句来判断用户输入的分数在那个成绩区间内,然后输出如优秀、合格、不合格等提示信息。read是用来读取用户输入信息的命令,它能够把接收到的用户输入信息赋值给后面的指定变量,而-p参数则是给予了用户一定的提示信息。下面实例中判断用户输入的分数是否同时具备大于等于85分且小于等于100分,这样的话才输出Excellent字样,若上一条件没有匹配成功则继续判断用户输入分数是否大于等于70分且小于等于84分,这样的话输出Pass字样,如果两次都落空没有匹配成功,则最终输出Fail字样: [root@linuxprobe ~]# vim chkscore.sh #!/bin/bash read -p "Enter your score(0-100):" GRADE 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@linuxprobe ~]# bash chkscore.sh Enter your score(0-100):88 88 is Excellent [root@linuxprobe ~]# bash chkscore.sh Enter your score(0-100):80 80 is Pass 如果用户输入的分数并没有满足第一项匹配条件,则会自动进行下面的匹配流程: [root@linuxprobe ~]# bash chkscore.sh Enter your score(0-100):30 30 is Fail [root@linuxprobe ~]# bash chkscore.sh Enter your score(0-100):200 200 is Fail