最近领了不少 Claude Code 镜像站的免费额度,但是各大镜像站的稳定性一般,有时候某个源用着用着就挂了,需要快速切换到其他可用的源;有时候想根据不同项目的需求选择性价比最高的源。每次手动修改环境变量或配置文件既麻烦又容易出错,特别是当手头有多个免费额度需要管理时,于是写了个简单的切换脚本来解决这个问题。
# 将配置信息写入临时文件,包含索引信息 for ((i=0; i<config_count; i++)); do name=$(jq -r ".configs[$i].name""$CONFIG_FILE") input_price=$(jq -r ".configs[$i].pricing.input""$CONFIG_FILE") output_price=$(jq -r ".configs[$i].pricing.output""$CONFIG_FILE") description=$(jq -r ".configs[$i].pricing.description""$CONFIG_FILE") # 提取价格数字用于排序(处理 ¥0.9/1M tokens 或 $3/1M tokens 格式) input_num=$(echo"$input_price" | grep -o '[0-9]*\.\?[0-9]*' | head -1) output_num=$(echo"$output_price" | grep -o '[0-9]*\.\?[0-9]*' | head -1) # 如果无法提取数字,使用0 input_num=${input_num:-0} output_num=${output_num:-0} # 检查是否为美元价格,如果是则乘以7转换为人民币 if [[ "$input_price" == *"$"* ]]; then input_num=$(echo"$input_num * 7" | bc -l 2>/dev/null || echo"$input_num") fi if [[ "$output_price" == *"$"* ]]; then output_num=$(echo"$output_num * 7" | bc -l 2>/dev/null || echo"$output_num") fi # 计算总价格(输入+输出) total_price=$(echo"$input_num + $output_num" | bc -l 2>/dev/null || echo"0") echo"$i|$name|$input_price|$output_price|$description|$total_price" >> "$temp_file" done
# 按总价格排序(从低到高) ifcommand -v bc &> /dev/null; then sort -t'|' -k6,6n "$temp_file" > "${temp_file}.sorted" mv"${temp_file}.sorted""$temp_file" else echo"[Warning] 未找到bc命令,将按原始顺序显示" fi
# 显示排序后的配置 line_num=1 while IFS='|'read -r index name input_price output_price description total_price; do echo"$line_num) $name" echo" 输入: $input_price | 输出: $output_price" # 计算并显示转换后的人民币价格 input_num=$(echo"$input_price" | grep -o '[0-9]*\.\?[0-9]*' | head -1) output_num=$(echo"$output_price" | grep -o '[0-9]*\.\?[0-9]*' | head -1) input_num=${input_num:-0} output_num=${output_num:-0} # 检查是否为美元价格,如果是则乘以7转换为人民币 if [[ "$input_price" == *"$"* ]]; then input_cny=$(echo"$input_num * 7" | bc -l 2>/dev/null || echo"$input_num") output_cny=$(echo"$output_num * 7" | bc -l 2>/dev/null || echo"$output_num") echo" (约 ¥${input_cny}/1M tokens | ¥${output_cny}/1M tokens)" fi # 只有当描述不为空且不是null时才显示 if [[ -n "$description" && "$description" != "null" ]]; then echo" $description" fi echo"" # 保存索引映射 eval"config_index_$line_num=$index" line_num=$((line_num + 1)) done < "$temp_file"
# 清理临时文件 rm -f "$temp_file"
# 获取当前配置名称 current_config_name="" if [[ -n "$ANTHROPIC_AUTH_TOKEN" && -n "$ANTHROPIC_BASE_URL" ]]; then config_count=$(jq '.configs | length'"$CONFIG_FILE") for ((i=0; i<config_count; i++)); do token=$(jq -r ".configs[$i].token""$CONFIG_FILE") url=$(jq -r ".configs[$i].url""$CONFIG_FILE") if [[ "$token" == "$ANTHROPIC_AUTH_TOKEN" && "$url" == "$ANTHROPIC_BASE_URL" ]]; then current_config_name=$(jq -r ".configs[$i].name""$CONFIG_FILE") break fi done fi
# 在列表末尾显示当前设置 if [[ -n "$current_config_name" ]]; then echo"当前设置:$current_config_name" else echo"当前设置:未配置" fi echo"=========================================="
read -p "#? " choice
if [[ -z "$FORCE_PERMANENT" ]]; then echo"" echo"请选择设置方式:" echo"1) 临时设置 (仅当前终端会话有效)" echo"2) 永久设置 (写入配置文件)" read -p "设置方式 [1/2]: " mode else mode="2" fi