Linux

bash 中的 cURL 請求

  • March 1, 2018

我正在嘗試編寫一個腳本,它將在 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}" ...

使用您為header1and設置的值header2,前者將導致curl作為參數接收--verbose, -H, "Accept:, application/json", -H, "Content-Type:, and application/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

引用自:https://unix.stackexchange.com/questions/427492