2017-01-24 185 views
2

我正在嘗試抓取並將一個N_596164000673190002分配給curl命令中的變量。解析來自curl POST的HTTP響應

這是命令:

curl -L -H 'X-Cisco-Meraki-API-Key: mykeygoeshere' -X POST -H'Content-Type: application/json' --data-binary '{"name":"'"$NETWORK_NAME"'", "type":"appliance", "timeZone":"'"$TIME_ZONE"'"}' 'https://dashboard.meraki.com/api/v0/organizations/foobar/networks' 

這是響應:

{"id":"N_596164000673190002","organizationId":"foo","type":"appliance","name":"bar","timeZone":"America/Chicago","tags":""} 

如何成功地讀取和id後搶變量(不包括雙引號),同時還simutaneously分配它來一個變量,​​?我想這可以全部在一行中完成。

如果成功,echo $NETWORK_ID應該返回N_596164000673190002

+0

有很多重複;如果您不喜歡我提名的人,請澄清您的要求。有關如何將輸出分配給變量,規範是http://stackoverflow.com/questions/4651437/how-to-set-a-variable-equal-to-the-output-from-a-command-in- bash – tripleee

回答

1

管JSON輸出python jsonid值需要,並使用bash command substitution的結果分配給您的NETWORK_ID環境變量。

NETWORK_ID=$(curl -L -H 'X-Cisco-Meraki-API-Key: mykeygoeshere' -X POST \ 
    -H'Content-Type: application/json' \ 
    --data-binary '{"name":"'"$NETWORK_NAME"'", "type":"appliance", \ 
    "timeZone":"'"$TIME_ZONE"'"}' \ 
    'https://dashboard.meraki.com/api/v0/organizations/foobar/networks' \ 
| python -c "import sys, json; print json.load(sys.stdin)['id']") 
+0

這可行,但只有當我把它寫入一行。額外的信用:我喜歡這個代碼的可見性遠遠超過我的單行程。你知道這個問題可能是什麼嗎?反斜槓會使命令拋出錯誤。 – jagdpanzer

+0

不知道這個問題可能會發生什麼 - 我只是爲了可讀性而迅速將反斜槓和換行符放在那裏。水平滾動很糟糕...... – sideshowbarker

+0

確實如此。反斜槓的目的是讓shell將其讀爲一行,對嗎?它似乎會拋出與Python導入相關的錯誤。我可能會對此提出一個問題。感謝您的幫助! – jagdpanzer

3

要在bash解析JSON,人們通常使用jq,因爲它是默認在大多數Unix發行安裝。

嘗試以下操作:

NETWORK_ID=$(my_curl_command | jq -r '.id') 

這裏,'.id'是表示我們要檢索的值的關鍵id的過濾器,並-r標誌用於從輸出中刪除雙引號。