目录
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类型
-
Bash(Bourne-Again Shell):Linux默认Shell,功能强大。
-
Zsh(Z Shell):支持插件和主题,适合交互式使用。
-
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"