Eu tenho esse código -
#getoptDemo.sh
usage()
{
echo "usage: <command> options:<w|l|h>"
}
while getopts wlh: option
do
case $option in
(w)
name='1';;
(l)
name='2';;
(h)
name='3';;
(*)
usage
exit;;
esac
done
print 'hi'$name
Quando executo bash getoptDemos.sh
(sem a opção), ela é impressa em hi
vez de chamar a função usage
. Ele chama uso quando outras opções além de w, he são fornecidas. Então não pode funcionar quando nenhuma opção é especificada.
Eu tentei usar ?
, \?
, :
no lugar de *
mas eu não posso conseguir o que eu queria. Quero dizer toda a docs
sobre getopt
diz-lo para usar ?
.
O que estou fazendo de errado?
/bin/bash
Respostas:
Quando você executa esse script sem nenhuma opção, o getopt retornará false, portanto não entrará no loop. Irá apenas aparecer na impressão - é este ksh / zsh?
Se você precisa ter uma opção, é melhor apostar em testar o nome $ após o loop.
Mas verifique se ele
$name
estava vazio antes de chamargetopts
(pois pode haver um$name
ambiente no qual o shell recebeu na inicialização) com(antes do
getopts
loop)fonte
no argument
condição usando o bash.getopts
não ter essa disposição. O que é pior do que isso é, não pode te ajudar.getopts
processa as opções por sua vez. Esse é o seu trabalho. Se o usuário não passar nenhuma opção, a primeira chamada degetopts
sai do loop while.Se nenhuma das opções aceitar um argumento, o valor de
OPTIND
indica quantas opções foram passadas. Em geral,OPTIND
é o número de argumentos que são opções ou argumentos para opções, em oposição a argumentos não opcionais (operandos).De qualquer forma, você não está tentando determinar se não havia opções, mas se nenhuma das
name
opções de configuração foi aprovada. Portanto, verifique sename
está desabilitado (e desative-o primeiro) .fonte
bash sample.sh -abc file.txt
isso dá -1 non-option arguments
. como descubro quantas opções foram dadas. (aqui 3)Se seu script precisar receber argumentos de opção, for esse o caso, coloque esse bloco no início (antes de getops).
O bloco verifica se a sequência de parâmetros não começa com o
-
símbolo, o que indica que o primeiro parâmetro não é um argumento de opção.fonte
Eu verificaria isso com uma variável. Se getopts nunca passa no loop em caso de nenhum argumento, você pode usá-lo, por exemplo, como este:
fonte
Pouco antes do seu
getopts
bloco, verifique se$1
(o primeiro argumento / opção que você passou na linha de comando) é igual a uma string vazia. Se for, imprima a mensagem de uso e saia (ou execute algumas funções "sem opções" se você é anarquista); caso contrário, deixe-asgetopts
analisar as opções normalmente.A razão pela qual esse recurso não está incluído no getopts é porque você já pode realizá-lo no bash com um "if-else". Exemplo:
Faz sentido?
fonte