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!