2016-01-19 72 views
3

我的JSON:JQ解析字符串以 「 - 」

{ 
    "projects": { 
     "api-client": { 
      "status": "false", 
      "when": "19-01-2016 12:54:47" 
     }, 
     "api-admin": { 
      "status": "false", 
      "when": "19-01-2016 12:54:47" 
     }, 
     "myweb": { 
      "status": "false", 
      "when": "19-01-2016 12:54:47" 
     } 
    } 
} 

腳本:

JQ=$(which jq) 
CACHE='cache.json' 
PROJECT=("api-client" "api-admin" "myweb") 
for PROJECT in ${PROJECTS[*]}; do 
    if [[ $(${JQ} -r ".projects.\"${PROJECT}\"" ${CACHE}) != null ]]; then 
     if [[ $(${JQ} -r ".projects.\"${PROJECT}\".status" ${CACHE}) == true ]]; then 
      local PROJECTDATE=$(${JQ} -r ".projects.\"${PROJECT}\".when" ${CACHE}) 
      local STATUS="${COLOR_GREEN}Installed${CLEAR} on ${COLOR_YELLOW}${PROJECTDATE}${CLEAR}" 
     else 
      local STATUS="${COLOR_RED}Not installed${CLEAR}" 
     fi 
     echo -e "${CLEAR} - ${COLOR_CYAN}${PROJECT}${CLEAR} => ${STATUS}" 
    fi 
done 

Error: error: syntax error, unexpected QQSTRING_START, expecting IDENT .projects."api-client" ^1 compile error error: syntax error, unexpected QQSTRING_START, expecting IDENT .projects."api-client".status ^1 compile error - api-client => Not installed

能有人幫我調試腳本?

回答

2

首先,.foo.bar只是.["foo"]["bar"]的簡寫語法。將後者用於非字母數字值,如api-client。其次,你不應該通過在其中插入shell變量來編寫jq腳本。相反,使用--arg將值傳遞給它們。也就是說,不是這樣,:

${JQ} -r ".projects.\"${PROJECT}\"" ${CACHE} 

或許你也應該這樣做:

${JQ} --arg project "$PROJECT" -r '.projects[$project]' ${CACHE} 

注意周圍的JQ節目單引號:$project是一個JQ變量語法,像Perl或PHP;它並沒有被shell插入。總是在你的jq程序中使用單引號。

第三,您可以使用-e,以便truthy值的狀態碼爲0。取而代之的是:

if [[ $(${JQ} -r ".projects.\"${PROJECT}\"" ${CACHE}) != null ]]; then 

你可以只是這樣做:

if ${JQ} --arg project "$PROJECT" -e -r '.projects[$project]' ${CACHE}; then 

同樣,你可以刪除以同樣的方式比較爲true。