Bash - getopts - Argument Parser (Builtin command)

> Procedural Languages > Bash Shell and (Unix|Linux) Utilities (XCU)

1 - About

getopts is used by shell procedures to parse positional parameters.

Only single letter option. d is valid but not de

Advertising

3 - Syntax

getopts optstring name [args]

where:

  • optstring contains the option characters to be recognized;
    • If the first character of optstring is a colon, silent error reporting is used.
    • if a character is followed by a colon :, the option is expected to have an argument, which should be separated from it by white space.
    • The colon and question mark characters may not be used as option characters.
  • args the positional parameters to parse. if not given parses the argument of the script

4 - Process

Each time it is invoked, getopts set the following variable:

  • name. Name refers to the next option (name is initialized if it does not exist)
  • OPTIND. Optind refers to a variable containing the index of the next argument to be processed. OPTIND is initialized to 1 each time the shell or a shell script is invoked. The shell does not reset OPTIND automatically; it must be manually reset between multiple calls to getopts within the same shell invocation if a new set of parameters is to be used.
  • OPTARG. Optind refers to a variable that contains the argument of the option (if any, see the optstring option)

At the end of the process, OPTIND is set to the index of the first non-option argument, and name is set to ?.

Advertising

5 - Return value

When the end of options is encountered, getopts exits with a return value greater than zero.

getopts returns:

  • true if an option, specified or unspecified, is found.
  • false if the end of options is encountered or an error occurs.

6 - Error reporting

If the first character of optstring is a colon, silent error reporting is used.

6.1 - Silent Error Reporting

If the variable OPTERR is set to:

  • 0: no error messages will be displayed, even if the first character of optstring is not a colon.
  • otherwise messages are printed when invalid options or missing option arguments are encountered.

If a required argument is not found:

  • name gets a colon (:)
  • OPTARG is set to the option character found.
Advertising

6.2 - No Silent Error Reporting

If a required argument is not found:

  • name gets a question mark (?)
  • OPTARG is unset,
  • and a diagnostic message is printed.

If an invalid option is seen:

  • getopts places ? into name
  • and, if not silent, prints an error message
  • OPTARG is unsets .

The option character found is placed in OPTARG and no diagnostic message is printed.

7 - Example

  • p, d and f are the options. The script usage is:
script.sh -p valuep -d valued -f
  • The implementations
while getopts "p:d:" option
do
   case "$option" in
      p)   VARIABLE_FOR_P="${OPTARG}";;
      d)   VARIABLE_FOR_D="${OPTARG}";;
      ?)   echo -e "Usage";;
      *)   echo -e "option ${OPTARG} unknown. Usage:\n" ; exit 1 ;;
   esac
done

where:

  • Bonus: Prompt for parameters is some required parameters are missing
if [[ -z "$VARIABLE_FOR_P" ]]; then
	echo "VARIABLE_FOR_P:"
	read VARIABLE_FOR_P
        # Test if null
	[[ "${VARIABLE_FOR_P:?The parameter is null sorry}" ]]
fi