我有以下内容:
COMMENT="A random comment"
TEXT_JSON='{"person" : "Jim","comment" : "$COMMENT"}'
echo "$TEXT_JSON" | jq .
这打印
{
"person": "Jim",
"comment": "$COMMENT"
}
这不是我想要的。我如何在这里插入字符串?
答案1
您不能在单引号内插入。
您可以将字符串放在双引号中,然后转义文字双引号:
COMMENT="A random comment"
TEXT_JSON="{\"person\" : \"Jim\",\"comment\" : \"$COMMENT\"}"
echo $TEXT_JSON | jq .
{
"person": "Jim",
"comment": "A random comment"
}
或者,您可以保留单引号,这样就不必转义任何内容,但在变量之前结束单引号,然后对变量使用双引号,然后对字符串的最后部分使用单引号:
TEXT_JSON='{"person" : "Jim","comment" : "'"$COMMENT"'"}'
答案2
Shell 变量永远不会在 shell 中的单引号字符串中扩展。
要使用 shell 变量中的数据创建 JSON 文档,请使用 JSON 感知工具,例如jq
或jo
。这确保了数据被充分编码以包含在文档中。在 JSON 文档中扩展 shell 变量并不是您想要做的事情。
使用jq
:
comment='Some comment from "Random User"'
jq -n --arg comment "$comment" '{ "person": "Jim", "comment": $comment }'
使用jo
:
comment='Some comment from "Random User"'
jo person=Jim comment="$comment"
这两者都会创建等效的 JSON,可以表示为
{
"person": "Jim",
"comment": "Some comment from \"Random User\""
}
请注意双引号是如何自动处理的。