Shell脚本编程

目录

1. Shell脚本概述

什么是Shell?

Shell的作用

常见的Shell类型

2. 环境搭建与安装

Linux系统

macOS系统

Windows系统

3.安装并配置Zsh(macOS/Linux)

4. Shell基础语法

变量与数据类型

输入交互

5. Shell脚本进阶

进程管理

错误处理与调试

6. Shell脚本实战案例(扩展)

日志分析工具

批量重命名文件

7.流程图说明

Shell脚本执行流程

自动化备份流程

8. 疑难问题与解决方案(扩展)

跨平台路径问题

性能优化示例

7. Shell脚本的维护与优化(扩展)

单元测试示例

8. Shell在DevOps中的应用(扩展)

Docker容器管理脚本

完整实战项目:服务器健康检查工具


1. Shell脚本概述

什么是Shell?

Shell是用户与操作系统内核之间的接口,负责解析用户输入的命令并执行。它既是一个命令行解释器,也是一种脚本语言,能够通过编写脚本实现复杂的自动化任务。

Shell的作用
  • 系统管理:批量处理文件、用户权限管理、服务监控。

  • 自动化运维:日志切割、备份恢复、软件部署。

  • 开发辅助:编译构建、测试环境搭建、数据预处理。

常见的Shell类型
  1. Bash(Bourne-Again Shell):Linux默认Shell,功能强大。

  2. Zsh(Z Shell):支持插件和主题,适合交互式使用。

  3. Ksh(Korn Shell):兼容Bash,适合企业级脚本。


2. 环境搭建与安装

Linux系统
  • 默认已安装Bash,通过echo $SHELL查看当前Shell。

  • 切换Shell:chsh -s /bin/zsh

macOS系统
  • 默认使用Zsh(Catalina及以后版本),旧版为Bash。

  • 安装Bash:brew install bash

Windows系统

3.安装并配置Zsh(macOS/Linux)

  • WSL(Windows Subsystem for Linux):直接运行Linux环境。

  • Cygwin:提供类Unix环境的模拟器。

  •  启用WSL功能

    dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
  • 安装Ubuntu

    • 从Microsoft Store下载Ubuntu发行版。

    • 启动并设置用户名/密码。

  • 安装Zsh:
    sudo apt update && sudo apt upgrade -y
  • 设置为默认Shell

    chsh -s $(which zsh)
  • 安装Oh My Zsh

    chsh -s $(which zsh)
  • 更新系统

    sudo apt update && sudo apt upgrade -y

4. Shell基础语法

变量与数据类型
#!/bin/bash
# 环境变量 vs 局部变量
global_var="Global"  # 当前Shell进程有效
function test_vars() {local local_var="Local"  # 仅在函数内有效echo "函数内: $global_var, $local_var"
}
test_vars
echo "函数外: $global_var, $local_var"  # 输出: 函数外: Global, (空)
输入交互
#!/bin/bash
# 读取用户输入并验证
read -p "请输入用户名: " username
if [ -z "$username" ]; thenecho "用户名不能为空!"exit 1
fi
echo "欢迎, $username!"

5. Shell脚本进阶

进程管理
#!/bin/bash
# 后台运行进程并记录PID
nohup python3 app.py > app.log 2>&1 &
echo "应用已启动,PID: $!"# 根据PID终止进程
kill -9 $!
错误处理与调试
#!/bin/bash
set -euo pipefail  # 严格模式:错误退出、未定义变量报错、管道错误检测
trap 'echo "脚本被中断!"; exit 1' INT TERM  # 捕获中断信号# 模拟错误
invalid_command
echo "此行不会执行"

6. Shell脚本实战案例(扩展)

日志分析工具
#!/bin/bash
# 统计Nginx日志中状态码为404的请求
logfile="/var/log/nginx/access.log"
output="404_errors.csv"echo "时间,客户端IP,请求路径" > $output
grep ' 404 ' $logfile | awk '{print $4","$1","$7}' >> $output
echo "分析完成,结果保存至 $output"
批量重命名文件
#!/bin/bash
# 将目录下所有.txt文件按日期重命名
counter=1
for file in *.txt; donew_name=$(date +%Y%m%d)_${counter}.txtmv "$file" "$new_name"((counter++))
done


