Shell Tricks: Colorized output
This is part 3 of my series on tricks I’ve used in shell scripts. In this post, I’ll share a few ways I’ve colorized text in shell scripts.
Terminals use escape codes to control colors. In Bash or
ZSH scripts, these are typically expressed as \e ...
or \033 ...
(or
sometimes ^[
, although that is actually typed by pressing Ctrl-V
, [
, NOT
^
, [
). I tend to see more cases of \e
than \033
in the wild.
An example of printing red text:
printf "\e[031m%s\e[0m\n" 'Danger is go!'
Running that should show:
Danger is go!
Here, \e031m
is setting the 031
color, which is red text with no
background. \e[0m
sets the color back to the default, which is probably
white or black text with no background, depending on your terminal theme.
It is important that you reset the text color. Otherwise all output will continue to be colorized. Depending on your shell configuration, even commands run after your script could be colorized inadvertently.
Here is a small script I found years ago that will show you what colors are available in your terminal:
#!/bin/sh
# Usage: colordump
# Dump 256 ansi colors to the terminal.
printf "How each ANSI color is displayed on your terminal:\n\n"
i=0
row=0
while [ $i -lt 255 ];
do
newrow=$(expr $i / 10)
test $newrow -ne $row && printf "\n"
row=$newrow
printf "\e[%dm %03d \e[0m" $i $i
i=$(expr $i + 1)
done
printf '\n\n e.g., "\\e[41mTEXT\\e[0m" '
printf "\e[41m(for TEXT like this)\e[0m\n"
Run colordump
to see a full list of colors available.
See also: http://bluesock.org/~willg/dev/ansi.html