Claude CodeCLI自动化脚本

Claude -p 非交互模式:脚本化使用 Claude Code

掌握 claude -p 命令的完整用法,包括管道处理、输出格式控制、与 Shell 脚本集成,让 Claude Code 成为自动化工具链的一部分。

· 阅读约 6 分钟

claude -p(或 --print)是 Claude Code 的非交互模式。执行完任务后直接退出,不进入对话界面,特别适合脚本和自动化场景。

基本用法

# 执行一个任务,得到结果后退出
claude -p "解释 main.go 的核心逻辑"

# 结果会直接输出到 stdout
claude -p "用一句话描述这个项目" > summary.txt

管道(Pipe)输入

-p 模式可以通过管道接收内容:

# 分析错误日志
cat error.log | claude -p "分析这些错误,找出最可能的根本原因"

# 审查代码文件
cat src/auth.ts | claude -p "这段代码有什么安全问题?"

# 处理命令输出
git diff HEAD~1 | claude -p "总结这次提交做了哪些改动,写成中文 changelog"

# 分析 JSON 数据
curl -s https://api.example.com/stats | claude -p "分析这些数据,找出异常指标"

读取多个文件

# 同时传入多个文件内容
claude -p "对比这两个实现,哪个更好?" \
  < <(cat src/old-impl.ts src/new-impl.ts)

# 或者在问题里直接引用文件路径(Claude Code 会自动读取)
claude -p "比较 src/old-impl.ts 和 src/new-impl.ts,哪个实现更好?"

控制输出格式

纯文本(默认)

claude -p "分析代码质量"
# 输出:格式化的文本回答

JSON 格式

适合脚本解析:

claude -p "分析以下代码的问题" \
  --output-format json \
  < src/utils.ts

输出结构:

{
  "type": "result",
  "subtype": "success",
  "result": "分析结果...",
  "cost_usd": 0.0012,
  "duration_ms": 1823
}

流式 JSON(stream-json)

用于需要实时处理输出的场景:

claude -p "生成详细的代码文档" \
  --output-format stream-json \
  < src/api.ts | jq -r 'select(.type=="text") | .text'

控制输入格式

直接文本输入

echo "const x = 1" | claude -p "这行代码有什么问题"

JSON 格式输入

适合需要传入结构化数据的场景:

echo '{"role":"user","content":"分析这个函数"}' | \
  claude -p --input-format json

在 Shell 脚本里使用

基础脚本模式

#!/bin/bash
# 代码质量检查脚本

RESULT=$(claude -p "检查 src/ 目录下的代码质量问题,只列出严重问题" \
  --dangerously-skip-permissions)

if echo "$RESULT" | grep -q "严重"; then
  echo "发现严重问题,请查看:"
  echo "$RESULT"
  exit 1
fi

echo "代码质量检查通过"

结合 jq 处理 JSON 输出

#!/bin/bash
# 获取结构化分析结果

ANALYSIS=$(claude -p "分析代码,以 JSON 格式输出:{issues: [], suggestions: []}" \
  --output-format json \
  < src/main.ts)

# 提取 result 字段
RESULT=$(echo "$ANALYSIS" | jq -r '.result')

# 进一步处理
echo "$RESULT" | jq '.issues[]'

批量处理文件

#!/bin/bash
# 批量生成代码注释

for file in src/**/*.ts; do
  echo "处理: $file"
  
  COMMENTS=$(claude -p "为这个文件的公开函数生成 JSDoc 注释" \
    --dangerously-skip-permissions \
    < "$file")
  
  echo "$COMMENTS" > "${file%.ts}.docs.md"
done

和其他工具组合

与 git 结合

# 自动生成提交信息
git diff --staged | claude -p \
  "根据这些代码改动,生成一个符合 conventional commits 规范的提交信息,只输出提交信息本身,不要解释"

# 生成 PR 描述
git log main..HEAD --oneline | claude -p \
  "根据这些提交记录,生成一个 PR 描述(包含:做了什么、为什么、如何测试)"

与 CI/CD 结合

# GitHub Actions 示例
- name: Claude Code Review
  run: |
    git diff ${{ github.event.pull_request.base.sha }} | \
    claude -p "审查这个 PR 的代码改动,找出潜在问题" \
      --dangerously-skip-permissions \
      --output-format json | \
    jq -r '.result'

与日志分析结合

# 分析今天的错误日志
grep "ERROR" /var/log/app/$(date +%Y-%m-%d).log | \
  claude -p "分析这些错误,按严重程度分类,给出处理建议"

超时和重试

# 设置超时时间(毫秒)
ANTHROPIC_TIMEOUT=30000 claude -p "快速任务"

# 简单的重试逻辑
for i in 1 2 3; do
  if claude -p "任务描述" --dangerously-skip-permissions; then
    break
  fi
  echo "第 $i 次失败,重试..."
  sleep 5
done

注意事项

权限确认-p 模式默认仍然需要权限确认(比如修改文件)。如果在脚本里不想中断,加上 --dangerously-skip-permissions,但要确保任务是安全的。

费用控制-p 模式容易在脚本里被频繁调用,注意监控 API 用量,避免意外产生高额费用。

错误处理-p 模式会在成功时退出码为 0,失败时退出码非 0,脚本里记得检查 $?

claude -p "任务" || { echo "Claude Code 执行失败"; exit 1; }