Eu usaria getopt em vez de getopts :
#!/usr/bin/env bash
OPT=$(getopt \
--options a:c:d:De:rs: \
--name "$0" \
-- "$@"
)
if [ $? -ne 0 ]; then
echo You are doing it wrong!
exit 1
fi
eval set -- "${OPT}"
while true; do
case "$1" in
-a) app=${2}; shift 2;;
-c) cmd=${2}; shift 2;;
-d) domain=${2}; shift 2;;
-D) Debug=1; shift;;
-e) env=${2}; shift 2;;
-r) Doit=1; shift;;
-s) subapp=${2}; shift 2;;
--) break;;
esac
done
echo "Env: ${env}"
echo "App: ${app}"
echo "Subapp: ${subapp}"
echo "Cmd: ${cmd}"
echo "Doit: ${Doit}"
echo "Debug: ${Debug}"
$ ./mwctl -a weblogic -c start -s admin -e trn -r -D
> Env: trn
> App: weblogic
> Subapp: admin
> Cmd: start
> Doit: 1
> Debug: 1
$ ./mwctl -D -a weblogic -c start admin -e trn -r
> Env: trn
> App: weblogic
> Subapp:
> Cmd: start
> Doit: 1
> Debug: 1
Observe que quando você está pesquisando getopts vs. getopt , você encontrará muitas pessoas reclamando sobre getopt . Tanto quanto eu posso dizer, isso é sempre sobre uma versão mais antiga do getopt , que na verdade foi muito bugs. Minha experiência é que getopt tem mais opções e também é mais robusto que getopts .
Para verificar se você tem a versão getopt aprimorada, é possível executar
getopt -T
echo $?
Se a saída for 4 , você terá a versão aprimorada.