2017-02-18 3737 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