背景
Claude code 使用不同模型,需要切换,之前手动切换重命名 setting.json 和环境变量修改,想着切换麻烦,编写个脚本吧,用 claude code 编写。基本流程是:
- 将 settings-model.json 复制为 settings-json。
- 修改 .zshrc 环境变量追加对应的 TOKE_URL 和 BASE_URL 。
描述完整的需求后,等着编写完成。
切换脚本
bash
#!/usr/bin/env bash
set -euo pipefail
CLAUDE_DIR="/Users/xxx/.claude"
ZSHRC="$HOME/.zshrc"
usage() {
echo "用法: $0 <ofo|xiaomu|deepseek|moz|minimax>"
exit 1
}
[ $# -ne 1 ] && usage
TOKEN_TYPE="$1"
case "$TOKEN_TYPE" in
ofo|xiaomu|deepseek|moz|minimax) ;;
*) echo "不支持的类型: $TOKEN_TYPE"; usage ;;
esac
SRC="$CLAUDE_DIR/settings-${TOKEN_TYPE}.json"
DST="$CLAUDE_DIR/settings.json"
if [ ! -f "$SRC" ]; then
echo "找不到配置文件: $SRC"
exit 1
fi
# 1. 拷贝配置文件
cp "$SRC" "$DST"
echo "已复制 $SRC -> $DST"
# 2. 从 settings.json 解析 ANTHROPIC_AUTH_TOKEN 和 ANTHROPIC_BASE_URL
API_KEY=$(python3 -c "import json,sys; d=json.load(open('$DST')); print(d['env']['ANTHROPIC_AUTH_TOKEN'])")
BASE_URL=$(python3 -c "import json,sys; d=json.load(open('$DST')); print(d['env']['ANTHROPIC_BASE_URL'])")
if [ -z "$API_KEY" ] || [ -z "$BASE_URL" ]; then
echo "解析 settings.json 失败,ANTHROPIC_AUTH_TOKEN 或 ANTHROPIC_BASE_URL 为空"
exit 1
fi
echo "API_KEY: ${API_KEY:0:8}..."
echo "BASE_URL: $BASE_URL"
# 3. 删除 ~/.zshrc 中已有的相关行,再追加新值(保证幂等)
sed -i '' '/^export ANTHROPIC_API_KEY=/d' "$ZSHRC"
sed -i '' '/^export ANTHROPIC_BASE_URL=/d' "$ZSHRC"
sed -i '' '/^# Config for claude code/d' "$ZSHRC"
{
echo "# Config for claude code, model type is $1."
echo "export ANTHROPIC_API_KEY='${API_KEY}'"
echo "export ANTHROPIC_BASE_URL=\"${BASE_URL}\""
} >> "$ZSHRC"
echo "已更新 $ZSHRC"
# 4. 在当前进程直接导出变量(source ~/.zshrc 在 bash 里会触发 zsh 专属命令报错)
export ANTHROPIC_API_KEY="$API_KEY"
export ANTHROPIC_BASE_URL="$BASE_URL"
echo "切换完成: $TOKEN_TYPE"
echo "注意: 新终端窗口会自动从 ~/.zshrc 读取,当前窗口已通过 export 生效"
脚本学习
脚本写的很好,运行了一下,可以完美完成不同模型供应商的切换,脚本里面有两个语法没见过,学习一下:
- { } >> 文件名称,这对括号的作用是什么?
- 解释下这行命令 sed -i '' '/^export ANTHROPIC_API_KEY=/d' "$ZSHRC" 的 /d
是什么意思 。
/d 是 sed 的 delete 命令,删除匹配到的行。
bash
sed -i '' '/^export ANTHROPIC_API_KEY=/d' "$ZSHRC"
| 部分 | 含义 |
|---|---|
-i '' |
原地修改文件(macOS 语法) |
/^export ANTHROPIC_API_KEY=/ |
匹配以该内容开头的行 |
d |
删除该行 |
sed 基本结构:[地址]命令,地址选定范围,命令决定操作。
{ } 命令分组与重定向
{ } 是 shell 的命令分组构造,将多条命令的输出合并为一个整体,统一重定向到文件。
bash
{
echo "line 1"
echo "line 2"
date
} >> file.txt
等价于对每条命令单独追加,但只打开一次文件,更简洁高效。
语法要求:
- 左括号后必须有空格:
{ echo而非{echo - 右括号前必须有分号或换行:
echo "x"; }或换行后}
# 在 sed 中不需要转义
# 不是 Shell 关键字,只是注释符号,且注释作用发生在 Shell 解析阶段。
在 sed -i 命令里,# 出现在单引号内,Shell 不解析引号内容,因此不需要转义。
bash
sed -i '' '/^#model type=/d' file.txt
# 在 sed 正则里就是普通字符,直接写即可。