2017-06-24 30 views
1

我正在嘗試爲Nagios製作一個腳本來使用Sendgrid API發送郵件。在發送到sendgrid時,在Bash腳本中的變量中不能有空格API

當我沒有任何空間在我的身體/主題,它工作得很好。但是當我有它時,我得到這個錯誤:

% Total % Received % Xferd Average Speed Time Time  Time Current 
           Dload Upload Total Spent Left Speed 
100 144 100 63 100 81 140 181 --:--:-- --:--:-- --:--:-- 181 
curl: (3) [globbing] unmatched close brace/bracket in column 6 
{"errors":[{"message":"Bad Request","field":null,"help":null}]} 

這是我的腳本。

#!/bin/bash 
sendgridapikey="................................................." 
mailto="[email protected]" 
mailfrom="[email protected]" 
subject="subject here" 
body="DefaultNagiosMailBody\n\nTest" 
while getopts a:t:f:s:b: option 
do 
case "${option}" 
in 
a) sendgridapikey=${OPTARG};; 
t) mailto=${OPTARG};; 
f) mailfrom=${OPTARG};; 
s) subject=${OPTARG};; 
b) body=${OPTARG};; 
esac 
done 
curl -X POST "https://api.sendgrid.com/v3/mail/send" -H "Authorization: Bearer $sendgridapikey" -H "Content-Type: application/json" -d \ 
'{"personalizations":[{"to":[{"email":"'$mailto'"}],"subject":"'$subject'"}],"from":{"email":"'$mailfrom'","name": "Nagios"},"content":[{"type":"text/plain","value":"'$body'"}]}' 

回答

3

您沒有正確引用變量。請這樣寫:

'{"personalizations":[{"to":[{"email":"'"$mailto"'"}],"subject":"'"$subject"'"}],"from":{"email":"'"$mailfrom"'","name": "Nagios"},"content":[{"type":"text/plain","value":"'"$body"'"}]}' 

請注意,我將所有變量包含在雙引號內。 你寫它的方式, 他們沒有包裹在引號中。

要在一個簡單的例子顯示,你的代碼基本上是這樣的:

curl -d 'quoted string '$var' and some more' 

它可能看起來像$var被引用,但事實並非如此。 其左側的單引號關閉了在quoted之前開始的單引號文本。右側的單引號開始一個新的單引號文本,以more結尾。本文未引用$var。 這是它如何被引用:

curl -d 'quoted string '"$var"' and some more' 

我應用了相同的邏輯的建議排在首位。

+0

謝謝你的解釋和解決方案Janos。 – Zucchini