Shell-day04
1. 昨日回顾
1. 批量重命名文件,打包压缩,还原名称。
for
2. 判断字符串的长度,字符串的长度小于3的显示出来
3. 变量的运算 加 减 乘 除 求余 求方 + - * / % ^
4. 整数运算 expr $(()) $[] let
5. 小数运算 bc awk Python
6. 变量运算的案例 计算ps aux 中VSZ的和 RSS的和 实现一个简单计算器脚本
7. 变量的脚本案例 打印系统信息 变量替换的案例 菜单
8. 流程控制语句介绍
单分支 双分支 多分支
if [ 满足条件 ];then
command
fi
if [ 满足条件 ];then
command
else
command
fi
if [ 第一个条件 ];then
command
elif [ 第二个条件 ];then
command
else
command
fi
9. 流程控制语句之文件比较
-e #判断文件或者目录
-f #判断文件
-d #判断目录
-s #判断文件是否为空
-r #读权限
-w #写权限
-x #执行权限
10. 数据库备份场景
[ ! -d $Back_Dir ] && mkdir -p $Back_Dir
==
[ -d $Back_Dir ] || mkdir -p $Back_Dir
==
if [ -d $Back_Dir ];then
echo "目录存在"
else
mkdir -p $Back_Dir
fi
==
if [ ! -d $Back_Dir ];then
mkdir -p $Back_Dir
fi
2. 流程控制语句之整数比较
-eq #等于则条件为真 [ 1 -eq 1 ] 成立 [ 1 -eq 2 ] 不成立
-ne #不等于则条件为真 [ 1 -ne 2 ] 成立 [ 1 -ne 1 ] 不成立
-gt #大于则条件为真 [ 2 -gt 1 ] 成立 [ 1 -gt 2 ] 不成立
-lt #小于则条件为真 [ 1 -lt 2 ] 成立 [ 2 -lt 1 ] 不成立
-ge #大于等于则条件为真 [ 2 -ge 2 ] 成立 [ 2 -ge 3 ] 不成立
-le #小于等于则条件为真 [ 2 -le 2 ] 成立 [ 2 -le 1 ] 不成立
[root@shell /service/scripts/day04]# [ 1 -eq 2 ] && echo "成立" || echo "不成立"
不成立
[root@shell /service/scripts/day04]# [ 2 -eq 2 ] && echo "成立" || echo "不成立"
成立
[root@shell /service/scripts/day04]# [ 2 -ne 2 ] && echo "成立" || echo "不成立"
不成立
[root@shell /service/scripts/day04]# [ 3 -ne 2 ] && echo "成立" || echo "不成立"
成立
[root@shell /service/scripts/day04]# [ 3 -gt 2 ] && echo "成立" || echo "不成立"
成立
[root@shell /service/scripts/day04]# [ 1 -gt 2 ] && echo "成立" || echo "不成立"
不成立
[root@shell /service/scripts/day04]# [ 1 -lt 2 ] && echo "成立" || echo "不成立"
成立
[root@shell /service/scripts/day04]# [ 2 -lt 2 ] && echo "成立" || echo "不成立"
不成立
[root@shell /service/scripts/day04]# [ 2 -ge 2 ] && echo "成立" || echo "不成立"
成立
[root@shell /service/scripts/day04]# [ 1 -ge 2 ] && echo "成立" || echo "不成立"
不成立
[root@shell /service/scripts/day04]# [ 1 -le 2 ] && echo "成立" || echo "不成立"
成立
[root@shell /service/scripts/day04]# [ 3 -le 2 ] && echo "成立" || echo "不成立"
不成立
#取反 !
[root@shell /service/scripts/day04]# [ ! 3 -le 2 ] && echo "成立" || echo "不成立"
成立
#比较两个数字的大小
[root@shell /service/scripts/day04]# cat if-1.sh
#!/bin/bash
read -p "请输入第一个比较的数字:" Num1
read -p "请输入第二个比较的数字:" Num2
if [ $Num1 -gt $Num2 ];then
echo "$Num1 > $Num2"
elif [ $Num1 -lt $Num2 ];then
echo "$Num1 < $Num2"
else
echo "$Num1 = $Num2"
fi
[root@shell /service/scripts/day04]# sh if-1.sh
请输入第一个比较的数字:1
请输入第二个比较的数字:2
1 < 2
[root@shell /service/scripts/day04]# sh if-1.sh
请输入第一个比较的数字:3
请输入第二个比较的数字:3
3 = 3
[root@shell /service/scripts/day04]# sh if-1.sh
请输入第一个比较的数字:4
请输入第二个比较的数字:3
4 > 3
3. 监测服务是否运行
1. 如何判断一个服务是否在运行状态 systemctl status server
2. 根据服务的状态命令的返回的状态码$?的值进行判断 0 服务正在运行 3 没有运行 4 没有这个服务
3. 输入数字 #根据pid数字判断服务是否安装或者运行
4. 使用位置变量
[root@shell /service/scripts/day04]# cat if-2.sh
#!/bin/bash
#判断位置变量的个数
if [ $# -ne 1 ];then
echo "Usage: $0 {sshd|nginx|php-fpm|rsyncd|mariadb|...}"
exit
fi
#根据用户输入的位置变量进行检测服务是否在运行
systemctl status "$1" &>/dev/null
#根据返回值进行判断
State=$?
if [ $State -eq 0 ];then
echo "$1 服务正在运行中..."
elif [ $State -eq 3 ];then
echo "$1 服务没有在运行..."
elif [ $State -eq 4 ];then
echo "请检查${1}服务是否安装!或者是否书写错误!系统中没有这个${1}服务!"
else
echo "系统中没有正在运行你输入的PID号的服务..."
fi
[root@shell /service/scripts/day04]# sh if-2.sh
Usage: if-2.sh {sshd|nginx|php-fpm|rsyncd|mariadb|...}
[root@shell /service/scripts/day04]# sh if-2.sh sshd
sshd 服务正在运行中...
[root@shell /service/scripts/day04]# sh if-2.sh nginx
请检查nginx服务是否安装!或者是否书写错误!系统中没有这个nginx服务!
[root@shell /service/scripts/day04]# sh if-2.sh php-fpm
请检查php-fpm服务是否安装!或者是否书写错误!系统中没有这个php-fpm服务!
[root@shell /service/scripts/day04]# sh if-2.sh firewalld
firewalld 服务没有在运行...
[root@shell /service/scripts/day04]# sh if-2.sh mariadb
mariadb 服务正在运行中...
[root@shell /service/scripts/day04]# sh if-2.sh 4638
系统中没有正在运行你输入的PID号的服务...
[root@shell /service/scripts/day04]# sh if-2.sh 6957
6957 服务正在运行中...
4. 监控磁盘的使用率
1. 怎么查看磁盘根分区的使用率 df -h
2. 把根分区的使用率提取出来 进行判断
3. 给磁盘的使用率定义一个阈值 80 20 跟实际的值进行对比 整数 #要将百分数换成整数,采用变量替换方法
4. 使用率大于阈值,则进行报警发邮件 echo
5. 正常则输出正常
[root@shell /service/scripts/day04]# cat if-3.sh
#!/bin/bash
#定义磁盘使用率的变量
Disk_Used=$(df -h | awk '/\/$/{print $(NF-1)}')
#根据变量的值进行跟定义的阈值进行比较
if [ ${Disk_Used/\%/} -gt 10 ];then
echo -e "\033[41;37m当前根分区的使用率过高!当前根分区使用率为:$Disk_Used\033[0m"
echo "磁盘根分区使用率过高!当前根分区使用率为:$Disk_Used" | mail -s "当前根分区的使用率过高!" 1176494252@qq.com &>/dev/null
if [ $? -eq 0 ];then
echo "邮件发送成功...."
else
echo "邮件发送失败...."
fi
else
echo -e "\033[42;37m当前根分区的使用率正常!当前根分区使用率为:$Disk_Used\033[0m"
fi
[root@shell /service/scripts/day04]# sh if-3.sh
当前根分区的使用率正常!当前根分区使用率为:5%
[root@shell /service/scripts/day04]# sh if-3.sh
当前根分区的使用率正常!当前根分区使用率为:7%
[root@shell /service/scripts/day04]# sh if-3.sh
当前根分区的使用率正常!当前根分区使用率为:7%
[root@shell /service/scripts/day04]# sh if-3.sh
当前根分区的使用率正常!当前根分区使用率为:7%
[root@shell /service/scripts/day04]# sh if-3.sh
当前根分区的使用率正常!当前根分区使用率为:9%
[root@shell /service/scripts/day04]# sh if-3.sh
当前根分区的使用率正常!当前根分区使用率为:9%
[root@shell /service/scripts/day04]# sh if-3.sh
当前根分区的使用率正常!当前根分区使用率为:9%
[root@shell /service/scripts/day04]# sh if-3.sh
当前根分区的使用率过高!当前根分区使用率为:13%
邮件发送成功....
5. 创建用户脚本
1. 提示用户输入要进行创建的用户
2. 判断该用户是否存在系统
3. 存在则提示存在不创建
4. 不存在则创建
5. 根据创建的结果进行输出
[root@shell /service/scripts/day04]# cat if-4.sh
#!/bin/bash
#提示用户输入要进行创建的用户
read -p "请输入你要创建的用户:" User
#判断用户输入创建的用户是否存在
id $User &>/dev/null
if [ $? -eq 0 ];then
echo "${User}用户已经存在!无需再次创建!"
else
useradd $User &>/dev/null
if [ $? -eq 0 ];then
echo "用户${User}创建成功...."
else
echo "用户${User}创建失败...."
fi
fi
[root@shell /service/scripts/day04]# sh if-4.sh
请输入你要创建的用户:www
用户www创建成功....
[root@shell /service/scripts/day04]# sh if-4.sh
请输入你要创建的用户:www
www用户已经存在!无需再次创建!
6. 判断url地址是否能通
1. 调用函数库
[root@shell /service/scripts/day04]# cat if-5.sh
#!/bin/bash
#引用函数库
[ -f /etc/init.d/functions ] && source /etc/init.d/functions
#提示用户输入一个URL地址
read -p "请输入一个URL地址进行测试其是否可以访问:" Url
#根据用户输入的地址进行测试
ping -c1 -W1 $Url &>/dev/null
#根据测试的结果进行输出信息
if [ $? -eq 0 ];then
action "URL地址${Url}是可以访问的..." /bin/true
else
action "URL地址${Url}是不能访问的..." /bin/false
fi
[root@shell /service/scripts/day04]# sh if-5.sh
请输入一个URL地址进行测试其是否可以访问:www.baidu.com
URL地址www.baidu.com是可以访问的... [ OK ]
[root@shell /service/scripts/day04]# sh if-5.sh
请输入一个URL地址进行测试其是否可以访问:www.baiduu.com
URL地址www.baiduu.com是不能访问的... [FAILED]
7. 流程控制语句之字符比较
== #等于则条件为真 [ "$a" == "$b" ]
!= #不等于则条件为真 [ "$a" != "$b" ]
-z #字符串的长度为零则为真 [ -z "$a" ]
-n #字符串的长度不为零则为真 [ -n "$a" ]
[root@shell /service/scripts/day04]# [ "$USER" == "root" ] && echo "OK" || echo "ERROR"
OK
[root@shell /service/scripts/day04]# [ "$USER" == "roo" ] && echo "OK" || echo "ERROR"
ERROR
[root@shell /service/scripts/day04]# [ "$USER" != "roo" ] && echo "OK" || echo "ERROR"
OK
[root@shell /service/scripts/day04]# [ "$USER" != "root" ] && echo "OK" || echo "ERROR"
ERROR
[root@shell /service/scripts/day04]# [ -z "$USER" ] && echo "OK" || echo "ERROR"
[root@shell /service/scripts/day04]# a=123
[root@shell /service/scripts/day04]# [ -z "$a" ] && echo "OK" || echo "ERROR"
ERROR
[root@shell /service/scripts/day04]# a=""
[root@shell /service/scripts/day04]# [ -z "$a" ] && echo "OK" || echo "ERROR"
OK
[root@shell /service/scripts/day04]# [ -n "$USER" ] && echo "OK" || echo "ERROR"
OK
[root@shell /service/scripts/day04]# [ -n "$a" ] && echo "OK" || echo "ERROR"
ERROR
[root@shell /service/scripts/day04]# cat if-6.sh
#!/bin/bash
read -p "请输入一个yes:" Yes
if [ "$Yes" == "yes" ];then
echo "你输入的是一个:yes"
else
echo "你输入的不是一个:yes"
fi
[root@shell /service/scripts/day04]# sh if-6.sh
请输入一个yes:yes
你输入的是一个:yes
[root@shell /service/scripts/day04]# sh if-6.sh
请输入一个yes:no
你输入的不是一个:yes
[root@shell /service/scripts/day04]# cat if-6.sh
#!/bin/bash
read -p "请输入一个yes:" Yes
#判断用户输入的是否为空值,回车键
if [ -z "$Yes" ];then
echo "此脚本不支持直接回车!请输入一个值!"
exit
fi
if [ "$Yes" == "yes" ];then
echo "你输入的是一个:yes"
else
echo "你输入的不是一个:yes"
fi
[root@shell /service/scripts/day04]# sh if-6.sh
请输入一个yes:
此脚本不支持直接回车!请输入一个值!
[root@shell /service/scripts/day04]# sh if-6.sh
请输入一个yes:yes
你输入的是一个:yes
8. 多条件比对
-a #并且 多条件同时满足 则条件成立
-o #或者 多条件只要有一个成立,则条件成立
[root@shell /service/scripts/day04]# [ 1 -lt 2 -a 2 -lt 3 ] && echo "成立" || echo "不成立"
成立
[root@shell /service/scripts/day04]# [ 2 -lt 2 -a 2 -lt 3 ] && echo "成立" || echo "不成立"
不成立
[root@shell /service/scripts/day04]# [ 2 -lt 2 -a 3 -lt 3 ] && echo "成立" || echo "不成立"
不成立
[root@shell /service/scripts/day04]# [ 2 -lt 2 -o 3 -lt 3 ] && echo "成立" || echo "不成立"
不成立
[root@shell /service/scripts/day04]# [ 1 -lt 2 -o 3 -lt 3 ] && echo "成立" || echo "不成立"
成立
[root@shell /service/scripts/day04]# [ 1 -lt 2 -o 1 -lt 3 ] && echo "成立" || echo "不成立"
成立
[root@shell /service/scripts/day04]# [ "$USER" == "root" -a "$UID" -eq 0 ] && echo "成立" || echo "不成立"
成立
[root@shell /service/scripts/day04]# [ "$USER" == "root" -a "$UID" -eq 1 ] && echo "成立" || echo "不成立"
不成立
&& #并且 多条件同时满足 则条件成立
|| #或者 多条件只要有一个成立,则条件成立
#使用&& || 进行条件判断时必须使用双中括号[[]] (&& || 在括号中使用时)
[root@shell /service/scripts/day04]# [[ "$USER" == "root" && "$UID" -eq 1 ]] && echo "成立" || echo "不成立"
不成立
[root@shell /service/scripts/day04]# [[ "$USER" == "root" && "$UID" -eq 0 ]] && echo "成立" || echo "不成立"
成立
[root@shell /service/scripts/day04]# [[ "$USER" == "root" || "$UID" -eq 0 ]] && echo "成立" || echo "不成立"
成立
[root@shell /service/scripts/day04]# [[ "$USER" == "roo" || "$UID" -eq 0 ]] && echo "成立" || echo "不成立"
成立
[root@shell /service/scripts/day04]# [[ "$USER" == "roo" || "$UID" -eq 1 ]] && echo "成立" || echo "不成立"
不成立
[root@shell /service/scripts/day04]# [ "$USER" == "root" -a "$UID" -eq 0 ] &&echo "该用户是超级管理员" || echo "该用户不是超级管理员"
该用户是超级管理员
[root@shell /service/scripts/day04]# [[ "$USER" == "root" && "$UID" -eq 0 ]] &&echo "该用户是超级管理员" || echo "该用户不是超级管理员"
该用户是超级管理员
[root@shell /service/scripts/day04]# [[ ! "$USER" != "root" && ! "$UID" -ne 0 ]] &&echo "该用户是超级管理员" || echo "该用户不是超级.理员"
该用户是超级管理员
[root@shell /service/scripts/day04]# [[ "$USER" != "root" || "$UID" -ne 0 ]] &&echo "该用户是超级管理员" || echo "该用户不是超级管理."
该用户不是超级管理员
9. 判断学生的成绩优劣
0-100 分数
0 地秀
1-59 不及格 需要补考
60-79 及格
80-99 优秀
100 天秀
>100 要有提示
判断用户输入的是否为数字并且判断用户不能输入空值
单条件
多条件
10.流程控制语句之正则比较
^ $ * +
#^ 表示以什么开头 $ 表示以什么结尾 * 表示出现0次或者0次以上 + 表示出现一次或一次以上
#[]匹配里面的任意一个 {数字} 里面出现的次数
模糊匹配: =~
精确匹配: ==
正则需要使用双中括号
[root@shell /service/scripts/day04]# [[ "$USER" =~ ^r ]] && echo "OK" || echo "ERROR"
OK
[root@shell /service/scripts/day04]# [[ "$USER" =~ ^roo ]] && echo "OK" || echo "ERROR"
OK
[root@shell /service/scripts/day04]# [[ rtt =~ ^r ]] && echo "OK" || echo "ERROR"
OK
[root@shell /service/scripts/day04]# [[ rtt =~ t$ ]] && echo "OK" || echo "ERROR"
OK
[root@shell /service/scripts/day04]# Num=123
[root@shell /service/scripts/day04]# [[ $Num =~ ^[0-9]*$ ]] && echo "OK" || echo "ERROR"
OK
[root@shell /service/scripts/day04]# Num=123a
[root@shell /service/scripts/day04]# [[ $Num =~ ^[0-9]*$ ]] && echo "OK" || echo "ERROR"
ERROR
[root@shell /service/scripts/day04]# Num=""
[root@shell /service/scripts/day04]# [[ $Num =~ ^[0-9]*$ ]] && echo "OK" || echo "ERROR"
OK
[root@shell /service/scripts/day04]# # * 表示前面的字符出现0次或者0次以上
[root@shell /service/scripts/day04]# [[ $Num =~ ^[0-9]+$ ]] && echo "OK" || echo "ERROR"
ERROR
[root@shell /service/scripts/day04]# # + 表示前面的字符出现1次或者1次以上
[root@shell /service/scripts/day04]# Num=12
[root@shell /service/scripts/day04]# [[ $Num =~ ^[0-9]{2}$ ]] && echo "OK" || echo "ERROR"
OK
[root@shell /service/scripts/day04]# Num=123
[root@shell /service/scripts/day04]# [[ $Num =~ ^[0-9]{2}$ ]] && echo "OK" || echo "ERROR" #前面的字符只出现了2次
ERROR
[root@shell /service/scripts/day04]# # {2} 表示前面的字符出现2次
[root@shell /service/scripts/day04]# abc=abcd
[root@shell /service/scripts/day04]# [[ $abc =~ ^[a-Z]+$ ]] && echo "OK" || echo "ERROR"
OK #表示前面的字符出现了一次或者一次以上
[root@shell /service/scripts/day04]# abc=abcd1
[root@shell /service/scripts/day04]# [[ $abc =~ ^[a-Z]+$ ]] && echo "OK" || echo "ERROR"
ERROR
[root@shell /service/scripts/day04]# cat if-9.sh
#!/bin/bash
#提示用户输入一组字符串,必须是字母
read -p "请输入一组字符串,必须是字母组成的:" Zm
#判断用户输入的是否是字母
if [[ $Zm =~ ^[a-Z]+$ ]];then
echo "你输入的是一个字母!"
else
echo "你输入的不符合条件!"
fi
[root@shell /service/scripts/day04]# sh if-9.sh
请输入一组字符串,必须是字母组成的:12
你输入的不符合条件!
[root@shell /service/scripts/day04]# sh if-9.sh
请输入一组字符串,必须是字母组成的:abc
你输入的是一个字母!
[root@shell /service/scripts/day04]# sh if-9.sh
请输入一组字符串,必须是字母组成的:avbgvrtg
你输入的是一个字母!
[root@shell /service/scripts/day04]# sh if-9.sh
请输入一组字符串,必须是字母组成的:fgergf4gtrg
你输入的不符合条件!
11.创建用户,输入前缀和后缀
1. 执行脚本时,提示用户输入前缀,前缀必须是有字母组成的 例如:qls
2. 提示用户输入后缀,后缀必须是数字,例如:123
3. 根据用户的前缀和后缀进行创建用户
做题思路:
1. 提示用户输入前缀 read -p
2. 判断用户输入的前缀是否为字母或者为空值。
3. 提示用户输入后缀 read -p
4. 判断用户输入的后缀是否为数字
5. 将用户的前缀和后缀组合成一个用户
6. 判断该用户是否存在该系统
7. 存在则不进行创建,不存在则进行创建
8. 根据创建的结果进行返回信息
[root@shell /service/scripts/day04]# cat if-10.sh
#!/bin/bash
#提示用户输入前缀
read -p "请输入你要创建用户的前缀,前缀必须是字母组成的:" Qz
#判断用户输入的前缀是否为字母
if [[ ! $Qz =~ ^[a-Z]+$ ]];then
echo "你输入的前缀不符合要求!必须是字母组成的!"
exit
fi
#提示用户输入后缀
read -p "请输入你要创建用户的后缀,后缀必须是数字组成的:" Hz
#判断用户输入的后缀是否为数字
if [[ ! $Hz =~ ^[0-9]+$ ]];then
echo "你输入的后缀不符合条件!必须是数字组成的!"
exit
fi
#将前缀和后缀组合成一个变量
User=${Qz}${Hz}
#判断该用户是否存在该系统
id $User &> /dev/null
if [ $? -eq 0 ];then
echo "用户${User}已经存在该系统!无需再次进行创建!"
else
useradd $User &>/dev/null
if [ $? -eq 0 ];then
echo "用户${User}创建成功..."
else
echo "用户${User}创建失败..."
fi
fi
[root@shell /service/scripts/day04]# sh if-10.sh
请输入你要创建用户的前缀,前缀必须是字母组成的:34f
你输入的前缀不符合要求!必须是字母组成的!
[root@shell /service/scripts/day04]# sh if-10.sh
请输入你要创建用户的前缀,前缀必须是字母组成的:abc
请输入你要创建用户的后缀,后缀必须是数字组成的:r43
你输入的后缀不符合条件!必须是数字组成的!
[root@shell /service/scripts/day04]# sh if-10.sh
请输入你要创建用户的前缀,前缀必须是字母组成的:
你输入的前缀不符合要求!必须是字母组成的!
[root@shell /service/scripts/day04]# sh if-10.sh
请输入你要创建用户的前缀,前缀必须是字母组成的:qls
请输入你要创建用户的后缀,后缀必须是数字组成的:123
用户qls123创建成功...
[root@shell /service/scripts/day04]# sh if-10.sh
请输入你要创建用户的前缀,前缀必须是字母组成的:qls
请输入你要创建用户的后缀,后缀必须是数字组成的:123
用户qls123已经存在该系统!无需再次进行创建!