文章目录
前言
在基础简单的Shell脚本程序中,各种不同命令语句按照先后顺序依次执行,从而实现批处理的自动化过程。但是,单一的顺序结构使得脚本过于机械化,不够“智能”,难以处理更加灵活的系统任务。通过学习了解,Shell编程中的if条件语句和可循环,分支的case语句可以轻松灵活的完成复杂,管理任务。
一 条件测试操作
1,1 test命令
测试表达式是否成立,若成立返回0,否则返回其它数值
格式1:test 条件表达式
格式2:[ 条件表达式 ] (至少应有一个空格)
[root@server2 ~]# touch aa
[root@server2 ~]# ls -lh
[root@server2 ~]# test -f aa
[root@server2 ~]# echo $?
0 返回0表示条件成立
[root@server2 ~]# test -d aa
[root@server2 ~]# echo $?
1 返回1表示条件不成立
[root@server2 ~]# [ -f aa ]
[root@server2 ~]# echo $?
0
1.2 文件测试
[ 操作符 文件或目录 ]
1.2.1 常用的测试操作符
-d :测试是否为目录(Directory)
-e :测试目录或文件是否存在(Exist)
-f : 测试是否为文件(File)
-r : 测试当前用户是否有权限读取(Read)
-w :测试当前用户是否有权限写入 (Write)
-x :测试当前用户是否有权限执行 (eXcute)
[root@server2 ~]# [ -d aa ]
[root@server2 ~]# echo $?
1
[root@server2 ~]# [ -e aa ]
[root@server2 ~]# echo $?
0
[root@server2 ~]# [ -r aa ]
[root@server2 ~]# echo $?
0
[root@server2 ~]# [ -w aa ]
[root@server2 ~]# echo $?
0
[root@server2 ~]# [ -x aa ]
[root@server2 ~]# echo $?
1
&&:逻辑与,而且意思(做一个条件判断,前面条件成立,才会输出;不成立,就不输出)
[root@server2 ~]# [ -x aa ] && echo "this file has x permission"
[root@server2 ~]# chmod +x aa
[root@server2 ~]# [ -x aa ] && echo "this file has x permission"
this file has x permission
[root@server2 ~]# chmod -x aa
[root@server2 ~]# [ -x aa ] || echo "this file has x permission"
this file has x permission
||:或,一个条件成立即可
1.3 整数值比较
[ 整数1 操作符 整数2 ]
条件判断的前提条件,必须是整数
1.3.1 常用的测试操作符
-eq:等于(Equal)
-ne :不等于 (Not Equal)
-gt:大于 (Greater Than)
-lt:小于(Lesser Than)
-le:小于或等于 (Lesser or Equal)
-ge:大于或等于 (Greater or Equal)
循环条件:20次
i=0 i<=19或i<20
i=1 i<=20或i<21
例如:
[root@server2 ~]# who
[root@server2 ~]# who | wc -l 条件判断先取值
5
[root@server2 ~]# [ $(who | wc -l) -ge 4 ] && echo "too many."
too many. 用户数大于等于4
[root@server2 ~]# [ $(who | wc -l) -lt 4 ] && echo "too many."
[root@server2 ~]# free -m 可用内存容量
total used free shared buff/cache available 可用
Mem: 1823 1229 80 13 513 347
Swap: 3071 28 3043
[root@server2 ~]# free -m | grep Mem:
Mem: 1823 1229 80 13 513 347
[root@server2 ~]# free -m | grep Mem: | awk '{print $7}' 做哪个字段的输出第7位
347
[root@server2 ~]# echo $(free -m | grep Mem: | awk '{print $7}') 首先保证可以输出
346
[root@server2 ~]# [ $(free -m | grep Mem: | awk '{print $7}') -le 1024 ] && echo "内存可用空间:$(free -m | grep Mem: | awk '{print $7}') MB" 内存可用空间是否小于等于1024MB
内存可用空间:346 MB
1.4 字符串比较:
格式1:[ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串2 ]
格式2:[ -z 字符串 ]
1.4.1 常用的测试操作符
=:字符串内容相同
!=:字符串内容不同,!号表示相反的意思
-z:字符串内容为空
[root@server2 ~]# [ 'b' = 'c' ]
[root@server2 ~]# echo $?
1
[root@server2 ~]# [ 'b' = 'c' ] && echo "b不等于c"
[root@server2 ~]# [ 'b' != 'c' ] && echo "b不等于c"
b不等于c
[root@server2 ~]# [ -z '' ] && echo "空的"
空的
[root@server2 ~]# read -p "是否覆盖现有内容?(yes/no)" ack
是否覆盖现有内容?(yes/no)yes
[root@server2 ~]# [ $ack = "yes" ] && echo "覆盖"
覆盖
[root@server2 ~]#
[root@server2 ~]# [ $ack = "no" ] && echo "不覆盖"
[root@server2 ~]# read -p "是否覆盖现有内容?(yes/no)" ack
是否覆盖现有内容?(yes/no)no
[root@server2 ~]# [ $ack = "no" ] && echo "不覆盖"
不覆盖
1.5 逻辑测试
格式1:[ 表达式1 ] 操作符 [ 表达式2 ] …
格式2:命令1 操作符 命令2 …
1.5.1 常用的测试操作符
-a或&&:逻辑与,“而且”的意思
-o或||:逻辑或,“或者”的意思
!:逻辑否
二 if语句
2.1 单分支结构 (单一情况)
if 条件测试操作 if 已用磁盘空间>80%
then 命令序列 then 报警
fi fi
例如:
1.针对目录模拟
[root@server2 ~]# vi mkdir.sh
[root@server2 ~]# chmod +x mkdir.sh
[root@server2 ~]# ./mkdir.sh
[root@server2 ~]# ls -R /a
[root@server2 ~]# cd /
[root@server2 /]# ls -lh
#!/bin/bash 查看目录是否存在,不存在就创建目录
# 创建目录
dir="/a/b" 做判断是否存在
if [ ! -d $dir ]
then mkdir -p $dir
fi
2.针对用户模拟
[root@server2 ~]# echo $USER
root
[root@server2 ~]# su zjq
[zjq@server2 root]$ sudo vi a.sh
[zjq@server2 root]$ sudo chmod +x a.sh
[zjq@server2 root]$ sudo ./a/sh
#!/bin/bash
# 判断当前用户是否为root 查看当前用户是否是root,不是报错
if [ ! “$USER” = “root” ]
then echo "当前用户不是root"
fi
2.2 双分支结构(正反两种情况)
if 条件测试操作 if 80端口是否在监听
then 命令序列1 then 网站服务已在运行
else 命令序列2 else 启动httpd服务
fi fi
1.查看80端口是否开启
[root@server2 ~]# netstat -anpt | grep 80
tcp 0 0 20.0.0.11:22 20.0.0.1:50080 ESTABLISHED 61372/sshd: root@pt
[root@server2 ~]# echo $?
0
[root@server2 ~]# vi s1.sh
[root@server2 ~]# chmod +x s1.sh
[root@server2 ~]# ./s1.sh
#!/bin/bash
# 判断apache是否启动中
netstat -anpt | grep 80
if [ $? = 0 ]
then echo "网络服务正在运行"
else echo "网站服务停止"
fi
2.地址通信查看
[root@server2 ~]# ping 20.0.0.10
[root@server2 ~]# echo $?
0
[root@server2 ~]# ping 20.0.0.15
[root@server2 ~]# echo $?
1
[root@server2 ~]# vi ping.sh
[root@server2 ~]# chmod +x ping.sh
[root@server2 ~]# ./ping.sh 20.0.0.10
20.0.0.10 is up.
[root@server2 ~]# ./ping.sh 20.0.0.15
20.0.0.15 is down.
#!/bin/bash
ping -c 3 $1 &> /dev/null
if [ $? = 0 ]
then echo "$1 is up."
else echo "$1 is down."
fi
3.天气好坏分类
[root@server2 ~]# vi tianqi.sh
[root@server2 ~]# chmod +x tianqi.sh
[root@server2 ~]# ./tianqi.sh
天气天晴
好天气
[root@server2 ~]# ./tianqi.sh
天气阴天
今天可能需要带伞
#!/bin/bash
# 天气
read -p "天气" weather
if [ "$weather" = "天晴" ]
then echo "好天气"
else echo "今天可能需要带伞"
fi
2.3 多分支结构
if 条件测试操作1 if 分数为85-100之间
then 命令序列1 then 判为优秀
elif 条件测试操作2 elif的 分数为70-84之间
then 命令序列2 then 发 then 判为合格
else esle
命令序列3 判为不合格
fi fi
1.成绩查询
[root@server2 ~]# vi grade.sh
[root@server2 ~]# chmod +x grade.sh
[root@server2 ~]# ./grade.sh
#!/bin/bash
# 成绩判断
read -p "您的成绩为:" grade
if [ $grade -gt 100 ] || [ $grade -lt 0 ]
then echo "输入错误,请重新输入0-100之间的数值"
elif [ $grade -ge 85 ] && [ $grade -le 100 ]
then echo "优秀!!!"
elif [ $grade -ge 70 ] && [ $grade -le 84 ]
then echo "良好!!!"
elif [ $grade -ge 60 ] && [ $grade -le 69 ]
then echo "合格!!!"
else echo "不合格!!!"
fi
2.3.1提取性能监控指标项目(磁盘占用,CPU使用,内存使用)
1,磁盘占用情况
[root@server2 ~]# df -Th
[root@server2 ~]# df -Th | grep "/$"
[root@server2 ~]# df -Th | grep "/$" | awk '{print $6}'
[root@server2 ~]# df -Th | grep "/$" | awk '{print $6}' | awk -F% '{print $1}'
[root@server2 ~]# disk=$( df -Th | grep "/$" | awk '{print $6}' | awk -F% '{print $1}')
[root@server2 ~]# [ $disk -gt 10 ] && echo "too less."
[root@server2 ~]# [ $disk -lt 10 ] && echo "too less."
2,内存占用情况
[root@server2 ~]# free
[root@server2 ~]# free | grep "Mem:" | awk '{print $3}'
[root@server2 ~]# free | grep "Mem:" | awk '{print $2}'
[root@server2 ~]# expr $(free | grep "Mem:" | awk '{print $3}') / $(free | grep "Mem:" | awk '{print $2}')
[root@server2 ~]# expr $(free | grep "Mem:" | awk '{print $3}') \* 100 / $(free | grep "Mem:" | awk '{print $2}')
[root@server2 ~]# echo $(expr $(free | grep "Mem:" | awk '{print $3}') \* 100 / $(free | grep "Mem:" | awk '{print $2}'))
[root@server2 ~]# mem=$(expr $(free | grep "Mem:" | awk '{print $3}') \* 100 / $(free | grep "Mem:" | awk '{print $2}'))
3,CPU占用率
[root@server2 ~]# mpstat
[root@server2 ~]# mpstat | tail -1 | awk '{print $12}'
[root@server2 ~]# mpstat | tail -1 | awk '{print $12}' | awk -F. '{print $1}'
[root@server2 ~]# expr 100 - $( mpstat | tail -1 | awk '{print $12}' | awk -F. '{print $1}')
4.准备配置数据
disk=
(
d
f
−
T
h
∣
g
r
e
p
"
/
( df -Th | grep "/
(df−Th∣grep"/" | awk ‘{print $6}’ | awk -F% '{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 1}̲') mem=(expr $(free | grep “Mem:” | awk ‘{print $3}’) * 100 / $(free | grep “Mem:” | awk '{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 2}̲')) cpu=(expr 100 - $( mpstat | tail -1 | awk ‘{print $12}’ | awk -F. ‘{print $1}’))
if [ $disk -ge 85 ] then echo “磁盘占有率超过85%”
if [ $mem -ge 90 ] then echo “内存占有率超过90%”
if [ $cpu -ge 90 ] then echo “cpu占有率超过90%”
5.发送报警邮件
[root@server2 ~]# rpm -qa mailx 查看是否安装程序
[root@server2 ~]# vi /etc/mail.rc 配置文件
[root@server2 ~]# echo "123456" | mail -s "test" 1609325444@qq.com
发送邮件,内容:123456
set from=1609325444@qq.com 发送邮箱地址
set smtp=smtp.qq.com 邮箱使用的smtp服务器的域名
set smtp-auth-user=1609325444@qq.com smtp邮件发送时登录的账号
set smtp-auth-password=........ 授权码
set smtp-auth=login smtp的状态,登录状态
6.查看是否可以上网,发送邮件
登录邮箱查看邮件
三 case语句结构
3.1 case多分支结构
case 变量值 in case 分数 in
模式1) 85-100)
命令序列1 判为优秀
;; ; ;
模式2) 70-84)
命令序列2 判为合格
; ; ; ;
… …
*) *)
默认命令序列 判为不合格
esac esac
3.2 case语句应用示例
case多分支语句
froot@localhost #cathitkey.sh
#!/bin/bash
read -p "请输入-个字符,并按Enter键确认:" KEY
case "$KEY" in
[a-z][A-Z]) 匹配任意字母
echo "您输入的是字母."
;;
[0-9]) 匹配任意数字
echo "您输入的是数字."
;;
*) 匹配任意字符
echo "您输入的是空格、功能键或其他控制字符. "
esac
[root@server2 ~]# vi case.sh
[root@server2 ~]# chmod +x case.sh
[root@server2 ~]# ./case.sh
#!/bin/bash
# 判断输入的字符是哪种类型
read -p "请输入一个字符并按enter回车确认" key
case "$key" in
[a-z]|[A-Z]) 匹配任意字母
echo "您输入的是字母."
;;
[0-9]) 匹配任意数字
echo "您输入的是数字."
;;
*) 匹配任意字符
echo "您输入的是空格,功能键,其它控制字符."
exit 1
esac
成绩分类判断
[root@server2 ~]# vi case2.sh
[root@server2 ~]# chmod +x case2.sh
[root@server2 ~]# ./case2.sh
#!/bin/bash
# 成绩输入判断
read -p "成绩:" b
case "$b" in
100)
echo "满分"
;;
9[0-9])
echo "优秀"
;;
8[0-9])
echo "良"
;;
7[0-9])
echo "良好"
;;
6[0-9])
echo "合格"
;;
*)
echo "不及格"
esac
总结
通过以上的学习了解,通过if语句可以使Shell脚本具有一定的“判断”能力,可以根据不同的条件来完成不同的管理任务,同样case语句的分支也更加进一步的可以完成更加复杂的工作任务。