Getopts

1

** **** is a built-in Unix shell command for parsing command-line **arguments. It is designed to process command line arguments that follow the POSIX Utility Syntax Guidelines, based on the C interface of getopt. The predecessor to getopts was the external program getopt by Unix System Laboratories.

History

The original getopt had several problems: it could not handle whitespace or shell metacharacters in arguments, and there was no ability to disable the output of error messages. was first introduced in 1986 in the Bourne shell shipped with Unix SVR3. It uses the shell's own variables to track the position of current and argument positions, and, and returns the option name in a shell variable. Earlier versions of the Bourne shell did not have getopts. In 1995, was included in the Single UNIX Specification version 1 / X/Open Portability Guidelines Issue 4. As a result, is now available in shells including the Bourne shell, KornShell, Almquist shell, Bash and Zsh. The getopts command has also been ported to the IBM i operating system. The modern usage of getopt was partially revived mainly due to an enhanced implementation in util-linux. This version, based on the BSD getopt, not only fixed the two complaints around the old getopt, but also introduced the capability for parsing GNU-style long options and optional arguments for options, features that getopts lacks. The various BSD distributions, however, stuck to the old implementation.

Usage

The usage synopsis of getopt and getopts is similar to its C sibling: getopt optstring [parameters] getopts optstring varname [parameters] The way one uses the commands however varies a lot:

Enhancements

In various getopts

In spring 2004 (Solaris 10 beta development), the libc implementation for was enhanced to support long options. As a result, this new feature was also available in the built-in command of the Bourne Shell. This is triggered by parenthesized suffixes in the optstring specifying long aliases. KornShell and Zsh both have an extension for long arguments. The former is defined as in Solaris, while the latter is implemented via a separate zparseopts command. KornShell additionally implements optstring extensions for options beginning with + instead of -.

In Linux getopt

An alternative to is the Linux enhanced version of , the external command line program. The Linux enhanced version of has the extra safety of plus more advanced features. It supports long option names (e.g. ) and the options do not have to appear before all the operands (e.g. is permitted by the Linux enhanced version of but does not work with ). It also supports escaping metacharacters for shells (like tcsh and POSIX sh) and optional arguments.

Comparison

Examples

Suppose we are building a Wikipedia downloader in bash that takes three options and zero extra arguments: wpdown -a article name -l [language] -v When possible, we allow the following long arguments: -a --article -l --language, --lang -v --verbose For clarity, no help text is included, and we assume there is a program that downloads any webpage. In addition, all programs are of the form:

Using old getopt

The old getopt does not support optional arguments: This script will also break with any article title with a space or a shell metacharacter (like ? or *) in it.

Using getopts

Getopts give the script the look and feel of the C interface, although in POSIX optional arguments are still absent: Since we are no longer operating on shell options directly, we no longer need to shift them within the loop. However, a slicing operation is required to remove the parsed options and leave the remaining arguments. It is fairly simple to emulate long option support of flags by treating --fast as an argument fast to an option -. That is, -: is added to the optstring, and - is added as a case for opt, within which OPTARG is evaluated for a match to fast. Supporting long options with an argument is more tedious, but is possible when the options and arguments are delineated by.

Using Linux getopt

Linux getopt escapes its output and an "eval" command is needed to have the shell interpret it. The rest is unchanged:

This article is derived from Wikipedia and licensed under CC BY-SA 4.0. View the original article.

Wikipedia® is a registered trademark of the Wikimedia Foundation, Inc.
Bliptext is not affiliated with or endorsed by Wikipedia or the Wikimedia Foundation.

Edit article