Most Unix command line utilities we have looked at provide multiple command line options. Some of them, such as tar allow you to flexibly combine command line options to modify command behavior in multiple ways at once.
The shell (bash) provides the getopts construct that allows you to add flexible command line option handling to shell scripts.
Sample script #1 that uses getopts:
#!/bin/bash # getopts_test1 # This script has 3 command line options, one of which takes an argument. function usage { echo "script usage: $(basename $0) [-l] [-m] [-o somevalue]" >&2 exit 1 } while getopts 'lmo:' OPTION; do case "$OPTION" in l) echo "option l selected" ;; m) echo "option m selected" ;; o) oarg="$OPTARG" echo "The o option's argument was $oarg" ;; ?) usage ;; esac done shift "$(($OPTIND - 1))"
./getopts_test1 -l -m ./getopts_test1 -l -m -o 3 ./getopts_test1 -lm ./getopts_test1 -lm -o 3 ./getopts_test1 -lmo 3 ./getopts_test1 -lmo3 ./getopts_test1 -o 3 -l -m ./getopts_test1 -o3 -lm ./getopts_test1 -o3 -m (and more)
./getopts_test1 -o 3 -l -m # $OPTIND = 4 ./getopts_test1 -o3 -lm # $OPTIND = 4 ./getopts_test1 -l -m # $OPTIND = 2 ./getopts_test1 -lm # $OPTIND = 2
Sample script #2 that uses getopts:
#!/bin/bash # getopts_test2: # This script has 3 command line options and # takes an additional script argument ($1) while getopts dmy OPTION do case $OPTION in d) dopt=1;; m) mopt=1;; y) yopt=1;; ?) echo "Unrecognized or invalid option" exit 1;; esac done if [ ! -z $dopt ]; then day=$(date '+%d') fi if [ ! -z $mopt ]; then mon=$(date '+%b') fi if [ ! -z $yopt ]; then year=$(date '+%Y') fi shift $(($OPTIND - 1)) echo "The date is: $day $mon $year" if [ ! -z $1 ]; then echo "Welcome, $1." fi
./getopts_test2 -d -m -y Dave ./getopts_test2 -dmy Dave
Test a version of the text2png script that uses getopts for command line options handling: text2png_getopts