Bash
使用文件中的變數通過 JSON 推送數據
我目前被困在嘗試通過需要 JSON 結構的 API 推送數據的地方。我需要從文件中讀取值,我在其中寫道:
file="/value" name=$(cat "$file")
所以 $name 是值文件中內容的變數,並且工作得很好,當我需要推送數據時問題就來了:
cos -u https://myapi.com push data '{ "sec": 0, "usage": 0, "actions": [ { "name": "transfer", "data": { "from": "test", "to": "test2", "value": $name, "message": "" },
如何定義讀取“值”對像上的名稱變數?
假設文件中的數據應作為原始字元串,則需要進行 JSON 編碼。使用理解 JSON 的程序最容易做到這一點,例如
jq
:json=' { "actions": [ { "data": { "from": "test", "message": "", "to": "test2" }, "name": "transfer" } ], "sec": 0, "usage": 0 } ' json=$( jq --arg value "$(cat "$file")" '.actions[0].data.value = $value' <<<"$json" ) cos -u 'https://myapi.com' push data "$json"
請注意,
$value
表達式jq
中的不是 shell 變數,而是一個內部jq
變數,其值在命令行中給出,--arg
並且它是自動 JSON 編碼的。
$file
無需在命令行上擴展數據(如果數據量很大,這將很重要)來處理數據的稍微更方便的方法是將數據單獨轉換為 JSON 字元串並將其傳遞給jq
插入它的通過程序替換的正確位置:jq '.actions[0].data.value = input' - <( jq -Rs . data ) <<<"$json"
您還可以使用從文件中讀取的鍵值
jo
創建data
對象,然後將其插入 shell 變數:value``$file
datajson=$( jo from=test message="" to="test2" value=@"$file" ) json=' { "actions": [ { "data": '"$datajson"', "name": "transfer" } ], "sec": 0, "usage": 0 } ' cos -u 'https://myapi.com' push data "$json"
請注意,我們如何臨時打破構成 JSON 文件的單引號字元串,以插入
$datajson
.