no way to compare when less than two revisions

Differences

This shows you the differences between two versions of the page.


getopts [2014/04/01 17:56] (current) – created - external edit 127.0.0.1
Line 1: Line 1:
 +====== getopts =====
  
 +  * [[bash]]
 +  * [[getopt]]
 +
 +  * [[http://wiki.bash-hackers.org/howto/getopts_tutorial|Small getopts tutorial]]
 +
 +''getopts'' is a built-in bash feature.  Comparatively, ''[[getopt]]'' is a separate binary.
 +
 +==== getopts Syntax ====
 +
 +<code bash>
 +getopts optstring name [args]
 +</code>
 +
 +==== Setting options ====
 +
 +Use the ''optstring'' variable to set what arguments can be accepted by the program.  ''getopts'' uses short argument names only (-a, not --arg).
 +
 +Here's a sample that accepts ''-a'', ''-b'' and ''-c'' as **optional** arguments.  Getopts does not support required arguments.
 +
 +Strings for passed arguments must occur after a whitespace.
 +
 +<code bash>
 +getopts abc opts
 +</code>
 +
 +To set an argument as **required**, add a colon to the end of the argument:
 +
 +<code bash>
 +getopts ab:c
 +</code>
 +
 +==== Invalid Options ====
 +
 +If an invalid option is passed, getopts will throw an error by default:
 +
 +<code>
 +sample.sh -d
 +sample.sh: illegal option -- d
 +</code>
 +
 +When an invalid option is passed, the ''name'' variable is set to ''?'', allowing you to manage the user input.  However, bash will still dump its own error as well.
 +
 +<code bash>
 +case ?)
 +  echo "Invalid argument";;
 +</code>
 +
 +There are two ways to silence errors from bash.  One is to set ''OPTERR'' variable to zero, and the other is to add a '':'' to the front of the options variable, before any letters.
 +
 +Valid syntax for both:
 +
 +<code>
 +OPTERR=0
 +opts=:abc
 +</code>
 +
 +Best practice would be to silence the errors using '':abc'' syntax.  This allows the invalid option passed to be set as ''OPTARG'', so that the script can see what option the user passed.
 +
 +<code bash>
 +case ?)
 +  echo "Invalid option: -$OPTARG";;
 +</code>
 +
 +
 +==== Option Arguments ====
 +
 +Arguments following options must have a whitespace between them.
 +
 +To toggle an option as requiring an argument, add a '':'' to the letter in the options variable.
 +
 +Require ''-c'' option to have an argument, when used.
 +
 +<code bash>
 +getopts abc: opt
 +</code>
 +
 +The argument passed to the option is set as ''OPTARG''.
 +
 +<code bash>
 +c)
 +  echo "Passed -c $OPTARG"
 +</code>
 +
 +=== Multiple Arguments ===
 +
 +There are two ways to pass multiple arguments to an option: enclose the argument in quotes, or pass the option more than once and build on the old variable.
 +
 +** Quoted argument **
 +
 +<code bash>
 +bkup.mysql -d "mysql client"
 +...
 +d)
 +  DBS=$OPTARG
 +</code>
 +
 +** Multiple options **
 +
 +<code bash>
 +bkup.mysql -d mysql -d client
 +...
 +d)
 +  DBS="$DBS $OPTARG"
 +</code>
 +
 +==== Missing Argument ====
 +
 +If error reporting is silenced using '':'' and an option is passed with an argument, the ''name'' variable is set to '':'' and the script can do specific actions based on that input as well.
 +
 +<code bash>
 +bkup.mysql -d 
 +...
 +getopts abcd:
 +...
 +:)
 +  echo "Option -$OPTARG passed, missing an argument";;
 +</code>
 +==== Example ====
 +
 +<code bash>
 +#!/bin/bash
 + 
 +while getopts ":a:" opt; do
 +  case $opt in
 +    a)
 +      echo "-a was triggered, Parameter: $OPTARG" >&2
 +      ;;
 +    \?)
 +      echo "Invalid option: -$OPTARG" >&2
 +      exit 1
 +      ;;
 +    :)
 +      echo "Option -$OPTARG requires an argument." >&2
 +      exit 1
 +      ;;
 +  esac
 +done
 +</code>

Navigation
QR Code
QR Code getopts (generated for current page)