You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写Bash脚本读取文件并从GitHub Enterprise下载指定Swagger文件

修复后的Bash脚本:读取文件、提取组件信息并下载GitHub上的Swagger文件

原脚本存在的核心问题:

  • 读取文件时直接用cat赋值给变量,遇到换行或空格会导致遍历出错,应该用逐行读取的方式
  • 提取组件名和版本号时误用了未定义的$name变量,实际应该用循环变量$proxy
  • find命令中使用单引号包裹路径,导致变量$version和$component无法正常展开
  • 缺少Swagger文件的下载/复制逻辑,且循环结构不完整(if语句未闭合)
  • 全量克隆仓库效率低,可优化为直接下载目标文件

修复后的完整脚本

#!/bin/bash

list_file="envi.txt"
# 定义本地存储Swagger文件的目录,可按需修改
target_dir="./swagger_files"
mkdir -p "$target_dir"

# 逐行读取文件内容,避免换行/空格导致的遍历问题
while IFS= read -r proxy; do
    # 跳过空行
    [[ -z "$proxy" ]] && continue

    # 提取组件名(如analytics、billing)
    component=$(echo "$proxy" | sed -E 's/abc-([^-]+)-api-v[0-9]+_0/\1/')
    # 提取版本号(如1、2)
    version=$(echo "$proxy" | sed -E 's/abc-[^-]+-api-v([0-9]+)_0/\1/')

    # 跳过提取失败的行
    [[ -z "$component" || -z "$version" ]] && continue

    repo_name="abc-api-${component}-dist"
    # 查找匹配的仓库
    repo_list=$(gh repo list --json name --jq ".[] | select(.name | startswith(\"${repo_name}\")) | .name")

    for repo in $repo_list; do
        # 获取仓库的最新符合规范的标签(v开头的语义化版本)
        tag=$(gh api "/repos/OneCompany/${repo}/tags" --paginate --jq '[.[].name] | map(select(test("^v[0-9]+(\.[0-9]+)*$"))) | sort_by(split(".")[]|tonumber) | last')
        [[ -z "$tag" ]] && continue

        # 构造目标文件的GitHub API路径,直接下载无需克隆仓库
        swagger_file_path="${version}.0/abc-apigee-${component}-dist/def/swagger-${component}.json"
        download_url="https://github.com/OneCompany/${repo}/raw/${tag}/${swagger_file_path}"

        # 使用gh api下载文件,避免直接curl需要处理认证
        gh api "$(echo "$download_url" | sed 's|https://github.com/|/repos/|; s|raw/|contents/|')" --jq '.content' | base64 -d > "${target_dir}/swagger-${component}-v${version}.json"

        echo "已下载Swagger文件:${target_dir}/swagger-${component}-v${version}.json"
    done
done < "$list_file"

关键修复与优化说明:

  1. 文件读取方式:改用while IFS= read -r proxy逐行读取文件,确保每行内容被正确处理,不受空格或换行影响
  2. 变量修正:将提取逻辑中的$name替换为循环变量$proxy,同时用-E参数启用扩展正则,让sed匹配更准确
  3. 直接下载文件:无需克隆整个仓库,通过GitHub API构造文件下载链接,用gh api处理认证并下载,提升效率
  4. 目录管理:提前创建目标存储目录,避免文件保存失败;给下载的文件加上版本标识,避免重名覆盖
  5. 错误处理:添加空行跳过、提取失败跳过、标签不存在跳过的逻辑,提升脚本健壮性

内容的提问来源于stack exchange,提问作者Ritwik1711

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 07:35:11