shell 脚本(千字长文)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

前言:为什么学习 Shell 脚本?

在数字时代,自动化是提升工作效率的核心工具之一。无论是开发人员、系统管理员,还是普通用户,shell 脚本都是实现任务自动化、简化重复操作的重要手段。它如同一位隐形的助手,能够快速执行复杂指令、管理文件、监控系统状态,甚至与编程语言协作完成高级任务。对于编程初学者而言,学习 shell 脚本是理解操作系统底层逻辑的第一步;对于中级开发者,则能通过它优化工作流程,提升技术栈的全面性。

Shell 脚本基础语法:从零开始构建自动化工具

什么是 Shell 脚本?

Shell 脚本是基于命令行环境编写的程序,通过组合系统命令和逻辑控制语句,实现特定功能。它类似一个“指令合集”,告诉计算机按顺序执行一系列操作。例如,你可以用它批量重命名文件、定时清理日志,甚至部署整个 Web 应用。

第一个 Shell 脚本:Hello World

创建一个名为 hello.sh 的文件,输入以下内容:

#!/bin/bash
echo "Hello, Shell Script World!"

保存后赋予执行权限:

chmod +x hello.sh

运行脚本:

./hello.sh

关键点解释

  • #!/bin/bash:声明解释器路径,确保系统用 Bash 解析脚本。
  • echo:输出命令,相当于 Python 的 print()
  • chmod +x:添加可执行权限,使脚本可直接运行。

变量与赋值:数据存储的“盒子”

变量是存储信息的容器,例如:

name="Alice"
age=25
echo "My name is $name, I'm $age years old."

注意事项

  • 变量名不区分大小写,但推荐统一风格。
  • 使用 $ 符号引用变量值,如 $name
  • 环境变量(如 PATH)是全局的,位置变量(如 $1)用于接收脚本参数。

变量替换与运算符

full_name="${name}_Smith"  # Alice_Smith

result=$(( 5 + 3 * 2 ))    # 11

输入与输出:与用户的对话

通过 read 命令获取用户输入:

echo "请输入你的名字:"
read user_name
echo "欢迎你,$user_name!"

重定向符号可控制输出流向:

echo "日志信息" >> log.txt

command > output.txt 2>&1

Shell 脚本进阶:流程控制与逻辑判断

条件语句:决策树的构建

if 语句根据条件执行不同代码块:

number=10
if [ $number -gt 5 ]; then
    echo "数字大于5"
elif [ $number -eq 5 ]; then
    echo "数字等于5"
else
    echo "数字小于5"
fi

符号与运算符

  • -eq:等于(equal)
  • -ne:不等于(not equal)
  • -gt:大于(greater than)
  • 字符串比较用 ===,例如 [ "$str" = "hello" ]

循环结构:重复任务的自动化

For 循环:已知次数的迭代

for i in 1 2 3 4 5; do
    echo "当前数值:$i"
done

While 循环:条件满足时持续执行

count=0
while [ $count -lt 3 ]; do
    echo "计数器:$count"
    count=$((count + 1))
done

Until 循环:直到条件成立才停止

num=0
until [ $num -eq 5 ]; do
    echo "当前值:$num"
    num=$((num + 1))
done

函数:代码复用的“工具箱”

函数将重复逻辑封装,提高可读性:

greet() {
    echo "你好,我是 $1!"  # $1 表示第一个参数
}

greet Alice
greet Bob

函数高级用法

add_numbers() {
    sum=$(( $1 + $2 ))
    return $sum           # 返回数值
}

add_numbers 3 5
result=$?                 # 获取返回值
echo "计算结果:$result"  # 输出 8

Shell 脚本实战:自动化文件管理

案例 1:批量重命名文件

假设需要将 *.txt 文件重命名为 backup_*.txt

for file in *.txt; do
    new_name="backup_$file"
    mv "$file" "$new_name"
done

案例 2:定时清理日志文件

创建 clean_logs.sh 脚本:

find /var/log/ -type f -name "*.log" -mtime +7 -exec rm -f {} \;

结合 cron 定时任务,实现每日凌晨 2 点执行:

0 2 * * * /path/to/clean_logs.sh

案例 3:系统监控脚本

监控磁盘使用率并发送警报:

disk_usage=$(df / | awk '{print $5}' | tail -n1 | sed 's/%//')
if [ $disk_usage -gt 90 ]; then
    echo "磁盘使用率过高:${disk_usage}%" | mail -s "警报" admin@example.com
fi

Shell 脚本高级技巧:错误处理与调试

错误处理:预见问题的“保险丝”

使用 set -e 使脚本在出错时立即终止:

set -e
mkdir /nonexistent_dir  # 若目录不存在会终止脚本
echo "此行不会执行"

捕获错误码:

command_to_run || {
    echo "命令执行失败,错误码:$?"
    exit 1
}

调试技巧:追踪脚本运行轨迹

  • 在脚本开头添加 set -x,显示每一步执行的命令:

    set -x
    echo "调试模式已开启"
    
  • 使用 trap 捕获信号,例如:

    trap 'echo "脚本被终止"' SIGINT
    

Shell 脚本与编程语言的协作:扩大生态边界

调用 Python 脚本

python_script_output=$(python3 my_script.py --arg value)
echo "Python 返回结果:$python_script_output"

与 AWS CLI 结合

自动创建 S3 存储桶:

aws s3 mb s3://$BUCKET_NAME

使用 JSON 解析工具 jq

处理 API 响应:

curl -s https://api.example.com/data | jq '.items[].name'

结论:持续学习与实践

掌握 shell 脚本不仅是技术能力的提升,更是工作效率的革命。从基础语法到高级技巧,每个环节都需要通过实际项目巩固。建议读者从简单任务开始,逐步挑战复杂场景,例如:

  1. 自动化部署 Web 应用
  2. 编写 CI/CD 管道
  3. 开发自定义监控工具

记住,shell 脚本的核心价值在于将重复劳动转化为可复用的自动化流程。当你熟练使用它时,会发现它像一位默契的伙伴,默默提升你的生产力。保持好奇心,不断探索新命令和组合方式,你的技术之路将越走越宽广。

最新发布