bash,大括号,引号和curl -d

时间:2018-11-02 16:33:56

标签: bash curl

我正在尝试使用curl将一些数据的标头和键值对发送到我的服务器。看来我遇到了bash引用问题,我的键值对像主机一样被对待。

curl -v --header "Content-Type: application/json" \
--header "Foo: Bar 123456"  \
-d \"\{ "baz": "glern", "froboz": "foo again"\}\" \
https://example.com > foo.html 2> error.txt 

example.com告诉我:

HTTP 404 Not Found: URL or Document not found (dns_unresolved_hostname) 

HTTP 404: Your requested host "baz" could not be resolved by DNS. The document at the specified URL does not exist.

HTTP 404 Not Found: URL or Document not found (dns_unresolved_hostname) 

HTTP 404: Your requested host "glern," could not be resolved by DNS. The document at the specified URL does not exist.

and error.txt像这样开始:

* Rebuilt URL to: baz:/
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0*   Trying 10.196.133.236...
* TCP_NODELAY set
* Connected to http.proxy.mycompanyproxy.com (10.196.133.236) port 8000 (#0)
> POST http://baz:/ HTTP/1.1
> Host: baz
> User-Agent: curl/7.54.0
> Accept: */*
> Proxy-Connection: Keep-Alive
> Content-Type: application/json
> Foo: Bar 123456
> Content-Length: 2
> } [2 bytes data]
* upload completely sent off: 2 out of 2 bytes
< HTTP/1.1 404 Not Found
...

我当然不是故意要打主机,笨拙的东西等等……这肯定像是外壳引用问题。但是在尝试了许多不同的操作之后,例如在我的键值对周围的现有空白处添加了额外的“ \”,我在这里有点迷失了。

2 个答案:

答案 0 :(得分:3)

<video src='https://anotherServer.com/assets/myVideo.mp4' controls> </video> 之后,只有-d构成\"\{的参数。尚不清楚您在追求什么,但也许:

-d

这样,curl -v --header "Content-Type: application/json" \ --header "Foo: Bar 123456" \ -d '{ "baz": "glern", "froboz": "foo again"}' \ https://example.com > foo.html 2> error.txt 的参数为:

-d

没有调用在包含大量双引号的字符串周围使用双引号;只会让生活更艰难。

答案 1 :(得分:3)

考虑一下,如果您只拥有一个文件,数据将是什么样:

$ cat tmp.json
{ "baz": "glern", "froboz": "foo again" }

在这种情况下,您只需使用

$ curl ... -d "$(cat tmp.json)"

现在可以这么说(只需将双引号切换为单引号,以避免在命令行上转义一串引号):

$ curl ... -d '{ "baz": "glern", "froboz": "foo again" }'
# with double quotes, it's
#  curl ... -d "{ \"baz\": \"glern\", \"froboz\": \"foo again\" }"
# ... ew.

尽管如此,通常最好让jq之类的工具为您生成JSON,而不是尝试手动编写JSON。这样可以在需要时大大简化报价。

$ curl ... -d "$(jq -n '{baz: "glern", froboz: "foo again"}')"

如果您的JSON不是经过硬编码的,而是来自{"baz": "$SOME_VAR"}之类的变量,则几乎必须使用这种工具。不用跳圈来确保SOME_VAR中的所有内容均已正确转义,而是让jq为您完成:jq -n --argjson x "$SOME_VAR" '{baz: $x}'。注意$x不是一个shell变量;这是一个jq变量。