2017-02-18 43 views
2

目标是在example.com创建一个帐户。我们需要一个字母数字名称,我们得到了。如何在curl中传递变量?

我们有什么:

$name="egon111" 
$pw="notegon" 

curl -s -X POST -d 'username="'"$name"'"&password="'"$pw"'"' https://example.com/create 

我们通常需要以下的curl命令:

curl -s -X POST -d "username=egon111&password=notegon" https://example.com/create 

什么是错的语法?在我看来,我们目前发送的名称为$name,密码为$pw,而不是变量本身,这是完全错误的。 我们得到以下错误:

Select a username that is alphanumeric. 

格尔茨, 克拉拉

我是新的计算器。随意评论,以便我可以提高自己。

+0

欢迎来到StackOverflow!第一个优秀问题。 :-)如果你提到了你正在使用的shell,这将会很有帮助。 – ghoti

回答

0

您的任务不正确,正如@sideshowbarker指出的那样。在外壳,不像Perl或PHP或Ruby的全局变量,你不使用的变量$分配他们的时候,但只有当引用它们:

name="egon111" 
pw="notegon" 

但是仍然留下字面报价的问题标记在curl命令中。查询字符串参数(及其在请求正文中的POST ed等价物)不应被引用。 (上面赋值中的引号是shell语法,它们不会存储在变量中;在这种情况下,您可以将它们完全关闭,因为您分配的值不包含任何空格,但它们是无害的。 )

但查询字符串/ POST正文参数不是shell参数。您curl命令:

curl -s -X POST -d 'username="'"$name"'"&password="'"$pw"'"' https://example.com/create 

得到由外壳扩展到这相当于:

'curl' '-s' '-X' 'POST' '-d' 'username="egon111"&password="notegon"' \ 
    'https://example.com/create' 

注意字面"各地都usernamepassword的值。那些由Web服务器解释为这些参数值的一部分,而不是引用语法。由于引号不是字母数字,因此会显示您发布的错误消息。

你可以只删除多余的引号,它应该很好地工作:

curl -s -X POST -d 'username='"$name"'&password='"$pw" https://example.com/create 

但比它需要的是就是噪音。您不需要将username=&password=放在单引号中,因为没有什么可以扩展的。您需要引用&,但双引号可以正常工作。所以你可以简单地做到这一点:

curl -s -X POST -d "username=$name&password=$pw" https://example.com/create 
+0

curl -s -X POST -d'username ='“$ name”'&password ='“$ pw”https:// example。com/create - 这个工作! Thx很多;) –

+0

我也是bash的'printf'%q''的粉丝。在这种情况下,'curl -s -X POST -d“$(printf'username =%q&password =%q'”$ name“”$ pw“)”https:// example.com/create' ..虽然OP没有表明她在使用bash。 – ghoti