3.使用if选择结构 问题 本案例要求编写3个Shell脚本,分别实现以下目标: 检测/media/cdrom目录,若不存在则创建 检测并判断指定的主机是否可ping通 从键盘读取一个分数,判断成绩分档(优秀、良好、不合格) 方案 if单分支的语法组成: if 条件测试 then 命令序列 fi if双分支的语法组成: if 条件测试 then 命令序列1 else 命令序列2 fi if多分支的语法组成: if 条件测试1 then 命令序列1 elif 条件测试2 then 命令序列2 else 命令序列n fi if多分支结构实际上相当于多层if嵌套: if 条件测试1 ; then 命令序列1 else if 条件测试2 ; then 命令序列2 else … … 命令序列n fi fi 步骤 实现此案例需要按照如下步骤进行。 步骤一:检测/media/cdrom目录,若不存在则创建 1)分析任务需求 可能需要执行的操作:创建文件夹/media/cdrom。 执行该操作需要满足的条件:/media/cdrom目录经检测后发现不存在。 2)采用if单分支结构整理实现思路 if [ 目录/media/cdrom不存在 ] ; then 创建文件夹/media/cdrom fi 3)根据实现思路编写脚本、替换为相关操作语句 [root@svr5 ~]# vim chkmountdir.sh #!/bin/bash MOUNT_DIR="/media/cdrom/" if [ ! -d $MOUNT_DIR ] then mkdir -p $MOUNT_DIR fi
[root@svr5 ~]# chmod +x chkmountdir.sh //添加可执行权限 4)测试、验证脚本功能 [root@svr5 ~]# ls -ld /media/cdrom //本来没有/media/cdrom目录 ls: /media/cdrom: 没有那个文件或目录 [root@svr5 ~]# ./chkmountdir.sh //执行脚本 [root@svr5 ~]# ls -ld /media/cdrom //再检查已经有了 drwxr-xr-x 2 root root 4096 12-11 15:16 /media/cdrom 有了/media/cdrom文件夹以后,再次执行上述脚本,实际上不做任何有效操作: [root@svr5 ~]# ./chk_bakdir.sh [root@svr5 ~]# 步骤二:检测并判断指定的主机是否可ping通 1)分析任务需求 可能需要执行的操作:操作1,提示up;操作2,提示down。 执行操作1需要满足的条件:经检测后发现目标主机可ping通。 执行操作2需要满足的条件:经检测后发现目标主机不能ping通。 2)采用if双分支结构整理实现思路 if [ 目标主机能ping通 ] ; then 提示“Host … … is up.” else 提示“Host … … is down.” fi 3)根据实现思路编写脚本、替换为相关操作语句 使用ping命令检测目标主机时,人工可直接判断反馈结果,而脚本却不方便。但是当ping测试成功时,执行状态 ? 的 值 为 0 ; 而 p i n g 测 试 失 败 时 , ?的值为0;而ping测试失败时, ?的值为0;而ping测试失败时,?的值不为0。因此在Shell脚本中可以利用这一点来判断ping目标主机的成败。 为了节省ping测试时间,可以只发送3个测试包(-c 3)、缩短发送测试包的间隔秒数(-i 0.2)、等待反馈的超时秒数(-W 3)。比如,检查可ping通的主机: [root@svr5 ~]# ping -c 3 -i 0.2 -W 3 192.168.4.5 PING 192.168.4.5 (192.168.4.5) 56(84) bytes of data. 64 bytes from 192.168.4.5: icmp_seq=1 ttl=64 time=0.131 ms 64 bytes from 192.168.4.5: icmp_seq=2 ttl=64 time=0.076 ms 64 bytes from 192.168.4.5: icmp_seq=3 ttl=64 time=0.073 ms
— 192.168.4.5 ping statistics — 3 packets transmitted, 3 received, 0% packet loss, time 402ms rtt min/avg/max/mdev = 0.073/0.093/0.131/0.027 ms
[root@svr5 ~]# echo $? //执行状态表示成功 0 检查无法ping通的主机: [root@svr5 ~]# ping -c 3 -i 0.2 -W 3 192.168.4.50 PING 192.168.4.50 (192.168.4.50) 56(84) bytes of data. From 192.168.4.55 icmp_seq=1 Destination Host Unreachable From 192.168.4.55 icmp_seq=2 Destination Host Unreachable From 192.168.4.55 icmp_seq=3 Destination Host Unreachable
— 192.168.4.50 ping statistics — 3 packets transmitted, 0 received, +3 errors, 100% packet loss, time 3001ms pipe 3
[root@svr5 ~]# echo $? //执行状态表示失败 1 于是,判断ping检测的执行状态,采用if双分支结构,目标主机的地址可以通过位置变量$1来提供。脚本编写参考如下: [root@svr5 ~]# vim pinghost.sh #!/bin/bash ping -c 3 -i 0.2 -W 3 $1 &> /dev/null if [ $? -eq 0 ] ; then echo “Host $1 is up.” else echo “Host $1 is down.” fi
[root@svr5 ~]# chmod +x pinghost.sh 4)测试、验证脚本功能 [root@svr5 ~]# ./pinghost.sh 192.168.4.5 Host 192.168.4.5 is up. [root@svr5 ~]# ./pinghost.sh 192.168.4.50 Host 192.168.4.50 is down. 步骤三:从键盘读取一个分数,判断成绩分档(优秀、良好、不合格) 1)分析任务需求 从键盘读取分数可以采用read语句实现。 而成绩分档的依据为:85100分为“优秀”、7084分为“合格”、低于70分为“不及格”。可以采用if语句判断分数值的范围,并分为三个分支,分别显示结果。 实现思路如下: if [ 分数在85~100之间 ] ; then echo “… … 分!优秀” elif [ 分数在75~84之间 ] ; then echo “… … 分,合格” else echo “… … 分?不合格” fi 2)根据实现思路编写脚本、替换为相关操作语句 脚本编写参考如下: [root@svr5 ~]# vim gradediv.sh #!/bin/bash read -p “请输入分数(0-100):” FS if [ $FS -ge 85 ] && [ F S − l e 100 ] ; t h e n e c h o " FS -le 100 ] ; then echo " FS−le100];thenecho"FS 分!优秀" elif [ $FS -ge 70 ] && [ F S − l e 84 ] ; t h e n e c h o " FS -le 84 ] ; then echo " FS−le84];thenecho"FS 分,合格" else echo “$FS 分?不合格” fi
[root@svr5 ~]# chmod +x gradediv.sh 3)测试、验证脚本 [root@svr5 ~]# ./gradediv.sh 请输入分数(0-100):74 74 分,合格 [root@svr5 ~]# ./gradediv.sh 请输入分数(0-100):68 68 分?不合格 [root@svr5 ~]# ./gradediv.sh 请输入分数(0-100):87 87 分!优秀