Qual é o propósito do primeiro caractere da cadeia de opções de getopts ser: (dois pontos)?

1

Na string de opção ao usar getopts , do link

If the very first character of the option-string is a : (colon), which would normally be nonsense because there's no option letter preceding it, getopts switches to " silent error reporting mode". In productive scripts, this is usually what you want because it allows you to handle errors yourself without being disturbed by annoying messages.

Eu queria saber o que significam os seguintes:

  • "modo de relatório de erros silencioso"

  • "permite que você lide com erros sem ser perturbado por mensagens irritantes"?

Você poderia dar alguns exemplos?

Obrigado.

    
por Tim 25.02.2018 / 17:15

2 respostas

1

Se o primeiro caractere de optstring for dois pontos, getopts não produzirá nenhuma mensagem de diagnóstico para argumentos de opção ausentes ou opções inválidas.

Isso pode ser útil se você realmente precisar ter mais controle sobre as mensagens de diagnóstico produzidas pelo seu script ou se simplesmente não quiser que nada apareça no fluxo de erro padrão se o usuário fornecer opções complicadas de linha de comando.

No modo de relatório silencioso, se você quiser alertar o usuário sobre uma opção inválida, será necessário procurar ? na variável passada para getopts . Da mesma forma, para argumentos de opção ausentes, é um : . Estes são os dois erros geralmente manipulados pelo próprio getopts , mas para fazer o seu próprio relatório de erros para o usuário, você precisará pegá-los separadamente para poder fornecer a mensagem de diagnóstico correta.

No modo de relatório não silencioso, getopts faz seu próprio relatório de erro no erro padrão e você só precisa capturar um * para "qualquer erro".

Compare esses dois exemplos:

#!/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 'some kind of error' >&2
           exit 1
    esac
done
$ bash script.sh -a
script.sh: option requires an argument -- a
some kind of error
#!/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 'missing argument!' >&2
            exit 1 ;;
        \?) echo 'invalid option!' >&2
            exit
    esac
done
$ bash script.sh -a
missing argument!
    
por 25.02.2018 / 17:30
1

Não silencioso, getopts imprime uma mensagem de erro:

$ bash -c 'getopts a opt' getopts_test -b
getopts_test: illegal option -- b

Silencioso, getopts não imprime sozinho:

$ bash -c 'getopts :a opt' getopts_test -b
$

Assim, com os dois pontos do modo silencioso, podemos imprimir nosso próprio erro no script da maneira que preferir, em vez da mensagem fixa:

#!/bin/bash
while getopts :a opt; do
    [[ $opt = "?" ]] && echo "Invalid option character '$OPTARG'" >&2;
done
    
por 25.02.2018 / 17:28

Tags