Como verificar as opções passadas usando getopts
(man page) em um shell POSIX? (Relatar, contar e descartar.)
Minha ideia é a seguinte: muitos dos meus scripts não aceitam opções (nem mesmo -h
para obter ajuda, estou fazendo a transição help
diretamente. E, portanto, se qualquer número de opções (interruptores) for fornecido, quero contá-las, relatá-las e simplesmente descartar eles (não faça nenhuma ação neles).
Vamos incluir todos 0-9
, e inferior e superior a-z
( A-Z
).
Atualização: muitos dos meus scripts não aceitam nem mesmo arquivos como argumentos, e esse é o caso deste script.
A ajuda de uso tem esta aparência:
usage ()
{
cat << EOF
MPV video player subtitles enable/disable toggling
--------------------------------------------------
on Enable subtitles toggling in MPV.
off Disable subtitles toggling in MPV.
help Print this help message.
version Print the script version.
EOF
}
Se o seu script não aceita nenhuma opção, mas você deseja verificar quais opções foram passadas (incorretamente) e lidar com os erros sozinho, é aí que você prefixa a
getopts
especificação da opção com:
onde o caractere da opção errada é retornado em$OPTARG
. Citando a especificação POSIX dogetopts
utilitário (grifo meu):Então você poderia escrever por exemplo:
Exemplo:
Mas um script que não aceita opção (mas ainda lida com
--
) geralmente seria apenas:E ainda saia com um status de saída de falha no primeiro erro, que é a coisa mais sensata a fazer.
Onde deixamos
getopts
a mensagem de erro sobre a própria opção inválida, omitindo o:
prefixo.Obviamente, após o processamento da opção, você pode validar o restante dos argumentos conforme necessário. Por exemplo, se o seu script também não aceitar argumentos de não opção, após a
shift
chamada:Efetivamente, ele só pode ser chamado como
that-script
outhat-script --
. Embora você também possa ignorargetopts
e rejeitar qualquer argumento, sejam eles opções, o delimitador de opções ou argumentos não opcionais.ou para um
Usage: cmd [<type> <length> <value> [<type> <length> <value>]...]
:E assim por diante.