2016-07-16 91 views
5

我有一個shell腳本我一直用來發布到hipchat頻道的東西。它工作正常,直到我嘗試併發送消息需要轉義的字符。我運行像這樣的命令(注意在那裏額外的反斜線導致問題)如何發佈帶有需要轉義字符的捲曲的json字符串?

/usr/local/bin/hipchatmsg.sh "my great message here \ " red 

而我在我的bash腳本(hipchatmsg.sh)代碼,重要的是這樣的:

# Make sure message is passed 
if [ -z ${1+x} ]; then 
    echo "Provide a message to create the new notification" 
    exit 1 
else 
    MESSAGE=$1 
fi 

// send locally via curl 
/usr/bin/curl -H "Content-Type: application/json" \ 
    -X POST \ 
    -k \ 
    -d "{\"color\": \"$COLOR\", \"message_format\": \"text\", \"message\": \"$MESSAGE\" }" \ 
$SERVER/v2/room/$ROOM_ID/notification?auth_token=$AUTH_TOKEN & 

// $server and $room are defined earlier 

exit 0 

如果我嘗試運行上面與需要轉義的任何字符的命令,我會得到一個錯誤這樣的:

{ 
    "error": { 
    "code": 400, 
    "message": "The request body cannot be parsed as valid JSON: Invalid \\X escape sequence u'\\\\': line 1 column 125 (char 124)", 
    "type": "Bad Request" 
    } 
} 

我找到了一種類似於在這兒,最好的建議是嘗試發送捲曲後用 - - 天ta-urlencode,所以我嘗試像這樣:

但是這沒有效果。

我在這裏錯過了什麼?

+1

URL編碼和JSON編碼是兩回事;不過,curl並不知道JSON。 – chepner

回答

11

最簡單的事情就是使用像jq這樣的程序來生成JSON;它會照顧逃避需要逃脫的東西。

jq -n --arg color "$COLOR" \ 
     --arg message "$MESSAGE" \ 
    '{color: $color, message_format: "text", message: $message}' | 
/usr/bin/curl -H "Content-Type: application/json" \ 
    -X POST \ 
    -k \ 
    [email protected] \ 
    $SERVER/v2/room/$ROOM_ID/notification?auth_token=$AUTH_TOKEN & 

的參數@--d告訴curl從標準輸入,這是從jq經由配管供給到讀出。對jq--arg選項使JSON編碼的字符串可用於篩選器,該篩選器僅是JSON對象表達式。

+0

謝謝你解釋。你是一個拯救生命的人! JQ真棒 – willdanceforfun

相關問題