Bash

使用文件中的變數通過 JSON 推送數據

  • August 13, 2022

我目前被困在嘗試通過需要 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.

引用自:https://unix.stackexchange.com/questions/713526