SHORT_OPTS="" LONG_OPTS="" for option in $(seq 0 5 $((${#OPTIONS[@]}-1)) ) do SHORT_OPTS+="${OPTIONS[(${option} + 1)]}${OPTIONS[(${option} + 3)]:+:}" LONG_OPTS+="${OPTIONS[(${option} + 2)]}${OPTIONS[(${option} + 3)]:+:}," done GETOPT_CMD="getopt -n $(basename $0) -o ${SHORT_OPTS} -l ${LONG_OPTS} -- $@" USAGES=( "mktree [options] " "mktree -f [options] " ) PrintHelp() { leader="Usage: " for usage in "${USAGES[@]}" do echo "${leader}${usage}" leader=" or " done echo "Options:" for option in $(seq 0 5 $((${#OPTIONS[@]}-1)) ) do short="${OPTIONS[(${option} + 1)]}" long="${OPTIONS[(${option} + 2)]}" arg="${OPTIONS[(${option} + 3)]}" desc="${OPTIONS[(${option} + 4)]}" printf " -%-6s --%-16s %-48s\n" \ "${short} ${arg}" "${long}${arg:+=${arg}}" "${desc}" done } ParseOpts() { while [ $# -gt 0 ] do case $1 in "--") # end of options shift if [ -z "${FMT_PATH}" ] then FMT_PATH=$(GetTemplate $(Unquote $1)) [ 0 -ne $? ] && Error "Couldn't find template $1!" && exit 1 shift fi PROJECT_NAME=$(Unquote $1) shift [ -z "${PROJECT_NAME}" ] && Error "Project name not specified!\n" && exit 1 MakeProject ${FMT_PATH} ${PROJECT_NAME} $@ exit $? ;; -*) # options for i in $( seq 0 5 $((${#OPTIONS[@]}-1)) ) do callback="${OPTIONS[${i}]}" short="${OPTIONS[(${i} + 1)]}" long="${OPTIONS[(${i} + 2)]}" arg="${OPTIONS[(${i} + 3)]}" desc="${OPTIONS[(${i} + 4)]}" case $1 in "-${short}" | "--${long}") eval "${callback}" "${arg:+$2}" || exit $? [ -n "${arg}" ] && shift # extra shift if the option takes an arg break ;; esac done ;; esac shift done }