Shell 脚本是运维和自动化的基石,Claude Code 能帮你快速生成、 理解和调试各种复杂脚本,即使你不是 Shell 专家。
高效提示词模板
# 通用脚本生成模板
帮我写一个 Bash 脚本,功能:[描述]
要求:
- 在脚本顶部用 set -euo pipefail(严格模式)
- 加入参数校验,缺少必要参数时打印用法并退出
- 关键操作前输出日志(带时间戳)
- 操作失败时输出有意义的错误信息
- 脚本结尾输出执行摘要
目标系统:[macOS / Ubuntu 22.04 / CentOS 7]
常用运维脚本示例
日志清理脚本
你:写一个日志清理脚本,清理 /var/log/app/ 下超过 30 天的日志文件,
超过 500MB 的单个文件直接压缩,每次清理记录操作日志
Claude:
```bash
#!/bin/bash
set -euo pipefail
LOG_DIR="/var/log/app"
AUDIT_LOG="/var/log/cleanup_audit.log"
MAX_AGE_DAYS=30
MAX_SIZE_MB=500
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
log() { echo "[$TIMESTAMP] $*" | tee -a "$AUDIT_LOG"; }
# 参数校验
[[ -d "$LOG_DIR" ]] || { log "ERROR: 目录不存在: $LOG_DIR"; exit 1; }
log "开始清理 $LOG_DIR"
deleted=0; compressed=0
# 压缩大文件
while IFS= read -r -d '' file; do
size_mb=$(du -m "$file" | cut -f1)
if (( size_mb > MAX_SIZE_MB )); then
gzip "$file"
log "压缩: $file (${size_mb}MB)"
((compressed++))
fi
done < <(find "$LOG_DIR" -name "*.log" -not -name "*.gz" -print0)
# 删除旧文件
while IFS= read -r -d '' file; do
rm "$file"
log "删除: $file"
((deleted++))
done < <(find "$LOG_DIR" -name "*.log.gz" -mtime +$MAX_AGE_DAYS -print0)
log "完成:压缩 $compressed 个,删除 $deleted 个"
服务健康检查告警脚本
bash
#!/bin/bash
set -euo pipefail
# 让 Claude 生成这个脚本:
# 检查多个 HTTP 服务端点,如果连续 3 次失败则发送钉钉/企微告警
SERVICES=(
"https://api.example.com/health"
"https://web.example.com"
"https://admin.example.com/ping"
)
WEBHOOK_URL="https://oapi.dingtalk.com/robot/send?access_token=xxxx"
FAIL_THRESHOLD=3
STATE_FILE="/tmp/service_check_state.json"
check_service() {
local url=$1
local http_code
http_code=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout 5 --max-time 10 "$url" || echo "000")
[[ "$http_code" == "200" ]] && echo "ok" || echo "fail:$http_code"
}
send_alert() {
local service=$1 message=$2
curl -s -X POST "$WEBHOOK_URL" -H "Content-Type: application/json" -d "{"msgtype":"text","text":{"content":"[告警] $service\n$message"}}"
}
for svc in "${SERVICES[@]}"; do
result=$(check_service "$svc")
# ... 状态记录和阈值判断逻辑
done调试复杂脚本
让 Claude 加 set -x 调试模式
你:这个脚本偶发失败,加上调试输出帮我找原因:
[粘贴脚本]
Claude:在脚本开头加 set -x,在可疑行加 set +x 收窄范围:
#!/bin/bash
set -x # 开启命令追踪
# 在可疑区域精确调试:
set -x
problematic_function
set +x
解释复杂命令
你:解释这行命令是什么意思:
find . -name "*.log" -newer /tmp/ref -exec awk '/ERROR/{count++} END{if(count>10) print FILENAME, count}' {} \; | sort -t' ' -k2 -rn | head -5
Claude:这行命令分步骤解析:
1. find . -name "*.log" -newer /tmp/ref
查找当前目录下比 /tmp/ref 更新的所有 .log 文件
2. -exec awk '...' {} \;
对每个文件执行 awk:统计 ERROR 行数,超过 10 行才打印「文件名 错误数」
3. sort -t' ' -k2 -rn
按第 2 列(错误数)倒序数字排序
4. head -5
只显示错误最多的前 5 个文件
用途:快速找出最近有大量错误的日志文件
跨平台兼容性处理
bash
# macOS 和 Linux 的常见差异,让 Claude 帮你处理
# 日期命令(macOS 用 gdate 或特殊语法)
if [[ "$(uname)" == "Darwin" ]]; then
DATE_CMD="gdate" # brew install coreutils
else
DATE_CMD="date"
fi
YESTERDAY=$($DATE_CMD -d "yesterday" +%Y-%m-%d)
# stat 命令语法不同
if [[ "$(uname)" == "Darwin" ]]; then
file_size=$(stat -f%z "$file")
else
file_size=$(stat -c%s "$file")
fi
# sed -i 在 macOS 上需要备份后缀
if [[ "$(uname)" == "Darwin" ]]; then
sed -i '' 's/old/new/g' file.txt
else
sed -i 's/old/new/g' file.txt
fi脚本安全性检查
你:帮我检查这个脚本有没有安全问题:
[粘贴脚本]
Claude 检查要点:
1. 用户输入是否有 Shell 注入风险
2. 临时文件是否使用 mktemp(避免 /tmp/固定名 竞态攻击)
3. 密码/Token 是否在命令行参数中(会出现在 ps aux)
4. 文件权限是否最小化(脚本不应是 777)
5. curl/wget 下载的脚本是否直接 bash 执行(供应链风险)
重构为可复用工具库
你:我有 10 个脚本,每个都重复写了同样的日志函数和错误处理。
帮我提取为一个 lib.sh 库,然后修改所有脚本来 source 它
Claude:
# lib.sh - 通用工具库
#!/bin/bash
SCRIPT_NAME=$(basename "${BASH_SOURCE[1]}")
LOG_FILE="${LOG_DIR:-/var/log}/${SCRIPT_NAME%.sh}.log"
log_info() { echo "[$(date '+%T')] [INFO] $*" | tee -a "$LOG_FILE"; }
log_warn() { echo "[$(date '+%T')] [WARN] $*" | tee -a "$LOG_FILE" >&2; }
log_error() { echo "[$(date '+%T')] [ERROR] $*" | tee -a "$LOG_FILE" >&2; }
die() { log_error "$*"; exit 1; }
# 在各脚本中引用:
source "$(dirname "$0")/lib.sh"
来源:Claude Code 官方文档 - docs.anthropic.com/en/docs/claude-code