7.流程图说明

Shell脚本执行流程
graph TDA[编写脚本] --> B[添加Shebang]B --> C[赋予执行权限 chmod +x]C --> D[执行脚本 ./script.sh]D --> E{是否错误?}E -- 是 --> F[调试代码]E -- 否 --> G[输出结果]
自动化备份流程
graph LRA[开始] --> B[检查备份目录是否存在]B -- 不存在 --> C[创建目录]B -- 存在 --> D[压缩源目录]D --> E[生成带时间戳的备份文件]E --> F[验证备份完整性]F -- 成功 --> G[发送成功通知]F -- 失败 --> H[告警管理员]G --> I[结束]H --> I

8. 疑难问题与解决方案(扩展)

跨平台路径问题
  • 问题:Windows与Linux路径斜杠(\ vs /)不兼容。

  • 解决:在脚本中使用${var//\\//}转换路径格式:

    win_path="C:\\Users\\demo"
    unix_path=$(echo $win_path | sed 's/\\/\//g')
    echo $unix_path  # 输出: C:/Users/demo
性能优化示例
# 避免在循环中频繁调用外部命令
# 低效写法
for i in {1..100}; douser_count=$(wc -l users.txt)
done# 高效写法
user_count=$(wc -l users.txt)
for i in {1..100}; doecho "用户数: $user_count"
done

7. Shell脚本的维护与优化(扩展)

单元测试示例
#!/bin/bash
# 测试函数:计算两数之和
function add() {echo $(($1 + $2))
}# 测试用例
function test_add() {result=$(add 3 5)if [ "$result" -eq 8 ]; thenecho "测试通过 ✅"elseecho "测试失败 ❌"fi
}test_add

8. Shell在DevOps中的应用(扩展)

Docker容器管理脚本
#!/bin/bash
# 批量清理退出的容器
docker rm $(docker ps -aq -f "status=exited")# 更新所有运行中的容器
docker compose pull && docker compose up -d

完整实战项目:服务器健康检查工具

#!/bin/bash
# 功能:检查CPU、内存、磁盘、服务状态
# 输出HTML报告
report="server_health_$(date +%Y%m%d).html"# 生成HTML头部
echo "<html><body><h1>服务器健康报告</h1><ul>" > $report# 检查CPU负载
cpu_load=$(uptime | awk -F 'load average:' '{print $2}')
echo "<li>CPU负载: $cpu_load</li>" >> $report# 检查内存使用
mem_free=$(free -m | awk '/Mem/{print $4}')
echo "<li>剩余内存: ${mem_free}MB</li>" >> $report# 检查Nginx服务状态
nginx_status=$(systemctl is-active nginx)
if [ "$nginx_status" = "active" ]; thenecho "<li>Nginx状态: <span style='color:green;'>运行中</span></li>" >> $report
elseecho "<li>Nginx状态: <span style='color:red;'>未运行</span></li>" >> $report
fi# 完成报告
echo "</ul></body></html>" >> $report
echo "报告生成完毕: file://$(pwd)/$report"

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/76361.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学生管理系统(Python)

运行结果&#xff1a; 源代码&#xff1a; """ 项目&#xff1a;类似于学生管理系统---增删改查 """ #封装一个学生类 import random class Student: def __init__(self,stuid,name,score): self.stuid stuid self.name name self.score …

电商素材革命:影刀RPA魔法指令3.0驱动批量去水印,实现秒级素材净化

本文 去除水印实操视频展示电商图片水印处理的困境​影刀 RPA 魔法指令 3.0 强势登场​利用魔法指令3.0两步实现去除水印操作关于影刀RPA 去除水印实操视频展示 我们这里选择了4张小红书里面比较帅气的图片&#xff0c;但凡用过小红书的都知道&#xff0c;小红书右下角是会有小…

Seq2Seq - GRU补充讲解

nn.GRU 是 PyTorch 中实现门控循环单元&#xff08;Gated Recurrent Unit, GRU&#xff09;的模块。GRU 是一种循环神经网络&#xff08;RNN&#xff09;的变体&#xff0c;用于处理序列数据&#xff0c;能够更好地捕捉长距离依赖关系。 ⭐重点掌握输入输出部分输入张量&#…

设计模式-观察者模式和发布订阅模式区别

文章目录 其他不错的文章 二者有类似的地方&#xff0c;也有区别。 引用的文章说的已经比较清楚了&#xff0c;这里只列出对比图。 对比点观察者模式发布订阅模式中间人角色无事件中心&#xff0c;观察者直接订阅目标有事件中心&#xff0c;发布者与订阅者通过事件中心通信关系…

【SQL】基于多源SQL 去重方法对比 -- 精华版

【SQL】基于SQL 去重方法对比 -- 精华版 一、引言二、基于SQL去重方法完整对比1. MySQL去重方法及优劣势1.1 ​DISTINCT关键字1.2 GROUP BY子句1.3 UNION系列操作1.4 子查询 自关联 2. Hive去重方法及优劣势2.1 DISTINCT关键字2.2 ​GROUP BY子句2.3 ​ROW_NUMBER窗口函数2.4 …

电脑命名配置很高,为什么运行软件特别卡

估计很多同学都碰见过这种情况&#xff0c;以我的Redmi G为例&#xff0c;I9-14待CPU&#xff0c;又换了一条内存条&#xff0c;现有配置I9-14900&#xff0c;40G内存5200MT/s&#xff0c;4060显卡&#xff0c;为啥运行两个办公软件就卡的不行&#xff0c;风扇狂转&#xff0c;…

Spring Boot默认注册的转换器列表及其功能说明。这些转换器使得控制器方法可以直接接收Integer、Long、Date等类型参数,无需手动实现转换

以下是Spring Boot默认注册的转换器列表及其功能说明。这些转换器使得控制器方法可以直接接收Integer、Long、Date等类型参数&#xff0c;无需手动实现转换&#xff1a; 默认转换器列表及功能 1. 基础类型转换器 转换器名称功能示例场景StringToIntegerConverter将字符串转换…

chrome提示https不安全, 不能记住账号密码怎么办? 可以利用js输入账号

背景: 在内网搭建的服务, 由于https证书问题, 可能会被chrome浏览器提示不安全 此时, 默认的记住账号密码功能就无法使用, 那么此时只能手动输入了吗? 想到了几种方案 1.利用外置软件, 模拟按键输入(比如按键精灵, 缺点是依赖外部软件, 运行速度也慢, 且执行时占用了输入焦…

探秘Transformer系列之(25)--- KV Cache优化之处理长文本序列

探秘Transformer系列之&#xff08;25&#xff09;— KV Cache优化之处理长文本序列 文章目录 探秘Transformer系列之&#xff08;25&#xff09;--- KV Cache优化之处理长文本序列0x00 概述0x01 优化依据1.1 稀疏性1.2 重要性1.3 小结 0x02 稀疏化1.1 分类1.2 静态稀疏化1.2.1…

【开发经验】结合实际问题解决详述HTTPS通信过程

最近的开发调试过程中涉及到了HTTPS发送与接收&#xff0c;遇到实际问题才发现对这部分尚属于一知半解。结合实际问题的解决过程来详细整理以下HTTPS通信过程。 需要调试的功能为BMC作为客户端向搭建好的Web服务器发送HTTPS请求&#xff0c;Web服务器负责接收处理发送过来的HT…

【Android】Android Activity 横屏设置详解及常见异常问题解决方法汇总

在 Android 开发中&#xff0c;我们经常需要控制 Activity 的屏幕方向&#xff0c;例如视频播放、游戏、VR/AR 应用等场景通常希望默认横屏显示。本文将讲解如何通过 Manifest 配置 和 Java/Kotlin 代码 设置横屏显示&#xff0c;并分析常见设置无效的原因与解决方法。 一、通过…

文件相关:echo重定向管道命令扩展详解

一、echo 文字内容 echo 会在终端中显示参数指定的文字&#xff0c;通常会和 重定向 联合使用 二、重定向 > 和 >> Linux 允许将命令执行结果 重定向到一个 文件将本应显示在终端上的内容 输出 / 追加 到指定文件中 其中&#xff1a; >表示输出&#xff0c;会覆…

Python 中使用单例模式

有这么一种场景&#xff0c;Web服务中有一个全局资源池&#xff0c;在需要使用的地方就自然而言引用该全局资源池即可&#xff0c;此时可以将该资源池以单例模式实现。随后&#xff0c;需要为某一特殊业务场景专门准备一个全局资源池&#xff0c;于是额外复制一份代码新建了一个…

websocket深入-webflux+websocket

文章目录 背景版本约定配置文件代码使用webflux使用websocket配置文件handler基类实现类注册路由 背景 基于更复杂的情况和更高的开发要求&#xff0c;我们可能会遇到必须同时要使用webflux和websocket的情况。 版本约定 JDK21Springboot 3.2.0Fastjson2lombok 配置文件 &…

致远OA —— 表单数据获取(前端)

文章目录 :apple: 业务需求描述 &#x1f34e; 业务需求描述 测试案例&#xff1a; https://pan.quark.cn/s/3f58972f0a27 官网地址&#xff1a; 需求描述&#xff1a; 点击获取数据接口&#xff0c;调用后台&#xff0c;将从后台查询到的数据回写到表单的内容中。 如下…

51c嵌入式~继电器~合集1

我自己的原文哦~ https://blog.51cto.com/whaosoft/13775821 一、继电器应用细节 继电器的应用&#xff0c;相信大家都知道&#xff0c;在电路中只要给它供电、断电也就可以工作了。本文讨论它的应用细节。 现在流行的接法 图中&#xff0c;继电器的线圈经过Q1作为开关&am…

前端性能优化核弹级方案:CSS分层渲染+Wasm,首屏提速300%!

前端性能优化核弹级方案&#xff1a;CSS分层渲染Wasm实现首屏提速300%的终极指南 在当今Web应用日益复杂的背景下&#xff0c;性能优化已成为前端开发的核心竞争力。本文将深入剖析两种革命性的前端性能优化技术——CSS分层渲染与WebAssembly(Wasm)的协同应用&#xff0c;揭示…

初识Redis · 简单理解Redis

目录 前言&#xff1a; 分布式系统 开源节流 认识Redis 负载均衡 缓存 微服务 前言&#xff1a; 本文只是作为Redis的一篇杂谈&#xff0c;简单理解一下Redis为什么要存在&#xff0c;以及它能做到和它不能做到的事儿&#xff0c;简单提及一下它对应的优势有什么&#…

网络通讯协议UDP转发TCP工具_UdpToTcpRelay_双向版

UDP/TCP网络转发器程序说明书 1. 程序概述 本程序是一个高性能网络数据转发工具&#xff0c;支持UDP和TCP协议之间的双向数据转发&#xff0c;并具备以下核心功能&#xff1a; 协议转换&#xff1a;实现UDP↔TCP协议转换数据转换&#xff1a;支持十六进制/ASCII格式的数据转…

MCP 服务搭建与配置学习资源部分汇总

MCP 服务搭建与配置学习资源汇总 目录 图文教程GitHub 示例项目视频课程不同开发语言实现案例 图文教程 Cherry Studio 配置 MCP 服务教程 – 介绍如何在 Cherry Studio 客户端中配置 MCP 服务器&#xff0c;让 AI 模型能够自主调用本地/网络工具来完成任务&#xff0c;提升…