Linux安全与高级应用(七)深入Linux Shell脚本编程:循环与分支结构的高级应用
文章目录
- 深入Linux Shell脚本编程:循环与分支结构的高级应用
- 一、循环结构详解
- 1. `for`循环
- 1.1 应用示例:检查主机状态
- 2. `while`循环
- 2.1 应用示例:猜价格游戏
- 二、分支结构详解
- 1. `if`语句
- 1.1 单分支结构
- 1.2 双分支结构
- 1.3 多分支结构
- 2. `case`语句
- 2.1 应用示例:编写系统服务脚本
- 三、综合应用案例
- 1. 需求描述
- 2. 实现思路
- 3. 代码实现
- 4. 设置定时任务
- 四、总结
👍 个人网站:【 洛秋小站】【洛秋资源小站】
深入Linux Shell脚本编程:循环与分支结构的高级应用
在Linux系统管理和自动化任务中,Shell脚本是一个非常强大的工具。Shell脚本不仅能够简化日常管理任务,还能通过复杂的逻辑控制和自动化流程来提升效率。本篇博客将深入探讨Shell脚本中的循环与分支结构的高级应用,帮助读者掌握这些关键技术,以便在实际工作中灵活运用。
一、循环结构详解
循环结构是Shell脚本中常用的控制结构之一,能够实现重复执行某段代码,直到满足特定条件为止。主要包括for
循环和while
循环。
1. for
循环
for
循环用于遍历一组值,并对每个值执行一系列命令。其基本格式如下:
for 变量名 in 取值列表
do命令序列
done
以下是一个示例,展示如何使用for
循环批量添加用户:
#!/bin/bash
ULIST=$(cat /root/users.txt)
for UNAME in $ULIST
douseradd $UNAMEecho "123456" | passwd --stdin $UNAME
done
上述脚本从/root/users.txt
文件中读取用户名列表,然后为每个用户名创建用户,并设置初始密码。
1.1 应用示例:检查主机状态
另一个常见的for
循环应用是批量检查主机状态。以下脚本读取IP地址列表,并使用ping
命令检查每个主机的连通性:
#!/bin/bash
HLIST=$(cat /root/ipadds.txt)
for IP in $HLIST
doping -c 3 -i 0.2 -W 3 $IP &> /dev/nullif [ $? -eq 0 ] ; thenecho "Host $IP is up."elseecho "Host $IP is down."fi
done
该脚本从/root/ipadds.txt
文件中读取IP地址列表,并通过ping
命令检查每个IP的连通性。如果主机在线,返回“Host $IP is up.”,否则返回“Host $IP is down.”。
2. while
循环
while
循环用于重复执行某段代码,只要条件成立就继续执行。其基本格式如下:
while 条件测试操作
do命令序列
done
以下是一个示例,展示如何使用while
循环批量添加用户:
#!/bin/bash
PREFIX="stu"
i=1
while [ $i -le 20 ]
douseradd ${PREFIX}$iecho "123456" | passwd --stdin ${PREFIX}$i &> /dev/nulllet i++
done
上述脚本创建20个以stu
为前缀的用户,用户编号从1到20,并设置初始密码。
2.1 应用示例:猜价格游戏
以下是一个使用while
循环的简单猜价格游戏脚本:
#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
TIMES=0
echo "商品实际价格为0-999之间,猜猜看是多少?"
while true
doread -p "请输入你猜测的价格数目:" INTlet TIMES++if [ $INT -eq $PRICE ] ; thenecho "恭喜你答对了,实际价格是 $PRICE"echo "你总共猜测了 $TIMES 次"exit 0elif [ $INT -gt $PRICE ] ; thenecho "太高了!"elseecho "太低了!"fi
done
该脚本生成一个0到999之间的随机数作为商品价格,并提示用户猜测价格。根据用户输入的价格,脚本会给出“太高了”或“太低了”的提示,直到用户猜中为止。
二、分支结构详解
分支结构用于根据不同的条件执行不同的命令。主要包括if
语句和case
语句。
1. if
语句
if
语句用于根据条件测试的结果执行不同的命令序列。if
语句有单分支结构、双分支结构和多分支结构三种形式。
1.1 单分支结构
单分支结构用于在条件成立时执行一段代码,其基本格式如下:
if 条件测试操作
then命令序列
fi
例如,判断目录是否存在,如果不存在则创建目录:
#!/bin/bash
MOUNT_DIR="/media/cdrom/"
if [ ! -d $MOUNT_DIR ]
thenmkdir -p $MOUNT_DIR
fi
1.2 双分支结构
双分支结构用于在条件成立时执行一段代码,而在条件不成立时执行另一段代码,其基本格式如下:
if 条件测试操作
then命令序列1
else命令序列2
fi
例如,判断主机是否存活,并显示检测结果:
#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
if [ $? -eq 0 ]
thenecho "Host $1 is up."
elseecho "Host $1 is down."
fi
1.3 多分支结构
多分支结构用于在多个条件之间进行选择,其基本格式如下:
if 条件测试操作1
then命令序列1
elif 条件测试操作2
then命令序列2
else命令序列3
fi
例如,判断分数范围并分出优秀、合格和不合格三个档次:
#!/bin/bash
read -p "请输入您的分数(0-100):" GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; thenecho "$GRADE 分!优秀"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] ; thenecho "$GRADE 分,合格"
elseecho "$GRADE 分?不合格"
fi
2. case
语句
case
语句用于针对变量的不同取值分别执行不同的命令序列,其基本格式如下:
case 变量值 in
模式1)命令序列1;;
模式2)命令序列2;;……
* )默认命令序列
esac
例如,击键类型识别脚本,判断用户输入的字符是字母、数字还是其他字符:
#!/bin/bash
read -p "请输入一个字符,并按Enter键确认:" KEY
case "$KEY" in[a-z]|[A-Z])echo "您输入的是 字母。";;[0-9])echo "您输入的是 数字。";;*)echo "您输入的是 空格、功能键或其他控制字符。"
esac
2.1 应用示例:编写系统服务脚本
以下是一个使用case
语句编写的系统服务脚本,用于启动、停止和重启服务:
#!/bin/bash
# chkconfig: - 90 10
# description: Startup script for sleep Server
case "$1" in
start)echo "正在启动sleep服务 ... OK";;
stop)echo "正在停止sleep服务 ... OK";;
restart)$0 stop$0 start;;
*) echo "用法: $0 {start|stop|restart}"
esac
三、综合应用案例
通过结合使用循环结构和分支结构,我们可以编写出功能强大且灵活的Shell脚本。以下是一个实际应用案例:监控服务器资源并发送告警邮件。
1. 需求描述
编写监控脚本sysmon.sh
,在以下情况时告警:
- 磁盘占用率超过90%
- CPU使用率超过80%
- 内存使用率超过90%
脚本每半小时检查一次,并通过邮件发送告警。
2. 实现思路
- 使用
df
、mpstat
、free
等命令提取各种监控指标 - 将各指标与正常值进行比较,保存异常情况
- 检查异常记录,若存在则发送告警邮件
- 设置
crontab
任务,定期调用sysmon.sh
脚本
3. 代码实现
以下是sysmon.sh
脚本的具体实现:
#!/bin/bash# 获取当前的时间戳
timestamp=$(date +"%Y-%m-%d %H:%M:%S")# 定义告警函数
send_alert() {local message=$1echo "$message" | mail -s "System Monitor Alert" admin@example.com
}# 检查磁盘占用率
disk_usage=$(df / | grep / | awk '{ print $5 }' | sed 's/%//g')
if [ $disk_usage -gt 90 ]; thensend_alert "[$timestamp] Disk usage is above 90%: ${disk_usage}%"
fi# 检查CPU使用率
cpu_usage=$(mpstat 1 1 | grep "Average" | awk '{print 100 - $NF}')
if [ $(echo "$cpu_usage > 80" | bc) -ne 0 ]; thensend_alert "[$timestamp] CPU usage is above 80%: ${cpu_usage}%"
fi# 检查内存使用率
memory_usage=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
if [ $(echo "$memory_usage > 90" | bc) -ne 0 ]; thensend_alert "[$timestamp] Memory usage is above 90%: $1.14MB%"
fi
4. 设置定时任务
使用crontab
设置每半小时执行一次sysmon.sh
脚本:
*/30 * * * * /path/to/sysmon.sh
四、总结
Shell脚本中的循环结构和分支结构是实现自动化任务的关键工具。通过灵活运用这些工具,我们可以编写高效、可靠的脚本来处理复杂的任务。在实际应用中,结合系统的具体需求,编写适合的Shell脚本,可以极大地提高工作效率和系统稳定性。
👉 最后,愿大家都可以解决工作中和生活中遇到的难题,剑锋所指,所向披靡~
相关文章:
Linux安全与高级应用(七)深入Linux Shell脚本编程:循环与分支结构的高级应用
文章目录 深入Linux Shell脚本编程:循环与分支结构的高级应用一、循环结构详解1. for循环1.1 应用示例:检查主机状态 2. while循环2.1 应用示例:猜价格游戏 二、分支结构详解1. if语句1.1 单分支结构1.2 双分支结构1.3 多分支结构 2. case语句…...

