如何使用 json 数据在 curl 中添加换行符?

How can i add break line in curl with json data?

我正在使用这个 bash 脚本向我的 rocket.chat 实例 post 发送一条新消息。

#!/usr/bin/env bash
function usage {
    programName=[=11=]
    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 脚本中使用换行符。有什么想法吗?

我相信这已经在 SO here

中得到了回答

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

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

首先,使 \n 中的反斜杠消失的原因是缺少 read-r 参数。使其成为 read -r -d '' payLoad 将解决这个问题。 但是,这不是一个好的解决方案:它要求您的调用者传递已经转义以包含在 JSON 中的字符串,而不是让他们传递 any/every 可能的字符串。


要使用任意字符串使 JSON 有效——包括可以包含换行文字、引号、反斜杠或其他必须转义的内容的字符串——使用 jq:

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

...然后,完成后,修改您的调用约定:

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