2016-12-01 62 views
0

我在我的bashrc文件中有一個簡單的函數,它需要2個參數並進行卷曲調用。問題是,curl請求沒有獲取變量。這裏的功能...變量在bash中不起作用

checkUserName() { 
    cd ~/ 
    echo "checking for username $2" 
    curl -w "@curl-format.txt" -H "Content-Type: application/json" -X POST -d '{"userName": "$2"}' http://localhost:8080/$1/verify 
} 
alias unameCheck=checkUserName 

然後,我喜歡的東西把它...

unameCheck users danwguy 

,我會看到...

checking for username danwguy 
在我的終端提示

,但是當我從我的應用程序中查看日誌時,它顯示它正在檢查userName $ 2 因此,即使$ 1被替換,curl命令中的變量也沒有被替換,因爲它調用了正確的A PI在我的本地主機上。 它在echo命令中替換它,但不在curl命令中。

我甚至嘗試過創建一個局部變量,但是這仍然不起作用,不管我做什麼,它都不會在curl調用中取代,但它在echo調用中。 任何人都可以看到爲什麼它不會正確地取代$ 2

回答

3

參數擴展($var)不會用單引號擴展。使用雙引號來代替:

$ curl -w "@curl-format.txt" \ 
    -H "Content-Type: application/json" \ 
    -X POST \ 
    -d '{"userName": "'"$2"'"}' \ 
    "http://localhost:8080/$1/verify" 

而且包裝參數擴展在雙引號以避免word splittingpathname expansion

+0

好回答;術語可疑:'$ var'是一個參數_(變量)的引用。認識到引用並用參數的值替換它就是所謂的_parameter expansion_。 同樣,您避免_unquoted references_參數(或未加引號的命令替換/算術擴展)來防止分詞和路徑名擴展。 – mklement0

2

只是註釋以前的​​評論。

可以逃脫雙引號反斜槓,告訴bash的解釋不解釋它的特殊意義,所以最終代碼看起來像:

... -d "{\"userName\": \"$2\"}" ... 

哪個方式對我來說更明顯...