Linux
bash 中的 cURL 請求
我正在嘗試編寫一個腳本,它將在 bash 中執行兩個 curl 請求。這是我的程式碼:
#!/bin/bash ipadd="192.168.1.1" start_url="http://$ipadd/startPlayer" stop_url="http://$ipadd/stopPlayer" header1="Accept: application/json" header2="Content-Type: application/json" stp="28508ab5-9591-47ed-9445-d5e8e9bafff6" function start_player { curl --verbose -H \"${header1}\" -H \"${header2}\" -X PUT -d '{\"id\": \"$stp\"}' ${start_url} } function stop_player { curl -X PUT $stop_url } stop_player start_player
stop_player 函式沒有問題,但第一個函式不起作用。我只想執行以下 CURL 請求:
curl --verbose -H "Accept: application/json" -H "Content-Type: application/json" -X PUT -d '{"id": "c67664db-bef7-4f3e-903f-0be43cb1e8f6"}' http://192.168.1.1/startPlayer
如果我回顯 start_player 函式,則輸出與應有的完全一樣,但是如果我執行 start_player 函式,則會出現錯誤:Could not resolve host: application
. 我認為這是因為 bash 正在拆分標頭,但為什麼它與 echo 一起工作正常,但在 bash 中卻不行?
你寫了:
curl --verbose -H \"${header1}\" -H \"${header2}\" ...
但看起來你真的想要:
curl --verbose -H "${header1}" -H "${header2}" ...
使用您為
header1
and設置的值header2
,前者將導致curl
作為參數接收--verbose
,-H
,"Accept:
,application/json"
,-H
,"Content-Type:
, andapplication/json"
,而您確實希望每個標頭值作為其自己的標記,未轉義的雙引號將提供。另外,我看到你通過
-d '{\"id\": \"$stp\"}'
. 你可能想要-d "{\"id\": \"$stp\"}"
那裡。至於您關於為什麼 whings 在 echo 中似乎可以正常工作的問題,“但在 bash 中卻不行”,嗯,事情實際上並沒有在 echo 中正常工作,只是它讓這個事實很難看到。
比較:
$ h1='Accept: foo'; h2='Content-Type: bar' ## Looks good, is actually wrong: $ echo curl -H \"$h1\" -H \"$h2\" curl -H "Accept: foo" -H "Content-Type: bar" ## If we ask printf to print one parameter per line: $ printf '%s\n' curl -H \"$h1\" -H \"$h2\" curl -H "Accept: foo" -H "Content-Type: bar"
和:
## Looks different from the bash command, is actually right: $ echo curl -H "$h1" -H "$h2" curl -H Accept: foo -H Content-Type: bar ## This is more obvious if we ask printf to print one parameter per line: $ printf '%s\n' curl -H "$h1" -H "$h2" curl -H Accept: foo -H Content-Type: bar