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-else、for和while等控制结构,用于根据条件执行命令或控制循环。
#!/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脚本作为一种强大的自动化工具,在现代操作系统中具有广泛的应用。无论是简单的文件操作,还是复杂的系统管理,Shell脚本都能提供高效、快速的解决方案。在本文中,我们将探索Shell脚本的基础知识,并通过实战场…...
【AI视野·今日Sound 声学论文速览 第四十二期】Fri, 5 Jan 2024
AI视野今日CS.Sound 声学论文速览 Fri, 5 Jan 2024 Totally 10 papers 👉上期速览✈更多精彩请移步主页 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 是一个开源的嵌入式关系数据库,实现了自给自足的、无服务器的、配置无…...
kettle的基本介绍和使用
1、 kettle概述 1.1 什么是kettle Kettle是一款开源的ETL工具,纯java编写,可以在Window、Linux、Unix上运行,绿色无需安装,数据抽取高效稳定。 1.2 Kettle核心知识点 1.2.1 Kettle工程存储方式 以XML形式存储以资源库方式存储…...
数据结构第2章 栈和队列
名人说:莫听穿林打叶声,何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 本篇笔记整理:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 0、思维导图栈和队列1、栈1)特点2࿰…...
Axure鲜花商城网站原型图,网上花店订花O2O本地生活电商平台
作品概况 页面数量:共 30 页 兼容软件:仅支持Axure RP 9/10,非程序软件无源代码 应用领域:鲜花网、花店网站、本地生活电商 作品特色 本作品为「鲜花购物商城」网站模板,高保真高交互,属于O2O本地生活电…...
【docker】centos 使用 Nexus Repository 搭建私有仓库
Nexus Repository 是一种流行的软件仓库管理工具,它可以帮助您搭建私有仓库,以便在内部网络或私有云环境中存储、管理和分发各种软件包和组件。 它常被用于搭建Maven的镜像仓库。本文演示如何用Nexus Repository搭建docker 私有仓库。 使用Nexus Repos…...
RabbitMQ(八)消息的序列化
目录 一、为什么需要消息序列化?二、常用的消息序列化方式1)Java原生序列化(默认)2)JSON格式3)Protobuf 格式4)Avro 格式5)MessagePack 格式 三、总结 RabbitMQ 是一个强大的消息中间…...
23款奔驰GLC260L升级原厂540全景影像 安装效果分享
嗨 今天给大家介绍一台奔驰GLC260L升级原厂360全景影像 新款GLC升级原厂360全景影像 也只需要安装前面 左右三个摄像头 后面的那个还是正常用的,不过不一样的是 升级完成之后会有多了个功能 那就是新款透明底盘,星骏汇小许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种传播机制: PROPAGATION_REQUIRED:默认的Spring事物传播级别,若当前存在事务,则加入该事务,若不存在事务,则新建一个事务。 PAOPAGATION_REQUIRE_NEW:若当前没有事务&#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时失败,或者连接不上PLC,你可能需要做以下几点设置才可以。 一般来说每个PLC都有自己的IP地址,如果你的地址与PLC的地址冲突也就是地址重复是连接不上PLC的,如果地址没有冲突,但是不是在一个网段上也会导…...
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(Virtual Local Area Network)即虚拟局域网,是将一个物理的LAN在逻辑上划分成多个广播域的通信技术。VLAN内的主机间可以直接通信,而VLAN间不能直接互通,从而将广播报文限制在一个VLAN内。 VLAN 主要用来解决如何…...
登录验证
目录 会话技术 Cookie Session JWT JWT生成 JWT校验 会话技术 会话 打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求与响应 会话跟踪 一种维护浏览器的方法 服务器需要…...
利用Podman构建基于Fission env/builder的镜像
镜像准备 构建Dockerfile fission的基础环境包括两种:env 以及 builder。如果仅基于code构建function(i.e., 只创建deployachive),仅构建env即可;但如果需要构建sourcearchive,则需要同时创建env和builde…...
php加减乘除函数
目录 第一部分:简单示例 1、加法 2、减法 3、乘法 4、除法 第二部分:官方文档 1、加法 2、减法 3、乘法 4、除法 第一部分:简单示例 1、加法 $result bcadd(1.2, 1.4, 2); echo $result;//2.60 2、减法 $result bcsub(1.6, 1.…...
Go语言学习记录——用正则表达式(regexp包)来校验参数
前言 最近坐毕设ing,简单的一个管理系统。 其中对于用户注册、登录功能,需要进行一些参数校验。 因为之前使用过,因此这里计划使用正则表达式进行校验。但是之前的使用也仅限于使用,因此这次专门进行一次学习,并做此记…...
公司办公电脑文件防泄密系统
电脑文件防泄密系统是一种用于保护企业机密文件的软件系统,它采用一系列的安全技术手段,如数据加密、访问控制、审计跟踪等,来确保企业机密文件不被非法获取、窃取或泄漏。这种系统通常适用于企业、政府机构等需要对重要文件进行保密的机构。…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...
