Colorizing ScriptsThe ANSI
[1]
escape sequences set screen attributes, such as bold
text, and color of foreground and background. DOS batch files commonly used
ANSI escape codes for color output,
and so can Bash scripts. Example 34-8. A "colorized" address database #!/bin/bash
# ex30a.sh: "Colorized" version of ex30.sh.
# Crude address database
clear # Clear the screen.
echo -n " "
echo -e '\E[37;44m'"\033[1mContact List\033[0m"
# White on blue background
echo; echo
echo -e "\033[1mChoose one of the following persons:\033[0m"
# Bold
tput sgr0
echo "(Enter only the first letter of name.)"
echo
echo -en '\E[47;34m'"\033[1mE\033[0m" # Blue
tput sgr0 # Reset colors to "normal."
echo "vans, Roland" # "[E]vans, Roland"
echo -en '\E[47;35m'"\033[1mJ\033[0m" # Magenta
tput sgr0
echo "ones, Mildred"
echo -en '\E[47;32m'"\033[1mS\033[0m" # Green
tput sgr0
echo "mith, Julie"
echo -en '\E[47;31m'"\033[1mZ\033[0m" # Red
tput sgr0
echo "ane, Morris"
echo
read person
case "$person" in
# Note variable is quoted.
"E" | "e" )
# Accept upper or lowercase input.
echo
echo "Roland Evans"
echo "4321 Floppy Dr."
echo "Hardscrabble, CO 80753"
echo "(303) 734-9874"
echo "(303) 734-9892 fax"
echo "revans@zzy.net"
echo "Business partner & old friend"
;;
"J" | "j" )
echo
echo "Mildred Jones"
echo "249 E. 7th St., Apt. 19"
echo "New York, NY 10009"
echo "(212) 533-2814"
echo "(212) 533-9972 fax"
echo "milliej@loisaida.com"
echo "Girlfriend"
echo "Birthday: Feb. 11"
;;
# Add info for Smith & Zane later.
* )
# Default option.
# Empty input (hitting RETURN) fits here, too.
echo
echo "Not yet in database."
;;
esac
tput sgr0 # Reset colors to "normal."
echo
exit 0 |
The simplest, and perhaps most useful ANSI escape sequence is
bold text, \033[1m ... \033[0m. The
\033 represents an escape,
the "[1" turns on the bold attribute, while the
"[0" switches it off. The "m" terminates
each term of the escape sequence.
bash$ echo -e "\033[1mThis is bold text.\033[0m"
|
A similar escape sequence switches on the underline
attribute (on an rxvt and and an
aterm).
bash$ echo -e "\033[4mThis is underlined text.\033[0m"
|
| With an echo, the
-e option enables the escape
sequences. |
Other escape sequences change the text and/or background color.
bash$ echo -e '\E[34;47mThis prints in blue.'; tput sgr0
bash$ echo -e '\E[33;44m'"yellow text on blue background"; tput sgr0
|
The tput sgr0 restores the terminal settings
to normal. Omitting this lets all subsequent output from that
particular terminal remain blue. The numbers in the following table work for an
rxvt terminal. Results may vary for other
terminal emulators. Example 34-9. Echoing colored text #!/bin/bash
# color-echo.sh: Echoing text messages in color.
# Modify this script for your own purposes.
# It's easier than hand-coding color.
black='\E[30;47m'
red='\E[31;47m'
green='\E[32;47m'
yellow='\E[33;47m'
blue='\E[34;47m'
magenta='\E[35;47m'
cyan='\E[36;47m'
white='\E[37;47m'
alias Reset="tput sgr0" # Reset text attributes to normal
#+ without clearing screen.
cecho () # Color-echo.
# Argument $1 = message
# Argument $1 = color
{
local default_msg="No message passed."
# Doesn't really need to be a local variable.
message=${1:-$default_msg} # Defaults to default message.
color=${2:-$black} # Defaults to black, if not specified.
echo -e "$color"
echo "$message"
Reset # Reset to normal.
return
}
# Now, let's try it out.
# ----------------------------------------------------
cecho "Feeling blue..." $blue
cecho "Magenta looks more like purple." $magenta
cecho "Green with envy." $green
cecho "Seeing red?" $red
cecho "Cyan, more familiarly known as aqua." $cyan
cecho "No color passed (defaults to black)."
# Missing $color argument.
cecho "\"Empty\" color passed (defaults to black)." ""
# Empty $color argument.
cecho
# Missing $message and $color arguments.
cecho "" ""
# Empty $message and $color arguments.
# ----------------------------------------------------
echo
exit 0
# Exercises:
# ---------
# 1) Add the "bold" attribute to the 'cecho ()' function.
# 2) Add options for colored backgrounds. |
| There is, however, a major problem with all
this. ANSI escape sequences are emphatically
non-portable. What works fine on some terminal
emulators (or the console) may work differently, or not
at all, on others. A "colorized" script that
looks stunning on the script author's machine may produce
unreadable output on someone else's. This greatly compromises
the usefulness of "colorizing" scripts, and
possibly relegates this technique to the status of a gimmick
or even a "toy". |
Moshe Jacobson's color utility
(http://runslinux.net/projects/color)
considerably simplifies using ANSI escape sequences. It
substitutes a clean and logical syntax for the clumsy constructs
just discussed.
|