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 脚本不仅是技术能力的提升,更是工作效率的革命。从基础语法到高级技巧,每个环节都需要通过实际项目巩固。建议读者从简单任务开始,逐步挑战复杂场景,例如:
- 自动化部署 Web 应用
- 编写 CI/CD 管道
- 开发自定义监控工具
记住,shell 脚本的核心价值在于将重复劳动转化为可复用的自动化流程。当你熟练使用它时,会发现它像一位默契的伙伴,默默提升你的生产力。保持好奇心,不断探索新命令和组合方式,你的技术之路将越走越宽广。