将一个变量传递给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),所以解析失败。