#!/bin/bash # UseGetOpt.sh # Author: Peggy Russell UseGetOpt () { declare inputOptions declare -r E_OPTERR=85 declare -r ScriptName=${0##*/} declare -r ShortOpts="adf:hlt" declare -r LongOpts="aoption,debug,file:,help,log,test" DoSomething () { echo "The function name is '${FUNCNAME}'" # Recall that $FUNCNAME is an internal variable #+ holding the name of the function it is in. } inputOptions=$(getopt -o "${ShortOpts}" --long \ "${LongOpts}" --name "${ScriptName}" -- "${@}") if [[ ($? -ne 0) || ($# -eq 0) ]]; then echo "Usage: ${ScriptName} [-dhlt] {OPTION...}" exit $E_OPTERR fi eval set -- "${inputOptions}" # Only for educational purposes. Can be removed. #----------------------------------------------- echo "++ Test: Number of arguments: [$#]" echo '++ Test: Looping through "$@"' for a in "$@"; do echo " ++ [$a]" done #----------------------------------------------- while true; do case "${1}" in --aoption | -a) # Argument found. echo "Option [$1]" ;; --debug | -d) # Enable informational messages. echo "Option [$1] Debugging enabled" ;; --file | -f) # Check for optional argument. case "$2" in #+ Double colon is optional argument. "") # Not there. echo "Option [$1] Use default" shift ;; *) # Got it echo "Option [$1] Using input [$2]" shift ;; esac DoSomething ;; --log | -l) # Enable Logging. echo "Option [$1] Logging enabled" ;; --test | -t) # Enable testing. echo "Option [$1] Testing enabled" ;; --help | -h) echo "Option [$1] Display help" break ;; --) # Done! $# is argument number for "--", $@ is "--" echo "Option [$1] Dash Dash" break ;; *) echo "Major internal error!" exit 8 ;; esac echo "Number of arguments: [$#]" shift done shift # Only for educational purposes. Can be removed. #---------------------------------------------------------------------- echo "++ Test: Number of arguments after \"--\" is [$#] They are: [$@]" echo '++ Test: Looping through "$@"' for a in "$@"; do echo " ++ [$a]" done #---------------------------------------------------------------------- } ################################### M A I N ######################## # If you remove "function UseGetOpt () {" and corresponding "}", #+ you can uncomment the "exit 0" line below, and invoke this script #+ with the various options from the command-line. #------------------------------------------------------------------- # exit 0 echo "Test 1" UseGetOpt -f myfile one "two three" four echo;echo "Test 2" UseGetOpt -h echo;echo "Test 3 - Short Options" UseGetOpt -adltf myfile anotherfile echo;echo "Test 4 - Long Options" UseGetOpt --aoption --debug --log --test --file myfile anotherfile exit