案例应用:
判断已用磁盘空间是否大于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 易错总结
- 测试文件是否存在时,建议使用-e。如:[ -e /etc/passwd ]
- root用户的读取和写入权限,不受文件的基本权限控制;但执行权限受文件基本权限控制。
- 测试软链接时,目录名称后面不要加"/",不然会被判断为目录文件。如:[ -L /bin ]
- 使用-z或-n测试变量时,变量需要加引号,避免有歧义而导致判断结果有误。如:[ -n "$empty" ]