In programs written in C, command line argument parsing has always been done using the getopt(3)
library function. This function has set the standards Linux/Unix users have come to expect from command line interfaces. Fortunately, there’s a getopt(3)
equivalent for almost every programming language and the shell is no exception.
The getopts
command available in all POSIX-compliant Bourne shell derivates (like bash, dash, or ksh) provides convenient command line parsing capabilities. It is a builtin accepting POSIX-style argument lists (as opposed to GNU-style, which is a bit more fancy) and should not be confused with the getopt
utility.
For my shell scripts, I use the following template to implement command line parsing:
#! /bin/sh USAGE="Usage: `basename $0` [-hv] [-o arg] args" # Parse command line options. while getopts hvo: OPT; do case "$OPT" in h) echo $USAGE exit 0 ;; v) echo "`basename $0` version 0.1" exit 0 ;; o) OUTPUT_FILE=$OPTARG ;; \?) # getopts issues an error message echo $USAGE >&2 exit 1 ;; esac done # Remove the switches we parsed above. shift `expr $OPTIND - 1` # We want at least one non-option argument. # Remove this block if you don't need it. if [ $# -eq 0 ]; then echo $USAGE >&2 exit 1 fi # Access additional arguments as usual through # variables $@, $*, $1, $2, etc. or using this loop: for PARAM; do echo $PARAM done # EOF
It is easy to add more command line switches. If you want to add an -x
switch requiring an argument (-x arg
) and a y
flag without an argument, you would have to change the getopts call to getopts hvo:x:y OPT
and add two case labels to the loop. Note that the colon indicates that an argument is required for a flag.