Skip to content

Instantly share code, notes, and snippets.

@andkirby
Last active May 27, 2026 16:40
Show Gist options
  • Select an option

  • Save andkirby/67a774513215d7ba06384186dd441d9e to your computer and use it in GitHub Desktop.

Select an option

Save andkirby/67a774513215d7ba06384186dd441d9e to your computer and use it in GitHub Desktop.
Shell/Bash script for sending slack messages.
#!/usr/bin/env bash
####################################################################################
# Slack Bash console script for sending messages.
####################################################################################
# Installation
# $ curl -s https://gist.githubusercontent.com/andkirby/67a774513215d7ba06384186dd441d9e/raw --output /usr/bin/slack
# $ chmod +x /usr/bin/slack
####################################################################################
# USAGE
# Send message to slack channel/user
# Send a message to the channel #ch-01
# $ slack '#ch-01' 'Some message here.'
#
# Send a message to the channel #ch-01 and user @me.
# $ slack '#ch-01,@me' MESSAGE
#
# Send a message to the default channel (it must be declared in APP_SLACK_CHANNEL).
# $ slack MESSAGE
#
# VARIABLES
#
# Please declare environment variables:
# - APP_SLACK_WEBHOOK
# - APP_SLACK_CHANNEL (optional)
# - APP_SLACK_USERNAME (optional)
# - APP_SLACK_ICON_EMOJI (optional)
# You may also declare them in ~/.slackrc file.
####################################################################################
set -o pipefail
set -o errexit
set -o nounset
#set -o xtrace
init_params() {
# you may declare ENV vars in /etc/profile.d/slack.sh
if [ -z "${APP_SLACK_WEBHOOK:-}" ]; then
echo 'error: Please configure Slack environment variable: ' > /dev/stderr
echo ' APP_SLACK_WEBHOOK' > /dev/stderr
exit 2
fi
APP_SLACK_USERNAME=${APP_SLACK_USERNAME:-$(hostname | cut -d '.' -f 1)}
APP_SLACK_ICON_EMOJI=${APP_SLACK_ICON_EMOJI:-:slack:}
if [ -z "${1:-}" ]; then
echo 'error: Missed required arguments.' > /dev/stderr
echo 'note: Please follow this example:' > /dev/stderr
echo ' $ slack.sh "#CHANNEL1,CHANNEL2" Some message here. ' > /dev/stderr
exit 3
fi
slack_channels=(${APP_SLACK_CHANNEL:-})
if [ "${1::1}" == '#' ] || [ "${1::1}" == '@' ]; then
# explode by comma
IFS=',' read -r -a slack_channels <<< "${1}"
shift
fi
slack_message=${@}
}
send_message() {
local channel=${1}
echo 'Sending to '${channel}'...'
curl --silent --data-urlencode \
"$(printf 'payload={"text": "%s", "channel": "%s", "username": "%s", "as_user": "true", "link_names": "true", "icon_emoji": "%s" }' \
"${slack_message}" \
"${channel}" \
"${APP_SLACK_USERNAME}" \
"${APP_SLACK_ICON_EMOJI}" \
)" \
${APP_SLACK_WEBHOOK} || true
echo
}
send_message_to_channels() {
for channel in "${slack_channels[@]:-}"; do
send_message "${channel}"
done
}
slack() {
# Set magic variables for current file & dir
__dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
__file="${__dir}/$(basename "${BASH_SOURCE[0]}")"
readonly __dir __file
cd ${__dir}
if [ -f $(cd; pwd)/.slackrc ]; then
. $(cd; pwd)/.slackrc
fi
declare -a slack_channels
init_params ${@}
send_message_to_channels
}
if [ "${BASH_SOURCE[0]:-}" != "${0}" ]; then
export -f slack
else
slack ${@}
exit $?
fi
@andkirby

andkirby commented Sep 29, 2017

Copy link
Copy Markdown
Author

So, is there some patch to improve the script? :)

@dlorent

dlorent commented Oct 25, 2017

Copy link
Copy Markdown

You should consider implementing multiple types of posting. eg. as an attachment.

