我已经有了一个shell脚本,我一直用来将内容发布到熟悉的频道。它工作正常,直到我尝试发送一个包含需要转义的字符的消息。我像这样运行命令(注意那里的额外反斜杠导致问题)
/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"
}
}
我在这里找到了类似的东西,最好的建议是尝试使用--data-urlencode发送curl帖子,所以我试着这样:
/usr/bin/curl -H "Content-Type: application/json" \
-X POST \
-k \
-d --data-urlencode "{\"color\": \"$COLOR\", \"message_format\": \"text\", \"message\": \"$MESSAGE\" }" \
$SERVER/v2/room/$ROOM_ID/notification?auth_token=$AUTH_TOKEN &
但这没有效果。
我在这里缺少什么?
答案 0 :(得分: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 \
-d@- \
$SERVER/v2/room/$ROOM_ID/notification?auth_token=$AUTH_TOKEN &
@-
到-d
的参数告诉curl
从标准输入读取,标准输入是通过管道从jq
提供的。 --arg
的{{1}}选项为过滤器提供了JSON编码的字符串,这只是一个JSON对象表达式。