Eu escrevi um script recentemente para um trabalho que era versátil e permitia vários tipos de switches em qualquer ordem. Eu não posso divulgar o roteiro completo por razões óbvias legais (para não mencionar que eu não tenho isso comigo no momento), mas aqui está a carne dele .. você pode colocá-lo em uma sub-rotina e chamá-lo no final do seu script:
options () {
if [ -n "$1" ]; then # test if any arguments passed - $1 will always exist
while (( "$#" )); do # process ALL arguments
if [ "$1" = ^-t$ ]; then # -t short for "test"
# do something here THEN shift the argument
# shift removes it from $@ and reduces $# by
# one if you supply no argument
shift
# we can also process multiple arguments at once
elif [[ "$1" =~ ^--test=[:alnum:]{1,8}$ ]] && [[ "$2" =~ ^-t2$ ]] && [[ -n "$3" ]]; then # check for 3 arguments
# do something more then remove them ALL from the arg list
shift 3
else
echo "No matching arguments!"
echo "Usage: [script options list here]"
fi
done
else
echo "Usage: [script options list here]"
exit 0
fi
}
options "$@" # run options and loop through/process ALL arguments
Eu recomendo limitar seu script bash a menos de 400 linhas / 15k caracteres; meu script acima mencionado ultrapassou esse tamanho e tornou-se muito difícil de trabalhar. Eu comecei a reescrevê-lo em Perl, que é muito mais adequado para a tarefa. Tenha isso em mente enquanto você trabalha em seus scripts no bash. O Bash é ótimo para pequenos scripts e oneliners, mas nada mais complexo e é melhor escrevê-lo em Perl.
Note que eu não testei o código acima, então provavelmente ele não funciona, mas você tem uma idéia geral dele.