Json 将变量传递给CURL(Firebase REST API)

Json 将变量传递给CURL(Firebase REST API),json,shell,parsing,curl,firebase-realtime-database,Json,Shell,Parsing,Curl,Firebase Realtime Database,我正在尝试开发一个脚本,它将使用OpenWRT在路由器上运行。现在我可以得到路由器的IP了。我只想把它上传到Firebase。如果我执行以下操作,它将写入数据库: 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 | a

我正在尝试开发一个脚本,它将使用OpenWRT在路由器上运行。现在我可以得到路由器的IP了。我只想把它上传到Firebase。如果我执行以下操作,它将写入数据库:

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
),因此解析失败