【发布时间】:2018-10-01 18:12:53
【问题描述】:
我有这个可以在 bash 脚本中声明 JSON 字符串:
local my_var="foobar"
local json=`cat <<EOF
{"quicklock":"${my_var}"}
EOF`
上面的heredoc有效,但我似乎无法以任何其他方式对其进行格式化,它实际上必须看起来完全像那个lol。
有没有办法让命令在一行,像这样:
local json=`cat <<EOF{"quicklock":"${my_var}"}EOF`
这样会好很多,但似乎不需要,显然只是因为 EOF 不是这样工作的,我猜哈哈。
我正在寻找一种在文件中声明 JSON 的简写方式:
- 不需要大量的转义字符。
- 允许动态插值变量。
注意:我要使用的实际 JSON 有多个动态变量,其中包含许多键/值对。请推断。
【问题讨论】:
-
为什么还要为单行文件费心呢?
json='{"quicklock":true}' -
我的 2 美分:
j='{"quicklock":"%s"}'; json=$(printf "$j" "${my_var}")。使用printf,您可以构建您的 json 骨架,然后再填充它。 -
适用于任意数量的变量
j='{"quicklock":"%s","slowlock":"%s"}'; json=$(printf "$j" "${my_var}" "${o_var}")。 -
顺便说一句,这是一种生成 JSON 的错误方式——它不会正确转义无效字符;考虑
my_var='foo", "next_url": "http://evil.com/'之类的——我见过现实世界的API,这种事情会导致向通知等添加恶意图像链接。请改用jq。 -
相比之下,@Olegzandr、
json=$(jq -n --arg my_var "$my_var" '{"quicklock": $my_var}')会尊重您的变量,但总是会生成格式良好的输出。 (如果您的变量应该是格式良好的 JSON,则可以将其更改为json=$(jq -n --arg my_var "$my_var" '{"quicklock": ($my_var | fromjson)}');最终结果是,如果该值 不是 JSON,则您会收到错误,而不是而不是默默地生成一个无效的文档)。