将一个变量传递给CURL(Firebase REST API)
问题描述:
我正在尝试开发一个脚本,该脚本将在具有OpenWRT的路由器上运行。现在我可以获得路由器的IP。我只想将其上传到Firebase。如果我做了以下它被写入到数据库:将一个变量传递给CURL(Firebase REST API)
curl -X PUT -d '{"IPv4": "192.168.1.1"}' \
'https://name.firebaseio.com/Values.json'
我想知道的是通过IP值作为输入:
var=$(/sbin/ifconfig eth0 | grep 'inet addr' | cut -d: -f2 | awk '{print $1}');
curl -X PUT -d '{"IPv4": '"${var}"'}' \
'https://name.firebaseio.com/Values.json'
如果我运行此我得到一个解析错误:
{
"error" : "Invalid data; couldn't parse JSON object, array, or value. Perhaps you're using invalid characters in your key names."
}
答
如果你把反斜线双引号围绕前${var}
你curl
调用将工作:
curl -X PUT -d '{"IPv4": '\"${var}\"'}' \
'https://name.firebaseio.com/Values.json'
或者更好的,只是把整个-d
ARG在双引号,并使用反斜线双引号内:
curl -X PUT -d "{\"IPv4\": \"${var}\"}" \
'https://name.firebaseio.com/Values.json'
相反,它在这个问题格式化的方式,var
值获取发送不带引号您的JSON:
$ curl --trace-ascii - -X PUT -d '{"IPv4": '"${var}"'}' \
'https://name.firebaseio.com/Values.json'
== Info: Trying 104.154.130.226...
== Info: TCP_NODELAY set
== Info: Connected to name.firebaseio.com (104.154.130.226) port 443 (#0)
== Info: TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
== Info: Server certificate: firebaseio.com
== Info: Server certificate: Google Internet Authority G2
== Info: Server certificate: GeoTrust Global CA
=> Send header, 163 bytes (0xa3)
0000: PUT /Values.json HTTP/1.1
001b: Host: name.firebaseio.com
0036: User-Agent: curl/7.51.0
004f: Accept: */*
005c: Content-Length: 25
0070: Content-Type: application/x-www-form-urlencoded
00a1:
=> Send data, 25 bytes (0x19)
0000: {"IPv4": 192.168.111.100}
^^^^^^^^^^^^^^^
不带引号,这是不是值类型的JSON解析器识别(不是字符串,而不是数字,不是一个对象,而不是一个数组,而不是true
/false
,而不是null
),所以解析失败。