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,简单的一个管理系统。 其中对于用户注册、登录功能,需要进行一些参数校验。 因为之前使用过,因此这里计划使用正则表达式进行校验。但是之前的使用也仅限于使用,因此这次专门进行一次学习,并做此记…...

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

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

QT开发技术【ffmpeg + QAudioOutput】音乐播放器
一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下,音视频内容犹如璀璨繁星,点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频,到在线课堂中知识渊博的专家授课,再到影视平台上扣人心弦的高清大片,音…...
书籍“之“字形打印矩阵(8)0609
题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...

Linux-进程间的通信
1、IPC: Inter Process Communication(进程间通信): 由于每个进程在操作系统中有独立的地址空间,它们不能像线程那样直接访问彼此的内存,所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...

小智AI+MCP
什么是小智AI和MCP 如果还不清楚的先看往期文章 手搓小智AI聊天机器人 MCP 深度解析:AI 的USB接口 如何使用小智MCP 1.刷支持mcp的小智固件 2.下载官方MCP的示例代码 Github:https://github.com/78/mcp-calculator 安这个步骤执行 其中MCP_ENDPOI…...