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

最后就是关于总结

多看,多练,多思考,。。。。。

posted @ 2025-05-06 17:54  国家一级冲浪yzk  阅读(19)  评论(0)    收藏  举报