当前位置: 首页 > news >正文

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. 实现思路

  • 使用dfmpstatfree等命令提取各种监控指标
  • 将各指标与正常值进行比较,保存异常情况
  • 检查异常记录,若存在则发送告警邮件
  • 设置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、识别英文&#xf…...

pytorch学习一(扩展篇):miniconda下载、安装、配置环境变量。miniconda创建多版本python环境。整理常用命令(亲测ok)

文章目录 前言一、miniconda和anaconda的关系1、Anaconda2、Miniconda3、总结 二、下载miniconda(清华镜像链接)三、安装miniconda1、安装2、或许要手动加载 ~/.bashrc 四、配置 命令1、查看anaconda安装博文2、取消默认进入conda(base&#…...

说一下Android中的IdleHandler

IdleHandler 是 Android 中的一个接口,常用于在主线程空闲时执行一些低优先级的任务。 作用: 它提供了一种在主线程空闲时执行额外操作的机制,能够优化应用的性能和资源利用。 工作原理: 当主线程没有其他任务需要处理&#xff…...

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&#xf…...

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. 分割…...

伪国企是指的什么?

伪国企,也称为虚假国企,主要指的是那些通过不正当手段,如伪造文件、虚假宣传等,误导公众或第三方,使其误认为该企业具有国有企业背景或实际控制权的非国有企业。 一、伪国企类型 具体来说,伪国企可能包括…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...

反射获取方法和属性

Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...