如何在带有json数据的curl中添加断行?

问题描述

我正在使用此bash脚本将新消息发布到我的rocket.chat实例。

#!/usr/bin/env bash
function usage {
    programName=$0
    echo "description: use this program to post messages to Rocket.chat channel"
    echo "usage: $programName [-b \"message body\"] [-u \"rocket.chat url\"]"
    echo "      -b    The message body"
    echo "      -u    The rocket.chat hook url to post to"
    exit 1
}
while getopts ":b:u:h" opt; do
  case ${opt} in
    u) rocketUrl="$OPTARG"
    ;;
    b) msgBody="$OPTARG"
    ;;
    h) usage
    ;;
    \?) echo "Invalid option -$OPTARG" >&2
    ;;
  esac
done
if [[ ! "${rocketUrl}" || ! "${msgBody}" ]]; then
    echo "all arguments are required"
    usage
fi
read -d '' payLoad << EOF
{"text": "${msgBody}"}
EOF
echo $payLoad
statusCode=$(curl \
        --write-out %{http_code} \
        --silent \
        --output /dev/null \
        -X POST \
        -H 'Content-type: application/json' \
        --data "${payLoad}" ${rocketUrl})
echo ${statusCode}

一切正常,所以我可以发送这样的新消息

./postToRocket.sh -b "Hello from here" -u $RocketURL

但是当我尝试添加多行这样的消息

./postToRocket.sh -b "Hello from here\nThis is a new line" -u $RocketURL

它不起作用。我得到以下输出

{"text": "Hello from heren New Line"}
200

那么我要更改些什么,以便在这些bash脚本中使用换行符。有什么想法吗?

解决方法

首先,使-r中的反斜杠消失的原因是缺少read的{​​{1}}参数。设为read -r -d '' payLoad将解决此问题。 但是并不是一个好的解决方案:它要求您的调用者传递已经转义的字符串以包含在JSON中,而不是让它们传递任何/所有可能的字符串。


要使用任意字符串制作有效的JSON(包括可以包含换行文字,引号,反斜杠或其他必须转义的内容的字符串),请使用jq

payLoad=$(jq -n --arg msgBody "$msgBody" '{"text": $msgBody}')

...然后,完成此操作后,修改您的通话约定:

./postToRocket.sh -b $'Hello from here\nThis is a new line' -u "$RocketURL"
,

我相信这已经在here中得到了解决

应通过添加$符号并使用单引号来工作:

./postToRocket.sh -b $'Hello from here\nThis is a new line' -u $RocketURL