shell编程之条件语句(条件测试、if语句、case语句)(下)

简介: 要使Shell脚本程序具备一定的“智能”,面临的第一个问题就是如何区分不同的情况以确定执行何种操作。Shell环境根据命令执行后的返回状态值($?)来判断是否执行成功,当返回值为0时表示成功,否则(非0值)表示失败或异常。使用专门的测试工具——test命令,可以对特定条件进行测试,并根据返回值来判断条件是否成立(返回值为0表示条件成立)。使用test测试命令时,有以下两种形式:


案例应用:

判断已用磁盘空间是否大于80%,如果是就报警提示。

# 使用df命令可以查看磁盘空间使用和剩余情况
 [root@yuji ~]# df
 文件系统                   1K-块    已用     可用 已用% 挂载点
 /dev/mapper/centos-root 17811456 5063256 12748200   29% /
 devtmpfs                  483928       0   483928    0% /dev
 tmpfs                     499848       0   499848    0% /dev/shm
 tmpfs                     499848    7264   492584    2% /run
 tmpfs                     499848       0   499848    0% /sys/fs/cgroup
 /dev/sda1                1038336  182372   855964   18% /boot
 tmpfs                      99972      12    99960    1% /run/user/42
 tmpfs                      99972       0    99972    0% /run/user/0
 [root@yuji ~]# df |grep /dev/mapper/centos-root
 /dev/mapper/centos-root 17811456 5063288 12748168   29% /
 [root@yuji ~]# df |grep /dev/mapper/centos-root |awk '{print $5}'
 29%
 [root@yuji ~]# df |grep /dev/mapper/centos-root |awk '{print $5}' |awk -F '%' '{print $1}'
 29
 # 编写脚本
 [root@yuji ~]# vim diskused.sh
 #!/bin/bash
 # 判断已用磁盘空间是否大于80%,如果是则报警提示。
 used=$(df |grep /dev/mapper/centos-root |awk '{print $5}' |awk -F '%' '{print $1}')
 if [ $used -gt 80 ]
 then
    echo "警告!当前 /目录的磁盘使用率为 ${used}%"
 fi
复制代码


网络异常,图片无法展示
|


网络异常,图片无法展示
|


测试脚本:

可以先将判断条件修改为大于20%,测试脚本是否生效。


网络异常,图片无法展示
|

2.2 if 双分支结构

双分支语句格式:

if 判断条件
 then
     条件成立的分支代码
 else
     条件不成立的分支代码
 fi
复制代码


网络异常,图片无法展示
|


案例应用:

检测80端口是否在监听,如果是,则提示”网站服务已在运行“;如果否,则启动httpd服务。

# 写脚本
 [root@yuji ~]# vim httpd80.sh
 #!/bin/bash
 # 检测80端口是否在监听,如果是,则提示”网站服务已在运行“;如果否,则启动httpd服务。
 netstat -ntap | grep :80 &> /dev/null
 if [ $? -eq 0 ]
 then
     echo "网站服务已在运行"
 else
     if rpm -q httpd &> /dev/null
     then
         echo "正在启动httpd服务"
         systemctl start httpd
     else
         echo "正在安装并启动httpd服务"
         yum install httpd -y &> /dev/null
         systemctl start httpd &> /dev/null
    fi
 fi
 # 执行脚本
 [root@yuji ~]# bash httpd80.sh       //检测到未安装httpd服务,自动安装
 正在安装并启动httpd服务
 [root@yuji ~]# rpm -q httpd          //查看软件包是否安装,已安装
 httpd-2.4.6-97.el7.centos.5.x86_64
 [root@yuji ~]# bash httpd80.sh      //httpd服务已运行
 网站服务已在运行
复制代码


网络异常,图片无法展示
|


网络异常,图片无法展示
|


2.3 if 多分支结构

多分支语句格式:

if 判断条件1
 then
     条件1为真的分支代码
 elif 判断条件2
 then
     条件2为真的分支代码
 elif 判断条件3
 then
     条件3为真的分支代码
 ...
 else
     以上条件都为假的分支代码
 fi
复制代码


网络异常,图片无法展示
|


案例应用:

查看当前时间点,根据不同时间范围输出不同问候语。

  • 6点-10点,输出早上好;
  • 11点-13点,输出中午好;
  • 14点-18点,输出下午好;
  • 19点-22点, 输出晚上好;
  • 其他时间,休息时间。
[root@yuji ~]# date          //查看当前详细时间
 2022年 04月 10日 星期日 15:01:25 CST
 [root@yuji ~]# date +%H      //查看当前时间在哪个小时(范围0-23)
 15
 [root@yuji ~]# vim date.sh     //写脚本
 #!/bin/bash
 # 查看当前时间点,根据不同时间范围输出不同问候语。
 h=$(date +%H)
 if [ $h -ge 6 -a $h -le 10 ]
 then
     echo "早上好"
 elif [ $h -ge 11 -a $h -le 13 ]
 then
     echo "中午好"
 elif [ $h -ge 14 -a $h -le 18 ]
 then
     echo "下午好"
 elif [ $h -ge 19 -a $h -le 22 ]
 then
     echo "晚上好"
 else
     echo "休息时间"
 fi
 [root@yuji ~]# bash date.sh      //执行脚本
 下午好
