Claude Code 模型切换脚本 switch.sh 编写

背景

Claude code 使用不同模型,需要切换,之前手动切换重命名 setting.json 和环境变量修改,想着切换麻烦,编写个脚本吧,用 claude code 编写。基本流程是:

  1. 将 settings-model.json 复制为 settings-json。
  2. 修改 .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 生效"

脚本学习

脚本写的很好,运行了一下,可以完美完成不同模型供应商的切换,脚本里面有两个语法没见过,学习一下:

  1. { } >> 文件名称,这对括号的作用是什么?
  2. 解释下这行命令 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 正则里就是普通字符,直接写即可。

相关推荐
逸模1 小时前
告别熬夜手工整理台账,逸模智能归集实现项目数据自动化存档
大数据·运维·人工智能·笔记·其他·信息可视化·自动化
sbjdhjd1 小时前
Redis 主从复制、哨兵高可用与 Cluster 集群部署实验手册
运维·前端·redis·云原生·开源·bootstrap·html
人间乄惊鸿客1 小时前
Linux所遇问题自记录
linux
AOwhisky2 小时前
MySQL 学习笔记(第四期):SQL 语言之多表查询
linux·运维·网络·数据库·笔记·学习·mysql
Phantom Void2 小时前
服务器处理客户端请求的设计方法
linux·运维·网络
司悠2 小时前
【解决在vscode里开服务器登录codeX后发消息会一直reconnecting】
服务器·ide·vscode
倔强的石头1062 小时前
Fooocus开源神器+cpolarAI让绘画告别服务器依赖
运维·服务器·cpolar
Ajie'Blog2 小时前
Copilot Agent Tasks API 开放:AI 编程开始进入后台任务时代
服务器·前端·javascript·人工智能·copilot·ai编程
wei_shuo2 小时前
服务器挂了等用户投诉才发现?我用Beszel搭了轻量监控系统,宕机第一时间通知我
运维·服务器
王码码20352 小时前
多台服务器怎么统一看状态?Beszel 轻量监控,搭起来不费事
运维·服务器·后端·安全·阿里云·接口·web