Advanced Bash-Scripting Guide: An in-depth exploration of the art of shell scripting | ||
---|---|---|
Prev | Chapter 33. Scripting With Style | Next |
Comment your code. This makes it easier for others to understand (and appreciate), and easier for you to maintain.
PASS="$PASS${MATRIX:$(($RANDOM%${#MATRIX})):1}" # It made perfect sense when you wrote it last year, but now it's a complete mystery. # (From Antek Sawicki's "pw.sh" script.) |
Add descriptive headers to your scripts and functions.
#!/bin/bash #************************************************# # xyz.sh # written by Bozo Bozeman # July 05, 2001 # Clean up project files. #************************************************# BADDIR=65 # No such directory. projectdir=/home/bozo/projects # Directory to clean up. #-------------------------------------------------------# # cleanup_pfiles () # Removes all files in designated directory. # Parameter: $target_directory # Returns: 0 on success, $BADDIR if something went wrong. #-------------------------------------------------------# cleanup_pfiles () { if [ ! -d "$1" ] # Test if target directory exists. then echo "$1 is not a directory." return $BADDIR fi rm -f "$1"/* return 0 # Success. } cleanup_pfiles $projectdir exit 0 |
Avoid using "magic numbers", [1] that is, "hard-wired" literal constants. Use meaningful variable names instead. This makes the script easier to understand and permits making changes and updates without breaking the application.
if [ -f /var/log/messages ] then ... fi # A year later, you decide to change the script to check /var/log/syslog. # It is now necessary to manually change the script, instance by instance, # and hope nothing breaks. # A better way: LOGFILE=/var/log/messages # Only line that needs to be changed. if [ -f "$LOGFILE" ] then ... fi |
Choose descriptive names for variables and functions.
fl=`ls -al $dirname` # Cryptic. file_listing=`ls -al $dirname` # Better. MAXVAL=10 # All caps used for a script constant. while [ "$index" -le "$MAXVAL" ] ... E_NOTFOUND=75 # Uppercase for an errorcode, # and name begins with "E_". if [ ! -e "$filename" ] then echo "File $filename not found." exit $E_NOTFOUND fi MAIL_DIRECTORY=/var/spool/mail/bozo # Uppercase for an environmental variable. export MAIL_DIRECTORY GetAnswer () # Mixed case works well for a function. { prompt=$1 echo -n $prompt read answer return $answer } GetAnswer "What is your favorite number? " favorite_number=$? echo $favorite_number _uservariable=23 # Permissable, but not recommended. # It's better for user-defined variables not to start with an underscore. # Leave that for system variables. |
Use exit codes in a systematic and meaningful way.
E_WRONG_ARGS=65 ... ... exit $E_WRONG_ARGS |
Break complex scripts into simpler modules. Use functions where appropriate. See Example 35-4.
Don't use a complex construct where a simpler one will do.
COMMAND if [ $? -eq 0 ] ... # Redundant and non-intuitive. if COMMAND ... # More concise (if perhaps not quite as legible). |
[1] | In this context, " magic numbers" have an entirely different meaning than the magic numbers used to designate file types. |