使用 JSON 清除 Bash 引用

使用 JSON 清除 Bash 引用

我之前看过类似的问题,但并没有准确回答我的问题。

我正在使用 cURL 发送 JSON 请求,如下所示:

curl -X POST  -H "Content-Type:application/json" "$HOST" -d '{"uri": "'"$URI"'", "identityKeyValue":"'"`date +%s`"'", "identityKeyType": "bar", "status": "'$STATUS'", "statusDetail": "'"$STATUS_DETAIL"'", "exclusionKeys": [], "monitoredEntity": {"name": "foobar"}, "timestamp":'"`date +%s`"', "metadata": {} }'

它确实有效,但是非常丑陋(我说的是之后的部分-d),但我找不到满足以下条件的更好的东西:

  1. 支持变量替换(如$STATUS
  2. 支持命令替换(如`date +%s`

由于它是 JSON,显然需要很多双引号 ( ")

命令不必只有一行。我想要可读性和清晰度,而不是这种混乱/杂乱的外观。你有什么建议?

答案1

将其分解为多个步骤并使用printf模板:

fmt='{"uri": "%s", "identityKeyValue":"%s", "identityKeyType": "bar", "status": "%s", "statusDetail": "%s", "exclusionKeys": [], "monitoredEntity": {"name": "foobar"}, "timestamp":%d, "metadata": {}}'
time=$(date +%s)
data=$(printf "$fmt" "$URI" $time "$STATUS" "$STATUS_DETAIL" $time)
curl -X POST  -H "Content-Type:application/json" "$HOST" -d "$data"

另外,摆脱使用 ALL_CAPS_VARNAMES 的习惯:有一天你会不小心使用 PATH,然后想知道为什么你的程序崩溃了。

相关内容