Gostaria que meu script Bash imprimisse uma mensagem de erro se a contagem de argumentos necessária não fosse atendida.
Eu tentei o seguinte código:
#!/bin/bash
echo Script name: $0
echo $# arguments
if [$# -ne 1];
then echo "illegal number of parameters"
fi
Por algum motivo desconhecido, tenho o seguinte erro:
test: line 4: [2: command not found
O que estou fazendo errado?
test
. Esse é o nome de um comando padrão do Unix, você não gostaria de escondê-lo.test
é bom, desde que não esteja no PATH?Respostas:
Assim como qualquer outro comando simples,
[ ... ]
outest
requer espaços entre seus argumentos.Ou
Sugestões
Quando
[[ ]]
estiver no Bash, prefira usar , pois não faz a divisão de palavras e a expansão do nome do caminho para suas variáveis, que a citação pode não ser necessária, a menos que faça parte de uma expressão.Ele também possui outros recursos, como agrupamento de condições sem aspas, correspondência de padrões (correspondência de padrões estendida com
extglob
) e correspondência de expressões regulares.O exemplo a seguir verifica se os argumentos são válidos. Permite um ou dois argumentos.
Para expressões aritméticas puras, utilizando
(( ))
para alguns ainda pode ser melhor, mas eles ainda são possíveis[[ ]]
com seus operadores aritméticos como-eq
,-ne
,-lt
,-le
,-gt
, ou-ge
colocando a expressão como um único argumento string:Isso deve ser útil se você também precisar combiná-lo com outros recursos
[[ ]]
.Saindo do script
Também é lógico fazer com que o script saia quando parâmetros inválidos são passados para ele. Isso já foi sugerido nos comentários por ekangas, mas alguém editou esta resposta para tê-la com
-1
o valor retornado, então é melhor fazê-lo corretamente.-1
embora aceito por Bash como argumento paraexit
não esteja explicitamente documentado e não seja adequado para ser usado como sugestão comum.64
também é o valor mais formal, pois é definidosysexits.h
com#define EX_USAGE 64 /* command line usage error */
. A maioria das ferramentas comols
também retorna2
com argumentos inválidos. Eu também costumava retornar2
meus scripts, mas ultimamente não me importava mais e simplesmente usava1
em todos os erros. Mas vamos colocar2
aqui, já que é mais comum e provavelmente não é específico do sistema operacional.Referências
fonte
[
é apenas mais um comando, ou seja, tentewhich [
.[
é um builtin, enquanto[[
é uma palavra-chave. Em algumas conchas mais antigas,[
nem sequer está embutido. Comandos como[
naturalmente coexistem como um comando externo na maioria dos sistemas, mas comandos internos são priorizados pelo shell, a menos que você ignore comcommand
ouexec
. Verifique a documentação do shell sobre como eles avaliam. Observe a diferença e como eles podem se comportar de maneira diferente em cada concha.Pode ser uma boa ideia usar expressões aritméticas se você estiver lidando com números.
fonte
[ ... ]
, quando isso faz o trabalho bem e não são necessárias operações sofisticadas?$(( ))
não são sofisticadas e devem ser implementadas por todos os shells POSIX. No entanto, a(( ))
sintaxe (sem$
) não faz parte dela. Se por algum motivo você é limitado, certamente pode usar[ ]
, mas lembre-se de que não deve usá-lo[[ ]]
também. Espero que você entenda as armadilhas[ ]
e as razões pelas quais esses recursos existem. Mas essa era uma pergunta do Bash, por isso estamos fornecendo respostas do Bash ( "Como regra geral, [[é usado para seqüências de caracteres e arquivos. Se você deseja comparar números, use uma ArithmeticExpression" ).Em [] :! =, =, == ... existem operadores de comparação de cadeias e -eq, -gt ... são binários aritméticos .
Eu usaria:
Ou:
fonte
==
é realmente um recurso não documentado, que acontece a trabalhar com GNUtest
. Ele também acontece a trabalhar com o FreeBSDtest
, mas pode não funcionar em footest
. A única comparação padrão é=
(apenas para sua informação).dash
:dash -c '[ 1 == 1 ]'
. O POSIX apenas especifica=
, e não==
.Se você estiver interessado apenas em resgatar se um argumento em particular estiver ausente, a Substituição de parâmetros é excelente:
fonte
Um liner simples que funciona pode ser feito usando:
Isso se divide em:
Pensa em observar:
fonte
exit 1
só se aplicaria ao contexto do subshell, tornando-o apenas sinônimo( usage; false )
. Eu não sou fã dessa maneira de simplificação quando se trata de análise de opções, mas você pode usar{ usage && exit 1; }
. Ou provavelmente apenas{ usage; exit 1; }
.{...}
é uma sintaxe comum e está disponível para a maioria, senão todas as shells baseadas emsh
, mesmo as shells mais antigas que não seguem os padrões POSIX.Confira esta planilha de dicas do bash, que pode ajudar muito.
Para verificar a duração dos argumentos passados, use
"$#"
Para usar a matriz de argumentos transmitidos, use
"$@"
Um exemplo de verificação do comprimento e iteração seria:
Isso articulado me ajudou, mas faltavam algumas coisas para mim e minha situação. Espero que isso ajude alguém.
fonte
Caso você queira estar do lado seguro, recomendo usar getopts.
Aqui está um pequeno exemplo:
veja mais detalhes aqui, por exemplo, http://wiki.bash-hackers.org/howto/getopts_tutorial
fonte
Aqui está um exemplo simples para verificar se apenas um parâmetro é fornecido, caso contrário, saia do script:
fonte
Você deve adicionar espaços entre a condição de teste:
Eu espero que isso ajude.
fonte