shift no loop de getopts - esclarecimento necessário

0

Eu ficaria feliz se alguém esclarecesse a necessidade de usar shift neste código simples de analisador:

while getopts ":hp:" option
do
    case "${option}" in
        p)
            some_parameter=${OPTARG}
            ;;
        h)
            print_usage_and_exit 0
            ;;
        *)
            print_usage_and_exit 1
            ;;
    esac
done

shift $(( OPTIND - 1 ))

Por exemplo, não está claro para mim:

  1. Por que aparentemente não há necessidade de um shift dentro do loop?

    O acesso de getopts move os argumentos sobre si mesmo ou como funciona?

  2. Por que há a necessidade de um shift após getopts ?

    Eu não entendo porque não getopts faria isso por si só no final.

por Vlastimil 26.11.2018 / 11:48

1 resposta

1
  1. Você não precisa shift (e não deve) dentro do loop porque getopts rastreia qual parâmetro posicional está processando atualizando a variável OPTIND .

  2. Você não precisa para shift após o loop: você pode usar OPTIND para determinar quais parâmetros posicionais serão gerenciados por você mesmo. Usar shift , no entanto, é a maneira mais simples de lidar com argumentos que foram processados por getopts , 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).

    
por 26.11.2018 / 11:56

Tags