bash脚本中出现Curl命令问题,因为字符串变量包含引号

bash脚本中出现Curl命令问题,因为字符串变量包含引号,bash,curl,Bash,Curl,我正在bash脚本中执行curl命令 问题是在curl命令中,我必须传递一些变量($summary,$description)。 但是,由于这些变量位于单引号(')中,因此不会分配变量 仅供参考:我不能删除单引号,也不能替换为双引号 我怎样才能克服这种情况 Curl命令: curl -X POST -d '{"summary": "$summary", "description": "$description", "moduleMapAssets": [{"name":"Rates | IRD

我正在bash脚本中执行curl命令

问题是在curl命令中,我必须传递一些变量($summary,$description)。 但是,由于这些变量位于单引号(')中,因此不会分配变量


仅供参考:我不能删除单引号,也不能替换为双引号

我怎样才能克服这种情况

Curl命令:

curl -X POST -d '{"summary": "$summary",  "description": "$description", "moduleMapAssets": [{"name":"Rates | IRD"},{"name":"CRD | CRD"}]}' -H "Content-Type: application/json"
您可以(并且必须)使用双引号,只需转义字符串中的双引号:

curl -X POST -d "{\"summary\": \"$summary\",  \"description\": \"$description\", \"moduleMapAssets\": [{\"name\":\"Rates | IRD\"},{\"name\":\"CRD | CRD\"}]}" -H "Content-Type: application/json"
正如@MikeHolt在一篇评论中指出的,也可以在单个字符串中混合引用样式,因此可以在包含文字双引号的单引号部分和包含变量引用的双引号部分之间来回切换:

curl -X POST -d '{"summary": "'"$summary"'",  "description": "'"$description"'", "moduleMapAssets": [{"name":"Rates | IRD"},{"name":"CRD | CRD"}]}' -H "Content-Type: application/json"
更详细地解释一下:
…'{“summary”:““$summary””,“description”…“
被解析为单引号部分
”{“summary”:“
(其中双引号是文字),紧接着是双引号部分
“$summary”
(变量在其中展开),紧接着是另一个单引号部分
”,“description”…
等。由于这些部分之间没有空格,因此它们被视为
curl
的一个长参数

顺便说一句,如果您的任何变量本身可以包含双引号或反斜杠,事情就会变得复杂得多。如果可能出现类似的情况,您应该使用类似于
jq
的方法来创建字符串。类似于以下内容:

jsonstring=$(jq -n --arg summary "$summary" --arg description "$description" '{
    summary: $summary,
    description: $description,
    moduleMapAssets: [{name: "Rates | IRD"}, {name: "CRD | CRD"}]
    }' )
curl -X POST -d "$jsonstring" -H "Content-Type: application/json"

尝试在单引号上使用反斜杠

curl -X POST -d \'{"summary": "$summary",  "description": "$description", "moduleMapAssets": [{"name":"Rates | IRD"},{"name":"CRD | CRD"}]}\' -H "Content-Type: application/json"

“我不能删除单引号,也不能用双引号替换。"->有了这个限制,您想要的就无法实现。变量不会在单引号内解释。为什么您说您不能删除或更改它们?在curl中,-d之后的命令字符串应该在单引号中传递。我尝试删除它,并用双引号替换它,但在这种情况下,命令通过错误的请求错误。所以在curl中,-d之后的命令字符串应该以单引号传递不,先生。使用像
jq
这样的工具来生成JSON;它负责确保
summary
description
的内容在必要时得到正确转义。另外值得注意的是,bash会很高兴地将具有不同引用样式的字符串连接起来,只要它们之间没有空格,例如,
'foo'“bar”
相当于
“foobar”
。它可能会减轻逃避每一个
@MikeHolt”的负担。这是好的观点;请参阅更新。这是错误的。shell将对此进行分词并将其转换为多个参数。谢谢,但它也不起作用