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

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" ]; then
    echo "用户名不能为空!"
    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; do
    new_name=$(date +%Y%m%d)_${counter}.txt
    mv "$file" "$new_name"
    ((counter++))
done


7.流程图说明

Shell脚本执行流程
graph TD
    A[编写脚本] --> B[添加Shebang]
    B --> C[赋予执行权限 chmod +x]
    C --> D[执行脚本 ./script.sh]
    D --> E{是否错误?}
    E -- 是 --> F[调试代码]
    E -- 否 --> G[输出结果]
自动化备份流程
graph LR
    A[开始] --> 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}; do
    user_count=$(wc -l users.txt)
done

# 高效写法
user_count=$(wc -l users.txt)
for i in {1..100}; do
    echo "用户数: $user_count"
done

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

单元测试示例
#!/bin/bash
# 测试函数:计算两数之和
function add() {
    echo $(($1 + $2))
}

# 测试用例
function test_add() {
    result=$(add 3 5)
    if [ "$result" -eq 8 ]; then
        echo "测试通过 ✅"
    else
        echo "测试失败 ❌"
    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" ]; then
    echo "<li>Nginx状态: <span style='color:green;'>运行中</span></li>" >> $report
else
    echo "<li>Nginx状态: <span style='color:red;'>未运行</span></li>" >> $report
fi

# 完成报告
echo "</ul></body></html>" >> $report
echo "报告生成完毕: file://$(pwd)/$report"

 

相关文章:

  • MQTT:深入剖析 paho.mqtt.embedded - c - master 目录结构
  • AcWing 6099. 座位
  • 【网络安全】Linux 命令大全
  • 粒子系统优化完成
  • OpenHarmony如何编译安装系统应用(以settings设置为例)
  • 项目1笔记
  • 如何在 Excel 中处理并拆分你提供的这种混合单位的库存数据。
  • 【1】k8s集群管理系列--包应用管理器之helm
  • Makefile:超简单快速入门(go示例)
  • 京东与喜茶关系破裂:切断所有合作 禁止进入办公场所
  • 安全是基石
  • http页面的加载过程
  • 富士相机照片 RAF 格式如何快速批量转为 JPG 格式教程
  • HarmonyOS:HMPermission权限请求框架
  • 宁德时代25年春招笔试演绎数字推理SHL测评题库
  • Python星球日记 - 第20天:数据分析入门
  • spark集群,Stand alone,Hadoop集群有关启动问题
  • biblatex 的 Biber 警告​​:tex文件运行无法生成参考文献和目录
  • Vue 项目中的package.json各部分的作用和用法的详细说明
  • Cline Memory Bank 结构化文档持久化 AI 上下文详解
  • 苏州网站建设网络推广/域名注册流程和费用
  • 海南网站建设开发/小程序运营推广公司
  • html5做个网站多少钱/成年培训班有哪些
  • 公司网站建设公司排名/营销渠道策划方案
  • 打电话推销做网站的是真的吗/百度关键词挖掘工具
  • 上海闵行网站建设/市场营销策划方案案例