[96421] in RedHat Linux List
Re: BASH scripting question
daemon@ATHENA.MIT.EDU (Cameron Simpson)
Tue Oct 27 00:54:11 1998
Date: Tue, 27 Oct 1998 16:54:06 +1100 (EST)
X-Original-To: redhat-list@redhat.com
From: Cameron Simpson <cs@zip.com.au>
Reply-to: cs@zip.com.au
To: redhat-list@redhat.com
Cc: Alexei Nefediev <nefediev@heron.itep.ru>
Resent-From: redhat-list@redhat.com
On 24 Oct 1998, in message <Pine.LNX.4.05.9810231409110.5138-100000@mallard.itep.ru>
Alexei Nefediev <nefediev@heron.itep.ru> wrote:
| what should I do to learn my own script to understand switches and to
| report about its usage when started without arguments?
Step 1: Never write for "bash" (or the other dialects like zsh ksh etc) if
you can write for plain vanilla Bourne shell (sh).
Step 2: This is what I do:
0: Opening comment, usually quite short:
#!/bin/sh
#
# Blah blah blah. - Cameron Simpson <cs@zip.com.au> 27oct98
#
a: Stash the basename of the program in a variable. I use $cmd; $porg and
$progname are also common choices:
cmd=`basename "$0"`
b: Set defaults for options:
time=1 # default time delay
noaction= # no noaction
verbose= # silent
[ -t 1 ] && verbose=1 # unless we're interactive
c: Define a usage message. Very near the top, so it doubles as documentation
for someone reading the script source. Notice how we can mention the
defaults in the message this way:
usage="Usage: $cmd [-n] [-s] [-t time] [-v] files...
-n No action. Just report what action would normally occur.
-s Silent.
-t time Pause for time seconds between files (default: $time).
-v Verbose."
Also notice the notation:
word Required.
[word] Optional.
word... At least one required: one or more.
[word...] Zero or more.
{-s|-v} Alternatives: use -s or -v, not both.
This notation is common to manual entries and usage messages and
makes the simple aspects of use readily apparent.
d: Parse options.
Since most need a shift we do the usual one after the "esac".
For options with an argument (-t) we add an extra shift in that line.
Notice now the error message includes both the program name and the
errant option, and goes to stderr. Always take this care - it repay you
and your users many times over in the future.
badopts=
while :
do case $1 in
-n) noaction=1 ;; # no action
-s) verbose= ;; # turn verbose off
-t) time=$2; shift ;; # set time
-v) verbose=1 ;; # turn verbose on
--) shift; break ;; # force end of option parsing
-?*) echo "$cmd: unrecognised option: $1" >&2
badopts=1 # remember
;;
*) break ;; # not an option - time to stop
esac
shift
done
# make sure they supply at least one file
[ $# = 0 ] && { echo "$cmd: missing files" >&2; badopts=2; }
# If anything went wrong, report correct usage.
#
# Notice that we do this really late, so as to make as many
# complaints about problems as possible - nothing's as annoying
# as having to fix some mistake and _only_then_ be told about the
# next one.
#
# Also notice that we never ever proceed and run the program if the
# arguments are in any way bad.
# Bad arguments suggest that eitehr the user didn't say what they meant
# or possibly that they didn't even invoke the right program!
# In either case proceeding might well do something horribly
# different to the user's intent. So don't.
#
# Notice the non-zero exit status.
# _All_ UNIX programs exit with zero on "success" and non-zero
# on error. Make sure yours do too.
#
[ $badopts ] && { echo "$usage" >&2; exit 2; }
e: The main program follows after that. For example:
for file
do
echo "file=$file"
done
Cheers,
--
Cameron Simpson, DoD#743 cs@zip.com.au http://www.zip.com.au/~cs/
THE LOST WORLD is based on (so loosely as to re-define "based on" as
"with the same title as") Michael Crichton's sequel novel, which
introduced us to a second island where dinosaurs were being genetically
engineered. - Scott Renshaw on _Jurassic_Park_'s sequel
--
PLEASE read the Red Hat FAQ, Tips, Errata and the MAILING LIST ARCHIVES!
http://www.redhat.com http://archive.redhat.com
To unsubscribe: mail redhat-list-request@redhat.com with
"unsubscribe" as the Subject.