格式化从 shell 脚本发布的松弛消息

Formatting slack message posted from shell script

我有一个 shell 程序,它将多行输出写入一个名为“$text”的变量,该变量在终端上输出如下。

echo "$text"

==============================================
Oracle Host: xxxxxxxxx
==============================================
orcl:
Database UP -- OK
Listener UP -- OK
Database Read&Write Mode -- OK
Instance Status -- OK
Instance Login Allowed -- OK
---------------------------------------------
orcltest:
Database UP -- OK
Listener UP -- OK
Database Read&Write Mode -- OK
Instance Status -- OK
Instance Login Allowed -- OK
---------------------------------------------

现在尝试 post 在松弛通道中将其作为上面的输出,因此尝试使用以下代码从上面的变量中读取行:

while IFS= read -r line; do
#printf '%s\n' "$line"
text="$text$line\n"
done <<< "$text"
escapedText=$(echo $text | sed 's/"/\"/g; s/'\''/\'\''/g' )
json="{\"channel\": \"#$channel\", \"text\": \"$escapedText\"}"
curl -X POST --data-urlencode "payload=$json" https://hooks.slack.com/services/xxxxx/xxxx/xxxxx"

它显示的错误如下:

missing_text_or_fallback_or_attachments

但在上面的代码中,我猜 while 循环无法正常工作...是读取多行变量并传递给 curl 语句中的有效负载的正确方法吗

我认为您没有为 POST 到 webhook 使用正确的格式和语法。

正确的格式是原始 POST 和 JSON 正文,如下所示:

POST https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX
Content-type: application/json
{
    "text": "Hello, world."
}

但是你的 curl 中有一个奇怪的 payload 参数。您还需要将 JSON 设置为内容类型。

假设您的 JSON 语法正确,这应该有效:

curl https://hooks.slack.com/services/xxx -X POST -H "Content-type: application/json" --data '$json'

感谢@Walter A @Erik Kalkoken 的宝贵时间和帮助

最终按照 Walter A 的方法工作,我只是替换了

escapedText=$(echo $text | sed 's/"/\"/g' | sed "s/'/\'/g" )

escapedText="${text}"

并删除了以下部分一起循环遍历文本

while IFS= read -r line; do
#printf '%s\n' "$line"
text="$text$line\n"
done <<< "$text"

escapedText=$(echo $text | sed 's/"/\"/g; s/'\''/\'\''/g' ) 可能会导致问题。 当您不希望 shell 解释数据时,应该引用 $text (吃掉空格和换行符,被特殊字符混淆)。

不需要从 var 中读取的循环,当 var 中的最后一个字符不是 \n 时可能会出现问题。 read 命令只读取 "complete lines",忽略最后一个 \n 之后的任何内容。
从文件读取时也可能出现此问题。大多数情况下,当文件已创建(使用 viecho "Something" > file)时,文件将以结束 \n 创建。 不需要用 $text 的内容填充 var $text 的循环。