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

相关推荐
乐维_lwops3 小时前
【无标题】
运维·人工智能
济6173 小时前
I.MX6U Linux 驱动开发篇---设备树下 platform 驱动实验--- Ubuntu20.04
linux·嵌入式·嵌入式linux驱动开发
什么都会一点儿的自动驾驶工程狮3 小时前
Jetson Orin Nano Super + Ubuntu 22.04 + ROS2 Humble + Autoware Universe
linux·ubuntu·elasticsearch
2601_954706493 小时前
2026 年 5 月云手机实测:傲晨云、川川云、多多云深度对比
运维·服务器·智能手机
feng_you_ying_li3 小时前
liunx之库的原理,核心是静态库(2)
linux
cui_ruicheng3 小时前
Linux网络编程(三):Socket编程预备知识
linux·服务器·网络
小此方3 小时前
Re:Linux系统篇(十六) 进程篇 · 一:深入理解操作系统:从软硬件架构到“先描述,再组织”的管理哲学
linux·驱动开发·硬件架构
念恒123063 小时前
Docker基础--CGroups资源控制实战(包含部分指令)
运维·docker·容器
江上清风山间明月3 小时前
Nginx一个IP部署多个网站
运维·tcp/ip·nginx·部署多个网站·一个ip·一个服务器