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
!
No comments:
Post a Comment