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 正则里就是普通字符,直接写即可。

相关推荐
上海云盾-小余5 小时前
流量攻击复盘:为什么 WAF 完好,业务依旧瘫痪
运维·服务器·网络
IT大白鼠5 小时前
Docker 私有仓库管理:Harbor 企业级仓库搭建与镜像全生命周期管理
运维·docker·容器
戴西软件5 小时前
戴西iDWS.3DViz Suite数据轻量化可视化软件,从传统桌面软件向云端协同的重大突破
大数据·运维·网络·人工智能·机器学习·3d
闲云野鹤在人间6 小时前
OpenStack架构介绍和安装流程
linux·网络·架构·openstack
我命由我123456 小时前
Linux - Linux/POSIX 路径斜杠折叠规则
linux·运维·服务器·android studio·android jetpack·android-studio·android runtime
姚不倒7 小时前
Nginx 反向代理:5 种负载均衡策略与实战
运维·nginx·负载均衡
xx~t7 小时前
嵌入式——Linux软件编程——网络1
linux·c语言·网络·vscode·网络协议
Uncertainty!!7 小时前
Linux 主机无法完成校园网认证排查记录:从 DHCP、ARP 到 Portal 认证流程分析
linux·运维·服务器
神威难绷泪7 小时前
Linux消息队列 & 共享内存 笔记
linux·消息队列·共享内存
其实防守也摸鱼7 小时前
权限提升与横向移动:从内网渗透到域控的完整技术图谱
运维·服务器·数据库·安全·github·copilot·渗透