Although this question was posted over 2 years ago, I found myself needing support for XFree86-style long options too; and I also wanted to take what I could from getopts. Consider the GCC switch -rdynamic. I mark r as the flag letter, and expect dynamic within $OPTARG...but, I want to reject -r dynamic, while accepting other options following r.
The idea I've put below builds on the observation that $OPTIND will be one larger than otherwise if space (a gap) follows the flag. So, I define a bash variable to hold the previous value of $OPTIND, called $PREVOPTIND, and update it at the end of the while loop. If $OPTIND is 1 greater than $PREVOPTIND, we have no gap (i.e. -rdynamic); and $GAP is set to false. If instead $OPTIND is 2 greater than $PREVOPTIND, we do have a gap (e.g. -r dynamic), and $GAP is set to true.
usage() { echo usage: error from $1; exit -1; } OPTIND=1 PREVOPTIND=$OPTIND while getopts "t:s:o:" option; do GAP=$((OPTIND-(PREVOPTIND+1))) case $option in t) case "${OPTARG}" in emp) # i.e. -temp ((GAP)) && usage "-${option} and ${OPTARG}" TMPDIR="$OPTARG" ;; *) true ;; esac ;; s) case "${OPTARG}" in hots) # i.e. -shots ((GAP)) && usage NUMSHOTS="$OPTARG" ;; *) usage "-${option} and ${OPTARG}" ;; esac ;; o) OUTFILE="$OPTARG" ;; *) usage "-${option} and ${OPTARG}" ;; esac PREVOPTIND=$OPTIND done shift $(($OPTIND - 1))