在Bash脚本中读取YAML文件并以YAML值为参数执行命令
解决Swagger API生成脚本的curl格式错误问题
问题根源
原脚本用while IFS=: read -r key value的方式读取YAML文件,完全适配不了YAML的层级缩进结构,导致读取到的URL内容混乱、甚至为空,直接触发curl的URL using bad/illegal format错误。Bash原生不具备解析YAML的能力,必须借助专门的YAML处理工具。
解决方案:使用yq解析YAML
yq是一款轻量的YAML命令行处理工具,能精准提取YAML中的层级数据。先确保已安装yq:
- Debian/Ubuntu:
sudo apt install yq - macOS:
brew install yq
修正后的完整脚本
#!/bin/bash # 检查yq是否安装 if ! command -v yq &> /dev/null; then echo "错误:未找到yq,请先安装yq工具" exit 1 fi # 获取YAML中的所有顶级节点名称 top_nodes=$(yq eval 'keys | .[]' ./swagger-codegen.yaml) for top_node in $top_nodes; do # 提取当前节点对应的URL swagger_url=$(yq eval ".$top_node.url" ./swagger-codegen.yaml) json_path="${top_node}-swagger.json" api_ts="${top_node}Api.ts" # 下载Swagger JSON文件 if curl -k "$swagger_url" -o "$json_path"; then echo "已下载 $top_node 的Swagger JSON文件" # 生成TypeScript API文件 if npx swagger-typescript-api -p "$json_path" -n "$api_ts"; then echo "已生成 $top_node 的TypeScript API文件" else echo "生成 $top_node API文件失败" fi else echo "下载 $top_node 的Swagger JSON文件失败" fi done
脚本说明
- yq依赖检查:先确认yq已安装,避免后续执行失败
- 提取顶级节点:用
yq eval 'keys | .[]'获取YAML中所有顶级键名(如dbaas、flavor-access) - 提取URL:通过
yq eval ".$top_node.url"精准提取每个节点下的url值 - 流程控制:给curl和npx命令添加判断,执行失败时给出明确提示
- 格式兼容:完全适配YAML的层级结构,不会出现URL读取错误的情况
内容的提问来源于stack exchange,提问作者mTv
相关产品推荐
相关产品推荐

