My coworkers use many ad hoc or single-purpose scripts, things like: checking system status, wrappers for build systems, launching services locally, etc. My UNIX background tells me, "keep it simple, avoid output; Silence is Golden."
Somehow my younger colleagues aren't impressed.
So to avoid acting my age I started sprinkling color into my scripts, and it worked. Feedback was uniformly positive. And true to my UNIX roots, I provided command line flags to disable color.
Some lessons for budding BASHers:
- Yes, experiment and learn, but be sure to do your research. The Internet has outstanding help for BASH.
- Learn standard idioms (see below).
- Don't overdo it. Color for summary lines and warnings have more impact when the rest of the text is plain.
- Keep functions small, just as you would in other languages. BASH is a programming language with a command line, so keep your good habits when writing shell.
- Collaborate, pair! This comes naturally to my fellows. Coding is more enjoyable, goes faster and has fewer bugs.
Idioms
Most of these idioms appear in testing with bash, a simple BASH BDD test framework I wrote for demonstration.
Process command-line flags
this=false
that=true
while getopts :htT-: opt
do
[[ - == $opt ]] && opt="${OPTARG%%=*}" OPTARG="${OPTARG#*=}"
case $opt in
h | help ) print_help ; exit 0 ;;
t | this ) this=true ;;
T | no-that ) that=false ;;
esac
done
shift $((OPTIND - 1))
Keep boolean toggles simple
run_faster=true
if $run_faster
then
use_faster_algorithm "$@"
else
use_more_correct_algorithm "$@"
fi
Simple coloring
pgreen="\e[32m"
pred="\e[31m"
preset="\e0m"
if $success
then
echo -e "${pgreen}PASS${preset} $test_name"
else
echo -e "${pred}FAIL${preset} $test_name - $failure_reason"
EOM
fi
Consistent exit codes
function check_it {
local -r failed=$1
local -r syntax_error=$2
if $syntax_error
then
return 2
elif $failed
then
return 1
else
return 0
fi
}
Coda
There are many more idioms to learn, hopefully this taste catches your interest. I was careful to include others mixed in with these (what does local -r
do?) to whet the appetite for research. Go try the BASH debugger sometime.
UPDATE: Fixed thinko. ANSI escape codes need to be handled by echo -e
or printf
, not sent directly via cat
!