/home/wpollock1/public_html/ShScript/getopt-demo
#!/bin/bash
# Script showing use of getopt and here documents
#
# This script allows options of -m, -i, or -h or --help
# It doesn't really do anything, but it does show
# sophisticated command line argument processing
# and several advanced shell programming features.
# Note the "-m" option has a required argument,
# as does the equivalent "--mode" option.
#
# Written 2005 by Wayne Pollock, Tampa Florida USA.
#set -x # uncomment this line to turn on debug mode
PATH=/bin:/usr/bin
# This strips off the pathname info from the scriptname,
# ("$0"), leaving just the last (filename) part:
SCRIPTNAME=${0##*/}
# To avoid a lot of echo commands (and associated
# quoting issues) in some show_help function, you
# can use a "here" document. A "here" document
# is an embedded file within the script.
# Here's a sample:
function show_help()
{
cat <<-EOF
$SCRIPTNAME: You are beyond any help,
so stop annoying me!!! :-)
...
EOF
}
# Parse out the args into a standard format:
ARGS=$(getopt -n $SCRIPTNAME -o m:ih -l mode:,help -- "$@")
# if the getopt detected an error, display help and quit:
if [ $? -ne 0 ]
then
show_help
exit 1;
fi
# Now reset the positional parameters:
# (The "eval" is needed in case any args were quoted by getopt.)
eval set -- $ARGS
# Handle each arg. Usually this is a matter of setting
# some variable, to be tested later in the script.
# This loop processes each option, one at a time, until
# the end of options is found (marked with "--"). This
# code removes each arg as it is processed, so at the
# end, the positional parameters contain only the non-option
# command line args (for instance, filenames to work with):
M_OPT=0
M_ARG='<none>'
I_OPT=0
DONE=false
while [ "$DONE" != "true" ]
do
case "$1" in
-m|--mode) let '++M_OPT'
case "$2" in
-*) echo "*** Missing argument: $1" >&2; exit 1;;
*) M_ARG="$2"; shift ;;
esac
;;
-i) let '++I_OPT' ;;
-h|--help) show_help ;;
--) DONE=true ;;
*) echo "***Illegal option: $1" >&2; exit 1 ;;
esac
shift # this deletes $1 and resets the positional parameters
done
# At this point, the positional parameters contain the
# remaining command line arguments (not options), if any.
# Rest of script goes here: ...
echo M_OPT=$M_OPT, M_ARG=$M_ARG, I_OPT=$I_OPT
echo remaining cmd line args: $*