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

Shell脚本入门实战:探索自动化任务与实用场景

引言

Shell脚本作为一种强大的自动化工具,在现代操作系统中具有广泛的应用。无论是简单的文件操作,还是复杂的系统管理,Shell脚本都能提供高效、快速的解决方案。在本文中,我们将探索Shell脚本的基础知识,并通过实战场景示例,一起深入了解Shell脚本编程。

1. Shell脚本入门

Shell是用户与操作系统内核之间的接口,而Shell脚本是一种将Shell命令组织起来,以实现特定功能的文本文件。将介绍Shell脚本的基本语法和结构。

1.1 基础语法

Shell脚本以 #!/bin/bash 开头,用来指定脚本解释器。接下来是一系列命令,可以使用变量、条件语句、循环等。

#!/bin/bash# 定义变量并输出
name="World"
echo "Hello, $name!"
1.2 控制结构

Shell脚本支持if-elseforwhile等控制结构,用于根据条件执行命令或控制循环。

#!/bin/bash# 使用if-else判断条件
age=25
if [ "$age" -ge 18 ]; thenecho "You are an adult."
elseecho "You are a minor."
fi
1.3 变量和输入

用Shell脚本获取用户输入的变量,对变量进行操作。

#!/bin/bash# 获取用户输入
echo "Enter your name: "
read name# 输出变量内容
echo "Hello, $name! Welcome to Shell scripting."# 数值计算和变量操作
num1=10
num2=5sum=$((num1 + num2))
echo "Sum of $num1 and $num2 is: $sum"# 字符串操作
greeting="Hello"
greet="$greeting, $name!"
echo "$greet"

1.5 循环结构

使用循环结构进行迭代和重复操作。

#!/bin/bash# 使用for循环输出数字序列
echo "Counting from 1 to 5:"
for i in {1..5}
doecho "$i"
done# 使用while循环输出数字序列
echo "Counting from 5 to 1:"
counter=5
while [ $counter -gt 0 ]
doecho "$counter"((counter--))
done

2. 实战场景示例

2.1 批量文件重命名
#!/bin/bash# 源文件目录
source_dir="/path/to/source"# 批量重命名文件
for file in "$source_dir"/old_*
donew_name="${file/old_/new_}"mv "$file" "$new_name"echo "Renamed $file to $new_name"
done

2.2 数据备份和清理

编写一个脚本,备份指定目录的数据到远程服务器,并保留一定数量的备份副本,同时删除旧的备份文件。

