如何使用 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"
我正在使用这个 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"