在单引号内插入

在单引号内插入

我有以下内容:

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 感知工具,例如jqjo。这确保了数据被充分编码以包含在文档中。在 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\""
}

请注意双引号是如何自动处理的。

相关内容