Uma das muitas coisas que getopt
faz ao analisar as opções é reorganizar os argumentos, de modo que os argumentos não opcionais sejam os últimos e as opções curtas combinadas sejam divididas. De man getopt
:
Output is generated for each element described in the previous section.
Output is done in the same order as the elements are specified in the
input, except for non-option parameters. Output can be done in
compatible (unquoted) mode, or in such way that whitespace and other
special characters within arguments and non-option parameters are
preserved (see QUOTING). When the output is processed in the shell
script, it will seem to be composed of distinct elements that can be
processed one by one (by using the shift command in most shell
languages).
[...]
Normally, no non-option parameters output is generated until all
options and their arguments have been generated. Then '--' is
generated as a single parameter, and after it the non-option parameters
in the order they were found, each as a separate parameter.
Este efeito é refletido no seu código, onde o loop de manipulação de opções assume que todos os argumentos da opção (incluindo argumentos para opções) vêm em primeiro lugar, e vêm separadamente e são finalmente seguidos por não opção argumentos.
Portanto, TEMP
contém as opções de divisão, cotação e rearranjadas, e usar eval set
faz delas argumentos de script.
Quanto a shift
, ele faz o que sempre faz: remover o primeiro argumento e alterar todos os argumentos (para que o que é $2
seja $1
). Isso elimina os argumentos que foram processados, de modo que, após esse loop, apenas argumentos não opcionais são deixados e você pode usar convenientemente $@
sem se preocupar com opções.