我正在尝试编写一个脚本,它将在 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