如何正确输入字符串以在bash中解析为JSON?

时间:2017-10-20 15:13:47

标签: json bash github-api

我得到一个"解析JSON"当我尝试运行我的代码并且我不确定为什么因为它有意义时(至少对我而言):

#!/bin/bash

LAST_TAG_NAME=$(curl -s 'https://api.github.com/repos/USERNAME/REPONAME/releases/latest' | sed -n '/tag_name/{ s/[^:]*:[\ ]*\([^,]*\),/\1/; p; }' | sed -e 's/^"//' -e 's/"$//')
LAST_TAG_NUMBER=$(echo ${LAST_TAG_NAME} | grep -o '\..*' | sed -e 's/^.//')
TAG_NAME="api-web-${YEAR}w${WEEK}"
CURRENT_NUM=$((LAST_TAG_NUMBER + 1))
FINAL_NAME="$TAG_NAME.$CURRENT_NUM"

curl -u USERNAME:TOKEN -X POST 'https://api.github.com/repos/USERNAME/REPONAME/releases' -H 'Accept: application/json, text/javascript' --data-binary '{"tag_name": $FINAL_NAME}'

基本上,所有可变的东西都有效。 TAG_NAME看起来像api-web-2017w42,而CURRENT_NUM只是像2这样的数字。问题只有在我尝试创建新版本时才会退出。请注意,USERNAME和REPONAME是匿名的。

1 个答案:

答案 0 :(得分:1)

虽然你的具体问题是@randomir指出的变量扩展,但你可以使用jq JSON解析器,就像sed for JSON一样处理你的JSON数据结果。有了这个,你不需要手动创建json对象:

year=2017
week=42
user=bertrandmartel
repo=speed-test-lib

final_name=$(curl -s "https://api.github.com/repos/$user/$repo/releases/latest" | \
     jq -r --arg year $year --arg week $week \
     '. | .tag_name | 
      { 
         tag_name: (
            "api-web-" + $year + "w" + $week + "." + 
            (((split(".")[1] | tonumber) + 1) | tostring)
         ) 
      }')

echo "$final_name"

curl -u USERNAME:TOKEN \
     "https://api.github.com/repos/$user/$repo/releases" \
     -H 'Content-Type: application/json' -d "$final_name"