2017-10-20 121 views
0

我得到消息時,我嘗試運行我的代碼「JSON解析問題」,我不知道爲什麼,因爲它是有道理的(至少對我來說):如何正確輸入字符串以便在bash中解析爲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是匿名的。

+3

問題出在'$ FINAL_NAME'上。它不擴展,所以服務器收到'{「tag_name」:$ FINAL_NAME}',這是無效的JSON。改用「{」tag_name「:」'「$ FINAL_NAME」'「}''。 – randomir

回答

1

儘管您的具體問題是@randomir指出的變量擴展,您可以使用jq JSON解析器,它類似於JSON的sed來處理您的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"