【问题标题】:cURL in Bash - Passing Variables Between Single QuotesBash 中的 cURL - 在单引号之间传递变量
【发布时间】:2015-07-27 15:20:34
【问题描述】:

我正在尝试通过命令行将参数传递给 cURL,这样:

curl -s -X POST -H "Content-Type: text/xml" -H "Cache-Control: no-cache" -d '<Data Token="someToken" Name='"$appName"' ID='"$someVar"' ParseAppID='"$someVar"' ParseRESTKey='"$someVar"' AndroidPackage='"$someVar"' Version="1"></Data>' 'https://prefix.something.com/somePath?InputType=Xml'

(此行实际上是从 Postman 应用程序中提取的)。

我在谷歌上搜索了这个问题,发现很多对我不起作用的解决方案(链接是过去的问题...):

  1. 我尝试了isolating 变量通过结束单引号,这样:'before...'"${someVar}"'...after...'。无法完成请求。
  2. 我尝试传递变量using a file (-d @fileName)。发帖失败。
  3. 我尝试在 &lt;Data&gt; 标记周围加上双引号的 replacing 单引号 - 但该命令显然不能接受这种替换。

我得到的错误是&lt;Error&gt;&lt;/Error&gt;The server encountered an error and could not complete your request.

是否有可能存在其他解决方案? 有没有人遇到过这样的问题?

如果有任何帮助,我将不胜感激。

【问题讨论】:

  • 去掉单引号是使变量得到扩展的唯一方法。也就是说,变量的内容在该位置是否合法是另一个问题。您可能会以这种方式构造一个非法请求,但这不是 shell 变量问题。当您尝试这样做时,您的具体失败是什么?
  • @EtanReisner 感谢您的评论。当我做类似'&lt;Data Name='"$appName"'&gt;&lt;/Data&gt;' 的事情时,我得到的错误是空的:&lt;Error&gt;&lt;/Error&gt;。我尝试在此命令之前回显变量,并且它们都已正确打印。
  • 提供一种方法来保证输出始终是有效的 XML,顺便说一下,这将是一个不同的、更长的答案。 @chepner 涵盖了便宜/简单的方法;确保文档有效性(实体转义等)需要不同的工具。

标签: bash shell curl


【解决方案1】:

您没有像 Name 那样在 ID 的值周围提供引号。也就是说,你需要

'<Data Token="someToken" Name="'"$appName"'" ...>'
                              ^^^
                              |||
                              ||+- shell quote to protect $appName
                              |+- shell quote enclosing the XML
                              +- literal quote embedded in the XML

导致字符串(假设appName=foo

<Data Token="someToken" Name="foo" ...>

【讨论】:

  • 嗨@chepner,谢谢。我尝试将此应用于所有参数,例如:curl -s -X POST -H "Content-Type: text/xml" -H "Cache-Control: no-cache" -d '&lt;Data Token="someToken" Name="'"$someVar"'" ID="'"$someVar"'" ParseAppID="'"$someVar"'" ... Version="1"&gt;&lt;/Data&gt;' 'someURL',但仍然得到&lt;Error&gt;&lt;/Error&gt;。更改是否正确?
  • @OphirHarpaz,如果您想知道您的更改是否正确,请使用bash -x yourscript 准确查看传递给 curl 的内容(尽管这是外壳转义,而不是逐字节)。也就是说,乍一看,你在那里做的事情对我来说看起来不错——也就是说,它应该代入有问题的变量;结果是否为有效文件另当别论。
  • 按照 Charles 的说法,我会尝试一个示例查询,您可以在其中硬编码 everything 以确保您得到正确的查询,独立于任何 shell 引用。
  • @CharlesDuffy 好的,非常感谢。我会尝试并检查我是否真正传递了有效的参数。再次感谢,您的回答很有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-06
  • 2011-12-26
  • 1970-01-01
相关资源
最近更新 更多