Qual é o comportamento de 'getopts' quando se encontra com '-'?

3

Por convenção -- sinaliza que não há mais opções após isso. Parece-me que, ao usar a cláusula getopts with case , a subclasse padrão -) não corresponde a -- . Então, qual é o comportamento de getopts quando ele atende -- ? Trata -- como uma opção, um argumento nonoption ou nenhum dos dois? Obrigado.

    
por Tim 25.02.2018 / 20:02

1 resposta

10

O comportamento é que ele para de analisar a linha de comando e deixa o restante dos argumentos como está. O -- em si é removido (ou melhor, $OPTIND indicará que foi processado, mas $opt no código abaixo nunca será - e, se você usar shift "$(( OPTIND - 1 ))" como normalmente, você nunca verá isso.

Exemplo:

#!/bin/bash

while getopts 'a:b:' opt; do
    case "$opt" in
        a)  printf 'Got a: "%s"\n' "$OPTARG" ;;
        b)  printf 'Got b: "%s"\n' "$OPTARG" ;;
        *)  echo 'error' >&2
            exit 1
    esac
done

shift "$(( OPTIND - 1 ))"

printf 'Other argument: "%s"\n' "$@"

Executando:

$ bash script.sh -a hello -- -b world
Got a: "hello"
Other argument: "-b"
Other argument: "world"

Como você pode ver, o -b world da linha de comando não foi processado por getopts .

Ele interrompe a análise da linha de comando em -- ou no primeiro argumento não opcional:

$ bash script.sh something -a hello -- -b world
Other argument: "something"
Other argument: "-a"
Other argument: "hello"
Other argument: "--"
Other argument: "-b"
Other argument: "world"

Nesse caso, -- não foi "removido", pois getopts nunca chegou tão longe.

    
por 25.02.2018 / 20:08

Tags