我正在尝试将 slack 与我的 shell 脚本之一集成。我有不同的条件,有效负载的消息部分是不同的。
我的脚本看起来像
#!/bin/bash
SLACK_URL='https://hooks.slack.com/services/******
CHANNEL="#channel"
PAYLOAD="'payload={\"channel\": \"${SLACK_CHANNEL}\", \"username\": \"${USER}\", \"text\": \"$MESSAGE\", \"icon_emoji\": \":slack:\"}"
案例1:条件:
curl -s -S -X POST --data-urlencode "$PAYLOAD" $SLACK_URL
情况2:条件
curl -s -S -X POST --data-urlencode "$PAYLOAD" $SLACK_URL
情况3:条件
curl -s -S -X POST --data-urlencode "$PAYLOAD" $SLACK_URL
在每种情况下,我的消息应该不同。我试图避免每次使用自定义消息声明有效负载,寻找一个可以将自定义消息解析为有效负载的选项。请帮助。
答案1
$PAYLOAD
您可以根据自己的条件一点一点地构建:
PAYLOAD="payload={"
PAYLOAD="$PAYLOAD\"channel\": \"${SLACK_CHANNEL}\","
PAYLOAD="$PAYLOAD\"username\": \"${USER}\","
case $MESSAGE_TYPE in
1)
PAYLOAD="$PAYLOAD \"text\": \"$MESSAGE1\","
;;
2)
PAYLOAD="$PAYLOAD \"text\": \"$MESSAGE2\","
;;
3)
PAYLOAD="$PAYLOAD \"text\": \"$MESSAGE3\","
;;
esac
PAYLOAD="$PAYLOAD \"icon_emoji\": \":slack:\""
PAYLOAD="$PAYLOAD}"
curl -s -S -X POST --data-urlencode "$PAYLOAD" $SLACK_URL
或者,一旦您设置正确,您可以让 Bash 延迟评估$PAYLOAD
。eval
$MESSAGE
PAYLOAD_PATTERN='payload={\"channel\": \"${SLACK_CHANNEL}\", \"username\": \"${USER}\", \"text\": \"$MESSAGE\", \"icon_emoji\": \":slack:\"}'
MESSAGE=...
eval "PAYLOAD=\"$PAYLOAD_PATTERN\""
curl -s -S -X POST --data-urlencode "$PAYLOAD" $SLACK_URL
这是 shell 编程中的常见模式。但请注意,如果您将变量的任何部分扩展为包含$PAYLOAD_PATTERN
不受信任的输入的一部分,eval
则以这种方式使用可能会导致安全问题,因为有能力影响任意输入的对手可能会使用它来获取任意代码执行脚本的系统上的执行能力。