getopts não corresponde ao segundo argumento

2

Estou tentando obter um script para:

  • definir uma variável com -q option
  • mostrar ajuda para a opção -h e
  • falha para outras opções -* , mas permite argumentos posicionais

Aqui está o fragmento getopts que estou usando:

while getopts qh opt; do
    case "${opt}" in
        q)
            quiet="true"
            ;;
        h)
            usage
            exit 1
            ;;
        \?)
            echo "unrecognized option -- ${OPTARG}"
            exit 1
            ;;
    esac
    shift
done

echo "unparsed: $*"

Isso parece bastante simples. No entanto, só funciona se eu fornecer um único argumento ( a.sh -q ou a.sh -h do que é esperado).

No entanto, ele não faz nada se eu fornecer os dois argumentos ou fornecer um argumento não reconhecido como $ 2:

$ ./a.sh -b
unrecognized option -- b

$ ./a.sh -q -b
unparsed: -b

$ ./a.sh -h -k
this is my help message
unparsed: -k

Alguma idéia de porque o segundo argumento ($ 2) não é tratado no loop getopts?

    
por Ahmet Alp Balkan 08.10.2017 / 07:11

1 resposta

4

O comando shift está mal colocado. Deve estar fora do loop while . Experimente:

while getopts :qh opt; do
    case "${opt}" in
        q)
            quiet="true"
            ;;
        h)
            usage
            exit 1
            ;;
        \?)
            echo "unrecognized option -- ${OPTARG}"
            exit 1
            ;;
    esac
done
shift $((OPTIND - 1))

echo "unparsed: $*"

Exemplos

Se adicionarmos a seguinte linha ao início do código:

usage() { echo "this is my help message"; }

Então podemos fazer estes testes:

$ ./a.sh -q -foo
unrecognized option -- f
$ ./a.sh -q -h
this is my help message
    
por 08.10.2017 / 07:32

Tags