如何在 curl 命令中将标头作为参数传递?

Ale*_*x S 3 bash shell curl

我正在尝试执行使用预定义变量作为标头的 curl 命令。

header='-H "Content-Type: application/json" -H "userGUID: 7feb6e62-35da-4def-88e9-376e788ffd97" -H "Content-Length: 51"'
Run Code Online (Sandbox Code Playgroud)

这本质上是 curl 命令

curl $header -w "http code: %{http_code}\\n" -X POST -d $BODY $URL 
Run Code Online (Sandbox Code Playgroud)

然后返回错误消息

rl: (6) Could not resolve host: application
curl: (6) Could not resolve host: 7feb6e62-35da-4def-88e9-376e788ffd97"
curl: (6) Could not resolve host: 51"
Run Code Online (Sandbox Code Playgroud)

这按预期工作

curl -H "Content-Type: application/json" -H "userGUID: 7feb6e62-35da-4def-88e9-376e788ffd97" -H "Content-Length: 51" -w "http code: %{http_code}\\n" -X POST -d $BODY $URL 
Run Code Online (Sandbox Code Playgroud)

我试图将标头作为变量传递的原因是因为我正在编写一个循环遍历数组的脚本,但目前由于某种原因这不适用于标头。为 body 传递参数没有问题。

waf*_*cat 6

请注意,bash 中的变量扩展很容易让人措手不及。

一个很好的经验法则是在您想要扩展的任何变量周围加上双引号,例如curl "$header" -w "http code: %{http_code}\\n" -X POST -d "$BODY" "$URL".

$SOMETHING如果变量单独出现,或者如果它们出现在双引号中,Bash 总是扩展变量。(如果它们出现在单引号中则不会)。

双引号展开时它们被外壳视为单个“标记”,无论如何。

没有双引号的情况下展开时它们将被解析,就像您输入了它们的内容而不是变量一样。所以 - 如果该变量有空格,那可能意味着 shell 会将它们视为参数之间的分隔符。

  • 对我不起作用。`curl '$header' ...` 给我 `curl: (6) 无法解析主机:$header` (2认同)
  • @AlexS,嗯?双引号是正确的(ish;您不能以这种方式传递多个参数;为此,需要一个数组,如 [BashFAQ #50](http://mywiki.wooledge.org/BashFAQ/050) 中所述) ; 单引号是错误的(它们将带有文字“$”的字符串而不是变量内容传递给“curl”)。 (2认同)