编写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"
关键修复与优化说明:
- 文件读取方式:改用
while IFS= read -r proxy逐行读取文件,确保每行内容被正确处理,不受空格或换行影响 - 变量修正:将提取逻辑中的
$name替换为循环变量$proxy,同时用-E参数启用扩展正则,让sed匹配更准确 - 直接下载文件:无需克隆整个仓库,通过GitHub API构造文件下载链接,用
gh api处理认证并下载,提升效率 - 目录管理:提前创建目标存储目录,避免文件保存失败;给下载的文件加上版本标识,避免重名覆盖
- 错误处理:添加空行跳过、提取失败跳过、标签不存在跳过的逻辑,提升脚本健壮性
内容的提问来源于stack exchange,提问作者Ritwik1711
相关产品推荐
相关产品推荐

