Linux shell 使用if选择结构

本案例要求编写3个Shell脚本。一是检测/media/cdrom目录,不存在则创建;二是检测指定主机是否可ping通;三是从键盘读取分数判断成绩分档。介绍了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;而ping测试失败时,?的值为0;而ping测试失败时,?0ping?的值不为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 ] && [ $FS -le 100 ] ; then
    echo "$FS 分!优秀"
elif [ $FS -ge 70 ] && [ $FS -le 84 ] ; then
    echo "$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 分!优秀
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值