python爬虫滑块验证及各种加密函数(基于ddddocr进行的一层封装)
git链接: https://github.com/JOUUUSKA/spider_toolsbox 这里写目录标题 一.识别验证码1、识别英文+数字验证码2、识别滑块验证码3、识别点选验证码 一.识别验证码 git链接: https://github.com/JOUUUSKA/spider_toolsbox 创作不易记得stars 1、识别英文…...

pytorch学习一(扩展篇):miniconda下载、安装、配置环境变量。miniconda创建多版本python环境。整理常用命令(亲测ok)
文章目录 前言一、miniconda和anaconda的关系1、Anaconda2、Miniconda3、总结 二、下载miniconda(清华镜像链接)三、安装miniconda1、安装2、或许要手动加载 ~/.bashrc 四、配置 命令1、查看anaconda安装博文2、取消默认进入conda(base&#…...
说一下Android中的IdleHandler
IdleHandler 是 Android 中的一个接口,常用于在主线程空闲时执行一些低优先级的任务。 作用: 它提供了一种在主线程空闲时执行额外操作的机制,能够优化应用的性能和资源利用。 工作原理: 当主线程没有其他任务需要处理ÿ…...
Flake8 和 Autopep8 使用指南
Flake8 和 Autopep8 集成到 CI/CD 流程中,确保在代码提交和合并时自动进行检查和格式化,如果Autopep8格式化检查无法通过Flake8校验,说明pycodestyle版本依赖不兼容,参考文章:Flake8 与 Autopep8 兼容性指南 Flake8 使…...

OpenHarmony(数据)通信协议、数据存储—protobuf
介绍 ProtoBuf(protocol buffers) 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。,是一种灵活,高效,自动化机制的结构数据序列化方法比XML更小,更快,更为简单。 本项…...
vue3 依赖注入 vueRouter vuex
目录 01 依赖注入 02 组合式API里面的vueRouter 03 组合式API中的vuex的使用 01 依赖注入 使用场景: 有一个父组件,里头有子组件,有孙组件,有很多后代组件,共享父组件数据。 1.组先组件给后代组件传参 组先组件: 从…...

在Windows上用Visual Studio编译OpenCV
在Windows上编译开源项目,有时候让人痛不欲生,有时候却出奇地顺利。OpenCV属于后者。本文记录这次愉快的过程。 注:OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它提供了大…...

详解2024年最值得推荐的5款CRM软件:如何选择适合企业需求的CRM系统?
在文章开始之前,我们前来了解下:什么是CRM系统? CRM系统,即客户关系管理系统,顾名思义,它是企业用来管理和维护与客户之间关系的重要工具。通过CRM系统,企业能够全面了解客户需求,优…...

2024靠谱的网站建设公司推荐
在现在的互联网社会,一个企业的网站往往是潜在客户对该品牌的第一印象来源。也正因如此,选择一个靠谱的网站建设公司对于确保企业在线形象和功能性至关重要,作为建站行业从业人员,我分享几个选择网站建设公司时应考虑的几个关键因…...
第一天:Java基础与环境搭建
第一天:Java基础与环境搭建 1. 理解Java基本概念 了解Java语言的历史:Java是一种广泛使用的编程语言,由Sun Microsystems(现被Oracle收购)于1995年首次发布。认识Java的特性:包括面向对象、平台无关性&am…...
动画魔法秀:JavaScript前端动画实战指南
标题:动画魔法秀:JavaScript前端动画实战指南 在现代Web开发中,动画不仅能够提升用户体验,还能使网页更加生动有趣。JavaScript作为实现前端动画的重要工具之一,提供了多种方式来创建平滑且吸引人的动画效果。本文将详…...

实训日记day26
NAT服务配置 1.关闭防火墙和selinux [root2 ~]# setenforce 0 [root2 ~]# vim /etc/selinux/config [root2 ~]# systemctl stop firewalld [root2 ~]# systemctl disable firewalld 2.安装nginx (web1和web2) [root2 ~]# yum install -y gcc-c pcre pcr…...
自定义实现一个 Redis 客户端
要自定义实现一个 Redis 客户端并支持密码认证,你可以使用 TCP socket 直接与 Redis 服务器进行通信。下面是如何通过 Java 自定义实现一个简单的 Redis 客户端的详细示例,包括如何发送密码进行认证。 Redis 协议概述 Redis 使用一种称为 RESP…...

sql注入——sqlilabs16-26
文章目录 less-163.注入 less-172.数据库名2.1 floor报错注入数据库名 3.查到数据表3.1floor 报错注入数据表 4.查取列名4.1 floor报错注入 列名 5.查取内容 less-181.添加X-Forwarded-For测试2修改User-Agent测试3.查数据表名4.查数据列5.查取数据 less-192.查数据库3.查数据表…...
数据加载工具pg_bulkload插件的介绍
瀚高数据库 目录 环境 文档用途 详细信息 环境 系统平台:Linux x86-64 Red Hat Enterprise Linux 7 版本:12 文档用途 本文档主要介绍pg_bulkload插件的安装与使用。 详细信息 研发公司:NTT OSS Center DBMS Development and Support Team&…...

Windows禁止应用联网
转自两种方法阻止电脑上的软件彻底联网! - 知乎 (zhihu.com) 但为了稳妥,自己还是稍微记录一下 1、创建bat脚本文件 创建文本-将下面的代码填入-保存为.bat文件 Echo Off SetLocal:beginecho: echo ****** 禁止文件夹联网 ****** echo:set /p folder…...

zabbix邮件告警配置
一、报警 触发器的通知信息显示在web管理界面, 运维工程师仍然没办法24小时盯着它。所以我们希望它能自动地 通知工程师们,这就是报警。 zabbix的报警媒介支持email,jabber,sms(短信),微信,电话语音等。 报警过程原理 配置报警信息可以通过邮箱来实现 1、本地邮箱…...
代码随想录算法训练营第 35 天 | LeetCode 416. 分割等和子集
代码随想录算法训练营 Day35 代码随想录算法训练营第 35 天 | LeetCode 416. 分割等和子集 目录 代码随想录算法训练营前言LeetCode416. 分割等和子集 一、LeetCode416. 分割等和子集1.题目链接2.思路3.题解 前言 LeetCode416. 分割等和子集 讲解文档 一、LeetCode416. 分割…...

伪国企是指的什么?
伪国企,也称为虚假国企,主要指的是那些通过不正当手段,如伪造文件、虚假宣传等,误导公众或第三方,使其误认为该企业具有国有企业背景或实际控制权的非国有企业。 一、伪国企类型 具体来说,伪国企可能包括…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...

热烈祝贺埃文科技正式加入可信数据空间发展联盟
2025年4月29日,在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上,可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞,强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...

基于谷歌ADK的 智能产品推荐系统(2): 模块功能详解
在我的上一篇博客:基于谷歌ADK的 智能产品推荐系统(1): 功能简介-CSDN博客 中我们介绍了个性化购物 Agent 项目,该项目展示了一个强大的框架,旨在模拟和实现在线购物环境中的智能导购。它不仅仅是一个简单的聊天机器人,更是一个集…...