将Bash变量传递给CURL

7
当我像这样提供值时,它可以正常工作:
curl --silent \ --insecure \ -X POST \ -d '{"Name" : "Vikram"}' \ -H "Content-Type: application/json" \ $restUrl

但如果我这样提供它:
post="'{\"Name\" : \"Vikram\"}'"    
echo $post   // Prints '{"Name" : "Vikram"}'
echo ${post} // Prints '{"Name" : "Vikram"}'

但是下面的代码无法工作,会产生400错误:
curl --silent \ --insecure \ -X POST \ -d ${post} \ -H "Content-Type: application/json" \ $restUrl
3个回答

9
似乎有多个问题。
1)为了回答您标题中提出的问题,当您将$post用作参数时,其值中的空格会使Bash将其视为多个参数。尝试在其周围放置引号,以使其被视为一个参数。
2)我猜您向$post添加了单引号,尝试让Bash将其视为单个参数。尝试删除单引号。
3)对于我来说,所有curl命令中的反斜杠都导致它失败。也许您将其拆分成多行,并且复制/粘贴没有将其转换。在下面的示例中,我已将它们删除。
把所有东西放在一起:
post="{\"Name\" : \"Vikram\"}"
curl --silent --insecure -X POST -d "${post}" -H "Content-Type: application/json" $restUrl

但我仍然遇到相同的错误,我尝试了你建议的方法,但无法解决问题。 - Vikram
@Vikram 我已经更新了我的答案。我认为你可能还想删除单引号。不知道 $restUrl 的服务器端是什么,很难说。 - twm
我可以像这样使用curl命令吗:curl --silent \ --insecure \ -X POST \ -d {"Name" : "Vikram"}, '{"Country" : "India"} \ -H "Content-Type: application/json" \ $restUrl 嗨,我需要传递多个参数,REST方法如下: @RequestMapping(method = RequestMethod.POST, value = "/save") public void save( @RequestParam(name = "country") String country, @RequestBody Name name) - Vikram

2

不要在$post变量内部加上单引号,而是要将单引号放在需要加引号的值周围。这样你就不需要转义值内部的双引号。

post='{"Name" : "Vikram"}'

在使用curl命令行时,引用变量以防止它被分成多个参数。

此外,您不应该在curl命令行中添加所有这些反斜杠。它们会转义它们后面的空格,因此它们将被视为文字参数而不是定界符。在命令中使用反斜杠的常见情况是,如果您要将其拆分成多行,则需要转义换行符,以便它不会结束命令。

curl --silent --insecure -X POST -d "${post}" -H "Content-Type: application/json" "$restUrl"

contentType="Content-Type: application/json" 如何像 -H ${contentType} 一样在头部中包含它不起作用。有什么解决方法吗? - Vikram
你看了我的回答吗?它对引用变量有什么说法? - Barmar
让我们在聊天中继续这个讨论 - Vikram
你不能在使用变量的同一行上进行变量赋值。 - Barmar
所有变量在执行命令之前都会被展开,因此它不会在变量展开之前执行赋值操作。 - Barmar
显示剩余4条评论

0

你想引用${post}"${post}",这样你的shell就不会分割变量的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接