你是不是也这样:每次要备份文件,就得手动敲一堆命令,复制粘贴半天。
后来学会了写Shell脚本,但又忘了语法,临时百度半天。
现在有了AI,你只需要描述需求,脚本就出来了。
但AI生成的脚本不能直接跑,有几个坑要注意。今天教你怎么用AI写Shell脚本。
一、为什么用AI写Shell脚本?
Shell脚本有这几个痛点:
- 语法容易忘:
$?是啥?$@和$*啥区别?每次用都查一遍。 - 调试麻烦:脚本跑错了,错误信息又长又看不懂。
- 边界情况多:文件不存在怎么办?权限不够怎么办?变量为空怎么办?
AI能帮你解决前两个问题。第三个问题,需要你自己加。
二、5个高频场景和Prompt模板
场景1:批量重命名文件
需求: 把当前目录下所有 .jpg 文件,在前面加上日期前缀。
Prompt模板:
帮我写一个Shell脚本:
- 遍历当前目录下所有扩展名为.jpg的文件
- 在每个文件名前面加上今天的日期前缀,格式为 YYYYMMDD_
- 如果文件名已经以日期前缀开头,跳过
- 脚本要安全,重命名前打印将要执行的命令
AI生成的脚本大概长这样:
#!/bin/bash
PREFIX=$(date +%Y%m%d)
for file in *.jpg; do
[ -f "$file" ] || continue
if [[ "$file" == ${PREFIX}_* ]]; then
echo "跳过已处理: $file"
continue
fi
new_name="${PREFIX}_${file}"
echo "重命名: $file -> $new_name"
mv "$file" "$new_name"
done
场景2:日志文件清理
需求: 清理30天前的日志文件,保留最近的10个。
Prompt模板:
帮我写一个Shell脚本:
- 清理 /var/log/myapp/ 目录下超过30天的.log文件
- 同时保留最近生成的10个日志文件(不过期)
- 执行前先打印将要删除的文件列表
- 删除完成后统计释放的磁盘空间
- 脚本要加错误处理,找不到目录时给出提示
AI生成的脚本:
#!/bin/bash
LOG_DIR="/var/log/myapp"
KEEP_COUNT=10
RETENTION_DAYS=30
if [ ! -d "$LOG_DIR" ]; then
echo "错误: 目录 $LOG_DIR 不存在"
exit 1
fi
# 找出30天前的日志文件
OLD_FILES=$(find "$LOG_DIR" -name "*.log" -type f -mtime +${RETENTION_DAYS} | sort)
# 保留最近10个(包含非30天前的)
ALL_FILES=$(find "$LOG_DIR" -name "*.log" -type f | sort -r)
KEEP_FILES=$(echo "$ALL_FILES" | head -${KEEP_COUNT})
# 找出需要删除的文件(30天前且不在保留列表中的)
FILES_TO_DELETE=""
while IFS= read -r f; do
if ! echo "$KEEP_FILES" | grep -q "$f"; then
FILES_TO_DELETE="$FILES_TO_DELETE $f"
fi
done <<< "$OLD_FILES"
if [ -z "$FILES_TO_DELETE" ]; then
echo "没有需要清理的日志文件"
exit 0
fi
echo "即将删除以下文件:"
echo "$FILES_TO_DELETE"
# 计算释放空间
FREE_BEFORE=$(du -sh "$LOG_DIR" | cut -f1)
echo "当前目录占用: $FREE_BEFORE"
for f in $FILES_TO_DELETE; do
rm -f "$f"
done
FREE_AFTER=$(du -sh "$LOG_DIR" | cut -f1)
echo "清理后目录占用: $FREE_AFTER"
echo "清理完成"
场景3:服务器状态监控
需求: 监控CPU、内存、磁盘使用率,超过阈值发通知。
Prompt模板:
帮我写一个Shell脚本,监控Linux服务器状态:
- 检查CPU使用率(top命令),超过80%输出警告
- 检查内存使用率(free命令),超过90%输出警告
- 检查磁盘使用率(df命令),根分区超过85%输出警告
- 所有检查合并成一行输出,格式为:[时间] [检查项] [状态] [数值]
- 脚本要支持命令行传入阈值参数
场景4:自动备份数据库
需求: 每天凌晨备份MySQL数据库,保留7天。
Prompt模板:
帮我写一个Shell脚本:
- 使用mysqldump备份指定数据库
- 备份文件名包含日期和时间戳
- 压缩备份文件为.gz格式
- 备份到指定目录
- 自动删除7天前的旧备份
- 备份失败时输出错误日志
- 脚本支持通过环境变量配置数据库连接信息
场景5:批量处理图片
需求: 把所有PNG图片转成JPG,压缩到指定尺寸。
Prompt模板:
帮我写一个Shell脚本:
- 遍历指定目录下的所有.png文件
- 使用ImageMagick的convert命令将PNG转成JPG,质量设为85
- 输出到同名目录下的.jpg文件
- 转换前检查输入文件是否存在
- 转换失败时跳过该文件并记录错误
- 最后输出转换统计信息
三、AI写Shell脚本的3个坑
坑1:路径写死
AI生成的脚本经常用绝对路径,但你的环境可能不一样。
解决方法: 在prompt里说明你的环境,让AI用相对路径或变量。
坑2:权限问题
AI不知道你的文件权限,生成的脚本可能需要root权限。
解决方法: 在prompt里说明运行权限,让AI加上权限检查。
坑3:命令不存在
AI可能用了一些你系统里没有的命令,比如 jq、parallel。
解决方法: 在prompt里说明你的系统环境,让AI用标准命令。
四、写好Shell脚本的3个习惯
习惯1:加shebang
每个脚本第一行加上 #!/bin/bash,告诉系统用哪个解释器。
习惯2:加注释
AI生成的脚本注释可能不够,自己补上关键逻辑的注释。
习惯3:测试再上线
AI生成的脚本先在测试环境跑一遍,确认没问题再放到生产环境。
五、推荐工具
| 工具 | 用途 | 费用 |
|---|---|---|
| ChatGPT | 生成Shell脚本 | 免费版够用 |
| Claude | 生成复杂脚本,解释清晰 | 免费版够用 |
| Navbox JSON格式化 | 格式化脚本输出 | 免费 |
| Navbox 正则构建器 | 调试脚本中的正则 | 免费 |
用AI写Shell脚本,最大的价值不是省时间,而是减少出错。
脚本跑错了,损失的可不只是几分钟。
多花30秒让AI生成,再花1分钟review,比事后排查省得多。