#!/bin/bash# 远程备份服务器信息
remote_server="user@remote_server"
backup_dir="/path/to/remote/backup"# 本地备份信息
source_dir="/path/to/source"
local_backup_dir="/path/to/local/backup"
backup_count=5# 创建本地备份目录
mkdir -p "$local_backup_dir"# 备份数据到远程服务器
rsync -avz "$source_dir" "$remote_server:$backup_dir/backup_$(date +"%Y%m%d%H%M%S")"# 保留一定数量的本地备份副本,删除旧备份
backup_files=$(ls -t "$local_backup_dir" | grep -E 'backup_[0-9]{14}' | tail -n +"$((backup_count + 1))")
for file in $backup_files
dorm "$local_backup_dir/$file"echo "Deleted old backup: $file"
done
2.3 查找并删除特定类型的文件 
#!/bin/bash# 指定目录和文件类型
directory="/path/to/directory"
file_extension=".log"# 查找并删除特定类型的文件
find "$directory" -type f -name "*$file_extension" -delete
echo "Deleted all $file_extension files in $directory"
2.4 计算文件行数并输出最大行数的文件 
#!/bin/bash# 指定目录
directory="/path/to/directory"# 计算每个文件的行数并输出最大行数的文件
max_lines=0
max_file=""
for file in "$directory"/*
doif [ -f "$file" ]; thenlines=$(wc -l < "$file")if [ "$lines" -gt "$max_lines" ]; thenmax_lines=$linesmax_file=$filefifi
doneecho "File with the most lines: $max_file"
echo "Number of lines: $max_lines"
2.5 日志文件分析

分析日志文件,并显示最常见的错误。

#!/bin/bash# 分析日志文件中的错误
log_file="/path/to/logfile.log"echo "Top 5 Errors:"
grep -E "ERROR" "$log_file" | cut -d" " -f5- | sort | uniq -c | sort -nr | head -n 5
2.6 自动化Git仓库备份

自动备份Git仓库到指定目录。

#!/bin/bash# 源Git仓库和备份目录
source_repo="/path/to/source_repo"
backup_dir="/path/to/backup"# 创建备份目录(如果不存在)
mkdir -p "$backup_dir"# 进入源Git仓库目录,执行备份操作
cd "$source_repo" || exit
git bundle create "$backup_dir/source_repo_$(date +"%Y%m%d%H%M%S").bundle" --all
echo "Backup completed!"
2.7 网络检测和报警

检测特定主机的可用性,并在不可用时发送警报通知。

#!/bin/bash# 主机和端口信息
host="example.com"
port=80# 检测主机可用性
nc -z -w 5 "$host" "$port"
if [ $? -eq 0 ]; thenecho "Host is reachable."
elseecho "Host is unreachable. Sending alert..."# 调用发邮件或短信的接口
fi
2.8 数据库备份与清理

备份数据库并保留一定数量的备份副本。

#!/bin/bash# 数据库备份目录和备份数量
backup_dir="/path/to/db_backup"
backup_count=5# 备份数据库
mysqldump -u username -p password database_name > "$backup_dir/backup_$(date +"%Y%m%d%H%M%S").sql"# 保留一定数量的备份副本,删除旧备份
cd "$backup_dir" || exit
ls -t | tail -n +"$((backup_count + 1))" | xargs rm --
echo "Database backup completed and old backups cleaned."

3. Shell脚本进阶

4.1 数据处理与分析

使用Shell脚本处理和分析数据文件。假设我们有一个包含学生成绩的文本文件,我们想计算平均分和最高分。

#!/bin/bash# 数据文件
data_file="student_scores.txt"# 计算平均分和最高分
total=0
count=0
highest=0while IFS= read -r line
doscore=$(echo "$line" | awk '{print $2}')total=$((total + score))((count++))if [ "$score" -gt "$highest" ]; thenhighest=$scorefi
done < "$data_file"average=$((total / count))
echo "Average score: $average"
echo "Highest score: $highest"

4.2 服务端口探活

使用nc(netcat)或telnet等工具进行端口连接测试。

#!/bin/bash# 指定要检测的主机和端口
host="example.com"
port=80# 检测端口是否可达
nc -z -w 5 "$host" "$port"# 检查nc命令的退出状态码
if [ $? -eq 0 ]; thenecho "Port $port on $host is reachable."
elseecho "Port $port on $host is not reachable."# 执行重启脚本,重启服务
fi
 4.3 shell脚本消费kakfa并推送到接口里
#!/bin/bash# Kafka消费者配置
kafka_server="kafka-server:9092"
topic="test_topic"
group_id="group_name"# 消费消息
kafka-console-consumer.sh --bootstrap-server "$kafka_server" --topic "$topic" --group "$group_id" --from-beginning | while read message
doecho "Received message: $message"# 使用curl将消息推送到目标接口curl -X POST -H "Content-Type: application/json" -d "$message" https://localhost:8080/sendToTopicecho "Message sent to API endpoint."
done

4. 结语

Shell脚本是Unix和Linux系统中强大的自动化工具。通过基础知识、实战场景和高级技术,可以简化各种任务,从文件操作到系统管理。掌握Shell脚本,可以提高工作效率,并为处理复杂任务提供强大支持。希望这些示例能够帮助大家更好地理解并运用Shell脚本,实现各种复杂任务的自动化和优化。

相关文章:

Shell脚本入门实战:探索自动化任务与实用场景

引言 Shell脚本作为一种强大的自动化工具&#xff0c;在现代操作系统中具有广泛的应用。无论是简单的文件操作&#xff0c;还是复杂的系统管理&#xff0c;Shell脚本都能提供高效、快速的解决方案。在本文中&#xff0c;我们将探索Shell脚本的基础知识&#xff0c;并通过实战场…...

【AI视野·今日Sound 声学论文速览 第四十二期】Fri, 5 Jan 2024

AI视野今日CS.Sound 声学论文速览 Fri, 5 Jan 2024 Totally 10 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers PosCUDA: Position based Convolution for Unlearnable Audio Datasets Authors Vignesh Gokul, Shlomo Dubnov深度学习模型需要大量干净的…...

Java中如何使用SQLite数据库

目录 SQLite简介SQLite优势安装 SQLite基本使用Java使用SQLite Springboot使用SQLite1.添加依赖2.配置数据库3.创建实体类 4.创建Repository接口5.创建控制器6.运行应用程序 SQLite简介 SQLite 是一个开源的嵌入式关系数据库&#xff0c;实现了自给自足的、无服务器的、配置无…...

kettle的基本介绍和使用

1、 kettle概述 1.1 什么是kettle Kettle是一款开源的ETL工具&#xff0c;纯java编写&#xff0c;可以在Window、Linux、Unix上运行&#xff0c;绿色无需安装&#xff0c;数据抽取高效稳定。 1.2 Kettle核心知识点 1.2.1 Kettle工程存储方式 以XML形式存储以资源库方式存储…...

数据结构第2章 栈和队列

名人说&#xff1a;莫听穿林打叶声&#xff0c;何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 本篇笔记整理&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 0、思维导图栈和队列1、栈1&#xff09;特点2&#xff0…...

Axure鲜花商城网站原型图,网上花店订花O2O本地生活电商平台

作品概况 页面数量&#xff1a;共 30 页 兼容软件&#xff1a;仅支持Axure RP 9/10&#xff0c;非程序软件无源代码 应用领域&#xff1a;鲜花网、花店网站、本地生活电商 作品特色 本作品为「鲜花购物商城」网站模板&#xff0c;高保真高交互&#xff0c;属于O2O本地生活电…...

【docker】centos 使用 Nexus Repository 搭建私有仓库

Nexus Repository 是一种流行的软件仓库管理工具&#xff0c;它可以帮助您搭建私有仓库&#xff0c;以便在内部网络或私有云环境中存储、管理和分发各种软件包和组件。 它常被用于搭建Maven的镜像仓库。本文演示如何用Nexus Repository搭建docker 私有仓库。 使用Nexus Repos…...

RabbitMQ(八)消息的序列化

目录 一、为什么需要消息序列化&#xff1f;二、常用的消息序列化方式1&#xff09;Java原生序列化&#xff08;默认&#xff09;2&#xff09;JSON格式3&#xff09;Protobuf 格式4&#xff09;Avro 格式5&#xff09;MessagePack 格式 三、总结 RabbitMQ 是一个强大的消息中间…...

23款奔驰GLC260L升级原厂540全景影像 安装效果分享

嗨 今天给大家介绍一台奔驰GLC260L升级原厂360全景影像 新款GLC升级原厂360全景影像 也只需要安装前面 左右三个摄像头 后面的那个还是正常用的&#xff0c;不过不一样的是 升级完成之后会有多了个功能 那就是新款透明底盘&#xff0c;星骏汇小许Xjh15863 左右两边只需要更换后…...

【CSS】文字描边的三种实现方式

目录 1. 可行的几种方式1.1. text-shadow 描边代码优缺点 1.2. text-stroke 描边实现优缺点 1.3. svg 描边实现优缺点 总结 1. 可行的几种方式 text-shadow–webkit-text-strokesvg 1.1. text-shadow 描边 MDN text-shadow 代码 <div class"text stroke">…...

【事务】事务传播级别

Spring事务定义了7种传播机制&#xff1a; PROPAGATION_REQUIRED&#xff1a;默认的Spring事物传播级别&#xff0c;若当前存在事务&#xff0c;则加入该事务&#xff0c;若不存在事务&#xff0c;则新建一个事务。 PAOPAGATION_REQUIRE_NEW&#xff1a;若当前没有事务&#x…...

Android WiFi 连接

Android WiFi 连接 1、设置中WiFi显示2、WiFi 连接流程2.1 获取PrimaryClientModeManager2.2 ClientModeImpl状态机ConnectableState2.3 ISupplicantStaNetworkCallback 回调监听 3、 简要时序图4、原生低层驱动5、关键日志 1、设置中WiFi显示 Android WiFi基础概览 packages/a…...

PLC与上位机PN通讯时,如何防止连接失败?

连接西门子PLC时失败&#xff0c;或者连接不上PLC&#xff0c;你可能需要做以下几点设置才可以。 一般来说每个PLC都有自己的IP地址&#xff0c;如果你的地址与PLC的地址冲突也就是地址重复是连接不上PLC的&#xff0c;如果地址没有冲突&#xff0c;但是不是在一个网段上也会导…...

LDD学习笔记 -- Linux错误码

LDD学习笔记 -- Linux错误码 EACCES(Permission Denied) 13EEXIST(File Exits) 17EINVAL(Invalid Argument) 22ENOENT(No Such File or Directory)ENOMEM(Out of Memory)EIO(Input/Output Error) 5ENOSPC(No space Left on Device)ENOTTY(Not a Typewrite)EPIPE(Broken Pipe)EI…...

华为交换机入门(六):VLAN的配置

VLAN&#xff08;Virtual Local Area Network&#xff09;即虚拟局域网&#xff0c;是将一个物理的LAN在逻辑上划分成多个广播域的通信技术。VLAN内的主机间可以直接通信&#xff0c;而VLAN间不能直接互通&#xff0c;从而将广播报文限制在一个VLAN内。 VLAN 主要用来解决如何…...

登录验证

目录 会话技术 Cookie Session JWT JWT生成 JWT校验 会话技术 会话 打开浏览器&#xff0c;访问web服务器的资源&#xff0c;会话建立&#xff0c;直到有一方断开连接&#xff0c;会话结束。在一次会话中可以包含多次请求与响应 会话跟踪 一种维护浏览器的方法 服务器需要…...

利用Podman构建基于Fission env/builder的镜像

镜像准备 构建Dockerfile fission的基础环境包括两种&#xff1a;env 以及 builder。如果仅基于code构建function&#xff08;i.e., 只创建deployachive&#xff09;&#xff0c;仅构建env即可&#xff1b;但如果需要构建sourcearchive&#xff0c;则需要同时创建env和builde…...

php加减乘除函数

目录 第一部分&#xff1a;简单示例 1、加法 2、减法 3、乘法 4、除法 第二部分&#xff1a;官方文档 1、加法 2、减法 3、乘法 4、除法 第一部分&#xff1a;简单示例 1、加法 $result bcadd(1.2, 1.4, 2); echo $result;//2.60 2、减法 $result bcsub(1.6, 1.…...

Go语言学习记录——用正则表达式(regexp包)来校验参数

前言 最近坐毕设ing&#xff0c;简单的一个管理系统。 其中对于用户注册、登录功能&#xff0c;需要进行一些参数校验。 因为之前使用过&#xff0c;因此这里计划使用正则表达式进行校验。但是之前的使用也仅限于使用&#xff0c;因此这次专门进行一次学习&#xff0c;并做此记…...

公司办公电脑文件防泄密系统

电脑文件防泄密系统是一种用于保护企业机密文件的软件系统&#xff0c;它采用一系列的安全技术手段&#xff0c;如数据加密、访问控制、审计跟踪等&#xff0c;来确保企业机密文件不被非法获取、窃取或泄漏。这种系统通常适用于企业、政府机构等需要对重要文件进行保密的机构。…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...