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. 分割…...
伪国企是指的什么?
伪国企,也称为虚假国企,主要指的是那些通过不正当手段,如伪造文件、虚假宣传等,误导公众或第三方,使其误认为该企业具有国有企业背景或实际控制权的非国有企业。 一、伪国企类型 具体来说,伪国企可能包括…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
