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 ...
Get bash Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.