Defining Options and Option Arguments in POSIX Shell

In a Unix environment, it's very common for a command-line utility to accept options using the following syntax:

utility_name [-a] [-b] [-c option_argument]
    [-e] [-f[option_argument]] [operand...]

Utility Argument Syntax: An option is identified by a minus [-] sign followed by a single letter, along with an argument if the option requires one.

In POSIX shell scripts, these options can be parsed using the builtin getopts command.

Syntax

getopts OptionString NAME [ARGS...]

Parameters

Typical Usage

while getopts s:rg: o; do
  case "$o" in
    s) printf "option s set with arg %s\n" "$OPTARG";;
    r) printf "option r has been set\n";;
    g) printf "option g set with arg %s\n" "$OPTARG";;
    *) printf "usage: %s [-s s_arg] [-r] [-g g_arg]\n" "$0";;
  esac
done
shift $((OPTIND-1))

Each time getopts is invoked, it sets:

When there are no more options to process, getopts exits with a nonzero value, and OPTIND is set to the index of the first non-option argument.

If the program also accepts non-option arguments, it's idiomatic to add the following after parsing options:

shift $((OPTIND-1))

This line effectively removes all the parameters parsed by getopts from the parameter list. After this line, $1 will be the first non-option argument, and $# will be the number of non-option arguments.


The Open Group Base Specifications Issue 7 (getopts), The Open Group Base Specifications Issue 7 (12.1 Utility Argument Syntax)