【问题标题】:Curl command issue in bash script because of string variable containing quotes [duplicate]由于包含引号的字符串变量,bash脚本中的Curl命令问题[重复]
【发布时间】:2019-03-20 18:05:05
【问题描述】:

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

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

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

我该如何克服这种情况。

卷曲命令:

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

【问题讨论】:

  • "我不能删除单引号,也不能用双引号替换。" -> 有了这个限制,你想要的就无法完成。变量不会在单引号内解释。为什么你说你不能删除或更改它们?
  • 在 -d 之后的 curl 命令字符串中应以单引号形式传递。我尝试删除它并用双引号替换它,但在这种情况下,命令通过错误的请求错误。所以寻找解决方法。
  • "在 -d 之后的 curl 命令字符串中应该用单引号传递。"不,先生。
  • 使用jq之类的工具生成这样的JSON;它负责确保summarydescription 的内容在必要时正确转义。

标签: bash curl


【解决方案1】:

您可以(并且必须)使用双引号,您只需要转义作为字符串一部分的双引号:

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"

【讨论】:

  • 同样值得注意的是,bash 很乐意连接具有不同引用样式的字符串,只要您之间没有任何空格,例如,'foo'"bar" 等价于 "foobar"。它可能会减轻必须逃避每个" 的负担。
  • @MikeHolt 好点;查看更新。
【解决方案2】:

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

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

【讨论】:

  • 这是错误的。 shell 将对此进行分词并将其转换为多个 args。
  • 谢谢,但它也不起作用
猜你喜欢
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
  • 2012-12-02
  • 2020-07-06
  • 2020-10-12
  • 1970-01-01
  • 1970-01-01
  • 2020-03-21
相关资源
最近更新 更多