复制代码


网络异常,图片无法展示
|


网络异常,图片无法展示
|


3 case语句


格式:

case 变量引用 in
 模式1)
     命令分支1
     ;;
 模式2)
     命令分支2
     ;;
 ...
 *)
     默认命令分支
 esac
复制代码


注意事项:

case支持glob风格的通配符:
 * :任意长度任意字符
 ? :任意单个字符
 [0-9] :指定范围内的任意单个字符
 | :“或者”的意思,如: a|b
复制代码


案例应用:

提示用户输入分数(0-100),判断分数范围,分出优秀、良好、及格、不及格四档。如果用户输入的分数值不在0-100之间,则提示重新输入。

# 写脚本
 [root@localhost ~]# vim gradediv.sh
 #!/bin/bash
 #提示用户输入分数(0-100),判断分数范围,分出优秀、良好、及格、不及格四档。
 #如果用户输入的分数值不在0-100之间,则提示重新输入。
 read -p "请输入你的分数(0-100):" grade
 case $grade in
 100)
     echo "你很优秀"
     ;;
 [89][0-9])
     echo "你表现良好"
     ;;
 [67][0-9])
     echo "你及格了"
     ;;
 [0-9]|[1-5][0-9])
     echo "你不及格"
     ;;
 *)
     echo "输入有误,请重新输入0-100"
     bash $0
 esac
 # 执行脚本
 [root@localhost ~]# bash gradediv.sh
 请输入你的分数(0-100):0
 你不及格
 [root@localhost ~]# bash gradediv.sh
 请输入你的分数(0-100):33
 你不及格
 [root@localhost ~]# bash gradediv.sh
 请输入你的分数(0-100):67
 你及格了
 [root@localhost ~]# bash gradediv.sh
 请输入你的分数(0-100):92
 你表现良好
 [root@localhost ~]# bash gradediv.sh
 请输入你的分数(0-100):100
 你很优秀
 [root@localhost ~]# bash gradediv.sh
 请输入你的分数(0-100):300
 输入有误,请重新输入0-100
 请输入你的分数(0-100):85
 你表现良好
复制代码


网络异常,图片无法展示
|


网络异常,图片无法展示
|


4 易错总结


  1. 测试文件是否存在时,建议使用-e。如:[ -e /etc/passwd ]
  2. root用户的读取和写入权限,不受文件的基本权限控制;但执行权限受文件基本权限控制。
  3. 测试软链接时,目录名称后面不要加"/",不然会被判断为目录文件。如:[ -L /bin ]
  4. 使用-z或-n测试变量时,变量需要加引号,避免有歧义而导致判断结果有误。如:[ -n "$empty" ]
相关文章
|
2月前
|
Python
Python中 If语句条件测试
Python中 If语句条件测试
21 1
|
2月前
|
网络协议 Shell Linux
【Shell 命令集合 网络通讯 】⭐⭐⭐Linux 测试与目标主机之间的网络连接ping 命令 使用指南
【Shell 命令集合 网络通讯 】⭐⭐⭐Linux 测试与目标主机之间的网络连接ping 命令 使用指南
43 1
|
5月前
|
测试技术 Shell
shell脚本写的班级管理系统测试用例
shell脚本写的班级管理系统测试用例
58 1
|
22天前
|
Shell
shell学习(六) 【case多条件分支语句】
shell学习(六) 【case多条件分支语句】
13 1
|
3月前
|
Shell
Shell脚本中的`case`语句
Shell脚本中的`case`语句
34 5
|
4月前
|
Shell Windows Perl
Shell编程自动化之数学运算与条件测试
本文主要介绍了Shell编程自动化之数学运算与条件测试,并结合实例测试。
25 0
|
5月前
|
Oracle 关系型数据库 大数据
助力工业物联网,工业大数据之服务域:Shell调度测试【三十三】
助力工业物联网,工业大数据之服务域:Shell调度测试【三十三】
20 1
|
5月前
|
关系型数据库 MySQL Shell
MySQL【实践 01】Linux 环境 MySQL 数据库备份 shell 脚本(脚本源码及说明+定时任务配置+数据库恢复测试)粘贴可以
MySQL【实践 01】Linux 环境 MySQL 数据库备份 shell 脚本(脚本源码及说明+定时任务配置+数据库恢复测试)粘贴可以
52 0
|
5月前
|
Shell Linux iOS开发
Shell的`case`语句
Shell的`case`语句
26 2
|
5月前
|
Shell 5G
Shell脚本创建指定大小文件的测试数据
Shell脚本创建指定大小文件的测试数据
35 0