2016-12-14 51 views
0

我試圖讓這個bash腳本運行speedtest(speedtest-cli),然後將輸出作爲變量通過curl傳遞給pushbullet。Bash:命令輸出爲捲曲錯誤的變量

#!/bin/bash 
speed=$(speedtest --simple) 
curl --header 'Access-Token: <-ACCESS-TOKEN->' \ 
    --header 'Content-Type: application/json' \ 
    --data-binary {"body":"'"$speed"'","title":"SpeedTest","type":"note"}' \ 
    --request POST \ 
    https://api.pushbullet.com/v2/pushes 

其他命令工作得很好用這個方法(如whoami),但speedtestifconfig只是得到這樣的錯誤:

{"error":{"code":"invalid_request","type":"invalid_request","message":"Failed to decode JSON body.","cat":"(=^‥^=)"},"error_code":"invalid_request"} 

回答

0

你的報價是錯誤的:

speed=$(speedtest --simple) 
curl --header 'Access-Token: o.4q87SC5INy6nMQZqVHJeymwRsvMXW74j' \ 
    --header 'Content-Type: application/json' \ 
    --data-binary "{\"body\":\"$speed\",\"title\":\"SpeedTest\",\"type\":\"note\"}" \ 
    --request POST \ 
    https://api.pushbullet.com/v2/pushes 

從這裏讀取文件簡化了報價:

speed=$(speedtest --simple) 
curl --header 'Access-Token: o.4q87SC5INy6nMQZqVHJeymwRsvMXW74j' \ 
    --header 'Content-Type: application/json' \ 
    --data-binary @- \ 
    --request POST \ 
    https://api.pushbullet.com/v2/pushes <<EOF 
{ "body": "$speed", 
    "title": "SpeedTest", 
    "type": "note" 
} 
EOF 

但是,一般情況下,您不應該假設變量的內容是正確編碼的JSON字符串,因此請使用類似jq的工具爲您生成JSON。

jq -n --arg data "$(speedtest --simple)" \ 
    '{body: $data, title: "SpeedTest", type: "note"}' | 
curl --header 'Access-Token: o.4q87SC5INy6nMQZqVHJeymwRsvMXW74j' \ 
     --header 'Content-Type: application/json' \ 
     --data-binary @- \ 
     --request POST \ 
     https://api.pushbullet.com/v2/pushes 

這可以很容易地進行重構:

post_data() { 
    url=$1 
    token=$2 
    data=$3 

    jq -n --arg d "$data" \ 
    '{body: $d, title: "SpeedTest", type: "note"}' | 
    curl --header "Access-Token: $token" \ 
     --header 'Content-Type: application/json' \ 
     --data-binary @- \ 
     --request POST \ 
     "$url" 
} 

post_data "https://api.pushbullet.com/v2/pushes" \ 
      "o.4q87SC5INy6nMQZqVHJeymwRsvMXW74j" \ 
      "$(speedtest ---simple)" 
+0

這個作品! (有一個額外的短跑---簡單)thanx! – zevnyc

+0

如何將此輸出與其他文本和變量組合如下:body =「Local IP:$ iplocal \ nPublic IP:$ ippublic \ nSpeedtest:\ n $ data」 – zevnyc

+0

我可以將speedtest命令和輸出定義爲一個變量我可以輕鬆添加更多變量並測試身體? – zevnyc