Parsing Arguments for Your Shell Script
Problem
You want to have some options on your shell script, some flags that you can
use to alter its behavior. You could do the parsing directly, using ${#}
to tell you how many arguments have been supplied, and
testing ${1:0:1} to
test the first character of the first argument to see if it is a minus
sign. You would need some if/then or
case logic to identify which option it is and whether it takes an
argument. What if the user doesn’t supply a required argument? What if
the user calls your script with two options combined (e.g., -ab)? Will you also parse for that? The need
to parse options for a shell script is a common situation. Lots of
scripts have options. Isn’t there a more standard way to do this?
Solution
Use bash’s built-in getopts command to help parse options.
Here is an example, based largely on the example in the manpage for getopts:
#!/usr/bin/env bash
# cookbook filename: getopts_example
#
# using getopts
#
aflag=
bflag=
while getopts 'ab:' OPTION
do
case $OPTION in
a) aflag=1
;;
b) bflag=1
bval="$OPTARG"
;;
?) printf "Usage: %s: [-a] [-b value] args\n" $(basename $0) >&2
exit 2
;;
esac
done
shift $(($OPTIND - 1))
if [ "$aflag" ]
then
printf "Option -a specified\n"
fi
if [ "$bflag" ]
then
printf 'Option -b "%s" specified\n' "$bval"
fi
printf "Remaining arguments are: %s\n" "$*"Discussion
There are two kinds of options supported here. The first and simpler kind is an option that stands alone. It typically represents a flag to modify ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access