@rasperepodvipodvert

Copy link
Copy Markdown

how can i send file?

@andkirby

andkirby commented Feb 15, 2018

Copy link
Copy Markdown
Author

@miradnan

Copy link
Copy Markdown

Fantastic

@miradnan

Copy link
Copy Markdown

how can i send file?

Maybe put a file on s3 and send it as link. Could be a quick solution :)

@siso

siso commented Jan 23, 2019

Copy link
Copy Markdown

On OS X the BSD version of cut complains:

cut: illegal option -- -

If you replace L43 with this one, then it would support both BSD and GNU cut:

APP_SLACK_USERNAME=${APP_SLACK_USERNAME:-$(hostname | cut -d '.' -f 1)}

@joaobfernandes0

Copy link
Copy Markdown

I try next command but didn't work:

a=123
slack '${a}'

I expected the output 123, but the output was ${a}

@andkirby

Copy link
Copy Markdown
Author

@jotabf, it doesn't in this bash in this way for single quotes. It should be in double quotes or whithout ones (in case a value doesn't have spaces, it can be tricky for arguments.)

@andkirby

Copy link
Copy Markdown
Author

@siso, fixed. Thanks for this note.

@Lalit-1219

Copy link
Copy Markdown

Hello All,

Could anyone help me please to get emails on outlook for specific slack channels with some specific content like "failures"
and that should trigger twice a day at some specific timings.
Thanks in Advance

@andkirby

Copy link
Copy Markdown
Author

@Lalit-1219, it's not about this script definitely. ;)
You may try to adjust nofication settings. I remember there is "keywords" feature.

@farisalfa

farisalfa commented Oct 16, 2019

Copy link
Copy Markdown

hi @andkirby

I want to ask, why can I sent from grep command?

my sh script like this :

#!/bin/bash
message=$(grep AUDIT audit.txt)
slack ${message}

if I execute this, I always get this error:

/home/ubuntu# ./test_sent.sh
Sending to ...
invalid_payload

can you solve this?

@andkirby

Copy link
Copy Markdown
Author

Hi @farisalfa,

The only one who can solve it that's you. ;)

I guess, that's not about script but about Bash scripting knowledge.
Just double checked β€” it works fine. Think about double quotes for your variable.

@jorisbertomeu

Copy link
Copy Markdown

Thanks bro', u saved my night πŸ‘ŠπŸ»

@d4r1091

d4r1091 commented May 29, 2020

Copy link
Copy Markdown

Just an insight to those facing issues with /usr/bin/slack due to permission accessing to /usr/bin, you can move the script under usr/local/bin/slack.

So that the two commands to run will be:

curl -s https://gist.githubusercontent.com/andkirby/67a774513215d7ba06384186dd441d9e/raw --output /usr/local/bin/slack

chmod +x /usr/local/bin/slack

hope it helps πŸ‘
great script @andkirby πŸ’ͺ

@jmhostalet

Copy link
Copy Markdown

Hi,

when sending a message in this way:
slack.sh ":arrow_right: data seeding"
emoji appears as text and it is not rendered, what am I doing wrong ?
Thanks!

@andkirby

andkirby commented Jun 16, 2020

Copy link
Copy Markdown
Author

emoji appears as text and it is not rendered, what am I doing wrong ?

@jmhostalet, I assume, they added mrkdwn type for that.
https://api.slack.com/reference/surfaces/formatting#basics

great script @andkirby πŸ’ͺ

@d4r1091, it's a pleasure to know it. ;)

@andkirby

andkirby commented Jun 19, 2020

Copy link
Copy Markdown
Author

@jmhostalet, just double check it. It works with emoji. According to off-docs mrkdwn=true always.

image

@Keriwaza

Copy link
Copy Markdown

hi @andkirby

I want to ask, why can I sent from grep command?

my sh script like this :

#!/bin/bash
message=$(grep AUDIT audit.txt)
slack ${message}

if I execute this, I always get this error:

/home/ubuntu# ./test_sent.sh
Sending to ...
invalid_payload

can you solve this?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment