swagger 在bash脚本中阅读yaml文件并以yaml值作为参数运行命令

bwntbbo3  于 8个月前  发布在  其他
关注(0)|答案(2)|浏览(83)

我试图创建一个“codegen”脚本,该脚本读取.yaml文件并根据yaml文件中的值生成API.ts文件。
我想这样写我的yaml文件:

dbaas:
  url: http://rackerlabs.github.io/wadl2swagger/openstack/swagger/dbaas.json
flavor-access:
  url: http://rackerlabs.github.io/wadl2swagger/openstack/swagger/flavor-access-v2.1.json

yaml文件可以有任意数量的条目,但它总是以“name”.url格式。
给定这个yaml,我希望脚本运行以下命令:
curl -k http://rackerlabs.github.io/wadl2swagger/openstack/swagger/dbaas.json -o dbaas-swagger.json
然后
npx swagger-typescript-api -p dbaas-swagger.json -n dbaasApi.ts
然后,对于风味访问也是如此。这应该给我留下两个API文件:dbaasApi.tsflavor-accessApi.ts
我试图从ChatGPT获得帮助,但它的脚本不断给出来自curl的错误:curl: (3) URL using bad/illegal format or missing URL
以下是它制作的脚本:

#!/bin/bash

while IFS=: read -r key value; do
  if [[ "$key" =~ [a-zA-Z0-9_]+ ]]; then
    top_node="${key// /}"
    read -r url
    swagger_url="${url// /}"

    json_path="${top_node}-swagger.json"
    api_ts="${top_node}Api.ts"

    curl -k "$swagger_url" -o "$json_path"
    echo "Downloaded swagger JSON for $top_node"

    npx swagger-typescript-api -p "$json_path" -n "$api_ts"
    echo "Generated TypeScript API for $top_node"
  fi
done < ./swagger-codegen.yaml
dfuffjeb

dfuffjeb1#

使用像yq这样有效的YAML处理器,解析YAML内容变得微不足道。定义DSL查询(yq特定)以CSV格式输出节点和URL,并使用shell循环在其上迭代

while IFS=',' read -r node url; do
    json_path="${node}-swagger.json"
    if ! curl --fail -k "$url" -o "${json_path}"; then
        break
    fi
    npx swagger-typescript-api -p "$json_path" -n "${node}Api.ts"
done < <(yq '(keys | .[]) as $k | [$k, .[$k].url] | join(",")' ./swagger-codegen.yaml)
omvjsjqw

omvjsjqw2#

我采纳了@user1934428的建议,只使用了grep,因为yaml结构非常简单。
以下是最终的脚本:

#!/bin/bash

while IFS= read -r line; do
  if [[ "$line" =~ ^[a-zA-Z0-9_]+: ]]; then
    top_node=$(echo "$line" | sed -E 's/[: ]//g')
    url=$(grep -A 1 "$top_node:" ./swagger-codegen.yaml | grep "url:" | sed 's/url:[ ]*//;s/^[ \t]*//')

    json_path="${top_node}-swagger.json"
    api_ts="${top_node}Api.ts"

    curl -k "$url" -o "$json_path"
    echo "✅ Downloaded swagger JSON for $top_node"

    npx swagger-typescript-api -p "$json_path" -n "$api_ts"
    echo "✅ Generated TypeScript API for $top_node"
  fi
done < ./swagger-codegen.yaml

导致“curl:(3)URL使用错误/非法格式或缺少URL”消息是由于URL前的前导空格。只是不得不删除那些使用sed

相关问题