-
Você não precisa
shift(e não deve) dentro do loop porquegetoptsrastreia qual parâmetro posicional está processando atualizando a variávelOPTIND. -
Você não precisa para
shiftapós o loop: você pode usarOPTINDpara determinar quais parâmetros posicionais serão gerenciados por você mesmo. Usarshift, no entanto, é a maneira mais simples de lidar com argumentos que foram processados porgetopts, supondo que você não precise pós-processá-los por conta própria.
Ter o getopts não em si tem alguns benefícios: você pode revisitar os argumentos, se necessário, e pode reproduzir a linha de comando original. O último é útil, por exemplo, em mensagens de erro, ou se você precisar executar outro comando com os mesmos argumentos (eu sei que usei isso no passado).