day65 if语句的学习
day65 shell_if的学习
流程的控制if的语句
首先是---单分支if
开始
↓
if 条件判断表达式
↓
if 今天天气不错啊!!
↓
踏踏实实的去上班
↓
如果不是---------->回家睡觉
伪代码
1. 从中文代码,理解英文的代码的,执行的逻辑
2. if 语句的写法
3. 单分支的if 语句的写法,两种的风格
风格一
# 分号是shell 的命令分割符
if [ 你看起来想周星驰 ]; then
当条件成立,执行这里的代码
出门在外男孩要保护自己
fi
echo "差不多就好了"
风格2
if [ 你是女孩子 ]; then
女孩子在外面要保护好自己
fi
系统自带的if的写法

练习小的脚本
`给脚本传入2个位置参数,比较是否相等判断
cat > test_if.sh << EOF
#!/bin/bash
if [ "$1" -eq "$2" ];then
echo "相等"
fi
EOF
双分支的语句
伪代码
if 上学时候努力的学习
今天必然年薪180万
elif 今天往后的努力的学习linux
年薪80万也可以
elif 条件还可以继续的写,
。。。。。
else
家里拆迁,回家开宝马也不是不可以
fi ----------》 结束
猜数字小游戏
cat > if_02.sh <<EOF
if [ $1 -eq $2 ]; then
echo "相等"
else
echo “不相等”
EOF
判断当前系统登录用户,是否为超级的用户,是则执行某些命令,不是则提示用户先要sudo提权
#!/bin/bash
# 基于uid和gid=0 ,基于用户名和root
# 写shell的变量的时候提取值,要最精确,最不会出现任何歧义的写法
# 在你写一个非常严重的脚本的时候,建议所有的字符串,变量的边界都给加上,是最严谨的
if [ "${UID}" -eq 0 ]; then
echo "当前你是root的登录,有权限,开始执行"
systemctl restart network
else
echo "哥们,加上sudo"
fi
# 方案2
if [ "${UID}" == "root" ]; then
echo "当前是root的登录,有权限,开始执行"
systemctl restart network
else
# 你不是超级用户
echo "加上sudo"
fi


多条件的分支
说白了,就是if,if 的嵌套。有点那个的感觉

if
elif
else
如何阅读系统内置的shell脚本的if代码逻辑嵌套
这个写法,就是if ,else ,fi条件语句,进行多次的使用,多次的嵌套
比如,处理具体的业务的问题
判断某进程是否是存在
关于nginx脚本的伪代码逻辑
1. 测试nginx的进程是否存在,如果不存在,pid文件的读取就为空,就要告知运维,nginx挂了
脚本要重启nginx
2. 继续嵌套if判断,如果,nginx启动失败了 [ $? -ne 0 ]
......
否则就是正确的启动,echo显示nginx重启成功,打印一下nginx的pid,确保的确是启动正确。
主要是先有思路,在转化为代码的逻辑即可。

多条件的if
# 还是伪代码
if [ 帅是吴彦祖 ]; then
echo "男孩在外,要保护好自己"
elif [ 好像熊大 ]; then
echo “oooooo”
else
echo "你是什么"
fi
继续练习if的条件的判断
关于目录的创建
#!/bin/bash
# -d 当目录存在的时候,则为真执行echo代码
if [ -d /backup/ ]; then
echo "该目录存在,无需创建"
else
echo '该目录不存在,正在创建中'
mkdir -p "/backup"
fi
执行
[root@master-61 ~]#
[root@master-61 ~]#
[root@master-61 ~]# cat if_dir.sh
#!/bin/bash
# -d 当目录存在的时候,则为真执行echo代码
if [ -d /backup/ ]; then
echo "该目录存在,无需创建"
else
echo '该目录不存在,正在创建中'
mkdir -p "/backup"
fi
[root@master-61 ~]#
[root@master-61 ~]# bash if_dir.sh
该目录不存在,正在创建中
[root@master-61 ~]# bash if_dir.sh
该目录存在,无需创建
[root@master-61 ~]# bash if_dir.sh
该目录存在,无需创建
[root@master-61 ~]# bash if_dir.sh
该目录存在,无需创建
[root@master-61 ~]# bash if_dir.sh
该目录存在,无需创建
[root@master-61 ~]# bash if_dir.sh
该目录存在,无需创建
[root@master-61 ~]#
[root@master-61 ~]#
如果备份文件不存在,则自动创建
# 如果备份文件不存在自动的创建
#!/bin/bash
if [ -e /backup/ ];then
echo "目录存在"
else
mkdir -p "/backup"
fi
if [ -f /backup/all_log.tgz ];then
echo "数据备份完毕"
else
echo "备份数据中"
# 写脚本,执行日志的程序,一般都不在打印,要么丢掉,或则写入到文件中,
tar -zcf /backup/all_log.tgz /var/log/
fi
继续思考,关于本分的文件,建议还是因该多份来的合适,如何优化这个代码?
1. 如何优化?
2.需求是,备份的动作不能断,建议多备份来的合适,可靠,磁盘又不值钱
3.最常见的做法是添加时间,因为时间是变化的,常用于各种脚本去添加时间节点。
4.如按照,天,按小时创建目录等。
#!/bin/bash
# 获取当前时间戳
now=$(date +%F-%T)
#程序中,容易变化的数据,都要封装为变量的形式,易于维护代码
back_dir=/backup/
#关于备份目录的判断
if [ -e $back_dir ];then
echo "目录存在。。。"
else
mkdir -p $back_dir
fi
# 关于备份文件的情况
tar -zcf ${back_dir}/all_log.tgz.${now} /var/log &>/dev/null 2>&1
# 备份的情况的检测
if [ $? -eq 0 ];then
echo -e "备份成功,最新的数据如下\n $(ls ${back_dir})"
else
echo "错误。。。"
fi
[root@master-61 ~]# bash if_dir.sh
目录存在。。。
备份成功,最新的数据如下
all_log.tgz.2025-05-07-01:00:48
ok了,没什么问题
程序运行检测脚本
写一个脚本,传递一个参数,即可检查该服务运行的状态
#!/bin/bash
# 限定只能检查一个服务
if [ $# -eq 1 ];then
# 检查服务运行的状态
systemctl status $1 &>/dev/null
# 通过命令结果的判断
if [ $? -eq 0 ]; then
echo "服务运行中"
else
echo " $1 服务挂了!!"
fi
# 否则提示用户输入正确的参数
else
# 提示用户正确的语法
echo "usage ,bash $0 server_name"
exit
fi
采集服务器资源信息且判断
开发的思路
1. 想好监控那些资源,如何用命令。
2. 如何提取百分比的数据
3, 提取的数据做比较,
4, 结果写到文件当中
一是通过,linux的命令获取
二是通过,/proc目录提供的资源数据
这里仅仅是为了练习如何通过shell的条件判断语句,以及通过Linux命令拿到数据
#!/bin/bash
# 获取当前时间,精准统计
now=$(date +%F-%T)
# 提取内存使用率 free -m
# 具体写法,内存统计
# 写程序,先自己去执行具体的命令,拿到结果,调试好后,再写入脚本
mem_used=$(free -m | awk '/Mem/{used=$3/$2;print used*100}'|sed -r 's#\..*##g')
# 不写注释,回头看自己写代码,也得重新读一遍。。。缕一缕逻辑。。
# 写了注释,中文,看一眼就哦了
# 拿到内存使用率进行比较
# 判断当内存使用百分比,大于等于85%就报警
# 由于不太好测试,吧数据,改小点
if [ $mem_used -ge 2 ];then
# 警告信息,写入到文件中
# root:时间:内存使用率
echo "${USER}:${now}:内存使用率 ${mem_used}% " > /tmp/mem_used.log
# 给自己发个邮件
# mail -s "内存警告!!!"
fi
# 内存的提取,以及if判断,逻辑看懂刷1111,以及日志记录
# 根目录磁盘使用率
# 这里是采集根分区的使用率
# 先统计出现有的使用率,超过85%之后,报警
disk_used=$(df -h |grep '/$' | awk '{print $5}' |sed 's#%##g')
# 条件判断
# 判断根分区磁盘使用率,超过85%就告警
if [ $disk_used -ge 2 ];then
echo "${USER}:${now}:磁盘使用率 ${disk_used}% 请尽快修复。" >> /tmp/disk_used.log
fi
# 磁盘使用率的采集逻辑,看懂刷 1111
# cpu使用率
# 通过top命令 查看cpu整体情况,查看%Cpus行的信息,查看idle行,表示当前有多少百分比的空闲cpu。
#cpu_used=$(top -n 1|awk -F '[, %]+' 'NR==3 {print 100-$12}'|sed -r 's#\..*##g')
cpu_used=$(sar -u 1 1|awk 'NR==5{print 100-$NF}'|sed -r 's#\..*##g' )
if [ $cpu_used -ge 3 ];then
echo "${USER}:${now}:cpu使用率 ${cpu_used}% 请尽快修复。" >> /tmp/cpu_used.log
fi
# cpu使用率的采集命令,以及if判断语法,会玩 刷 33333
猜成绩脚本
1, 练习,if,elif,else ,fi 这几个脚本
需求:
让用户输入自己的成绩, read
根据read输入的数据,多条件判断
1. 分数在0 ~ 59 不及格,需要补考
2. 分数在 60 ~ 85 属于良好
3. 分数在86 ~ 100 属于优秀
如果你要考虑到多种场景,也就是优化的点,
v1版本基本完成需求即可(用户能站在你的角度,完全按照你的要求去输入,确保正确按要求输入,程序是没问题)
v2 版本,(考虑到用户会输入错误的情况,如输入数字,缺输入了字母,异常处理,数据校验)
v3 更多的功能优化了。。
v4
靠你自己,写N行代码后,再去琢磨优化吧,靠你自己的理解,经验去优化的程序。
v2版本改进版
#!/bin/bash
if [ $# != 0 ];then
echo "本脚本无须传入参数!!"
exit
else
# 可恨的产品经理,陈亮亮,提出了新需求,当用户输入 多个数据?如何处理。
read -p "请输入你的成绩:" score
if [ -z $score ];then
echo "大哥,你好歹输入点东西吧!!滚粗!"
exit
fi
# 成绩数字判断,如果能替换为空字符串,证明就是纯数字,输入正确
all_int=$(echo "$score"|sed -r 's#[0-9]+##g')
# 非空字符串的话,就表示非纯数字
if [ -n "$all_int" ];then
echo "请输入纯数字!!"
exit
# 具体用 -gt -lt 还是 用 -ge -le 要看你自己的逻辑了
elif [ $score -ge 0 ] && [ $score -le 59 ];then
echo "平时少玩点游戏兄弟,回去等通知吧,建议多看看于超老师的课程 www.yuchaoit.cn"
elif [ $score -ge 60 ] && [ $score -le 85 ];then
echo "考得不错,下次继续努力"
elif [ $score -ge 86 ] && [ $score -le 100 ];then
echo "大佬,带带弟弟"
else
echo "分数只能在0~100。。。别瞎整!!"
exit
fi
fi
系统服务管理的脚本
核心还是练习,if,elif ,else的基本的玩法
#!/bin/bash
source /etc/init.d/functions
read -p "请输入你要查询的服务名:" services_name
# 查询结果记录
rpm -qa $services_name > /tmp/status_install.log
# -s 限制文件存在且有内容才为true
if [ ! -s /tmp/status_install.log ];then
echo "$services_name 该服务未安装!!"
exit
fi
# 否则该服务就是存在的
echo -e "请选择执行的步骤:\n1.start\n2.stop\n3.restart\n4.status"
read -p "请输入你的选择序号:" num
if [ $num -eq 1 ];then
systemctl start $services_name > /dev/null 2>&1
# 异常处理
[ $? -eq 0 ] && action "$services_name 启动成功" /bin/true || action "$services_name 启动失败" /bin/false
elif [ $num -eq 2 ];then
systemctl stop $services_name > /dev/null 2>&1
[ $? -eq 0 ] && action "$services_name 停止成功" /bin/true || action "$services_name 停止失败" /bin/false
elif [ $num -eq 3 ];then
systemctl restart $services_name > /dev/null 2>&1
[ $? -eq 0 ] && action "$services_name 重启成功" /bin/true || action "$services_name 重启失败" /bin/false
elif [ $num -eq 4 ];then
systemctl status $services_name
[ $? -eq 0 ] && action "$services_name 服务正常运行中" /bin/true || action "$services_name 服务未运行" /bin/false
else
echo "请输入正确选项!!1 ~ 4"
fi
最后就是关于总结
多看,多练,多思考,。。。。。
浙公网安备 33010602011771号