bash 中的 cURL 请求

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 中却不行?

答案1

你写了:

curl --verbose -H \"${header1}\" -H \"${header2}\" ...

但看起来你真的想要:

curl --verbose -H "${header1}" -H "${header2}" ...

header1使用您为和设置的值header2,前者将导致curl接收作为参数--verbose, -H, "Accept:, application/json", -H, "Content-Type:, 和 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

相关内容