Eu tenho um script bash que é algo como isto:
#!/bin/bash
if [ $1 = "--test" ] || [ $1 = "-t" ]; then
echo "Testing..."
testing="y"
else
testing="n"
echo "Not testing."
fi
Então, o que eu quero poder fazer não é apenas executá-lo com ./script --test
or ./script -t
, mas também sem argumentos (apenas ./script
), mas aparentemente se eu fizer isso com o código atual, a saída é apenas:
./script: line 3: [: =: unary operator expected
./script: line 3: [: =: unary operator expected
Not testing.
Então, como programo para que a execução sem argumentos funcione else
sem gerar o erro? O que estou fazendo de errado?
command-line
bash
scripts
Peter Cordes
fonte
fonte
Respostas:
A "maneira correta" de usar opções longas em scripts de shell é através do utilitário getopt GNU . Também há getopts que são embutidos no bash , mas permitem apenas opções curtas como
-t
. Alguns exemplos degetopt
uso podem ser encontrados aqui .Aqui está um script que demonstra como eu abordaria sua pergunta. A explicação da maioria das etapas é adicionada como comentários no próprio script.
Com algumas simplificações e comentários removidos, isso pode ser condensado em:
fonte
Várias formas; os dois mais óbvios são:
$1
aspas duplas:if [ "$1" = "--test" ]
Melhor ainda, use getopts.
fonte
[ "x$1" = "x--test" ]
defender novamente argumentos da linha de comandos que são operadores válidos para o[
comando. (Esta é outra razão pela qual[[ ]]
é o preferido: é parte da sintaxe shell, e não apenas um comando integrado.)Você precisa citar suas variáveis dentro da condição if. Substituir:
com:
Então vai funcionar:
Sempre cite sempre suas variáveis!
fonte
foo=bar echo '$foo'
impressões de expansão variável$foo
na saída, mas simfoo=bar echo "$foo"
impressõesbar
.Você está usando o bash. Bash tem uma ótima alternativa para
[
:[[
. Com[[
, você não precisa se preocupar com a cotação e terá muito mais operadores do que[
, incluindo suporte adequado para||
:Ou você pode usar expressões regulares:
Obviamente, citações apropriadas sempre devem ser feitas, mas não há razão para se manter
[
ao usar o bash.fonte
Para testar se argumentos estão presentes (em geral, e executar as ações adequadamente) Isso deve funcionar:
fonte
[ -z "$1" ]
?$check
uma vez, antes de qualquershift
s, portanto, seria melhor usá-lo$1
.#!
ao fornecer amostras (você deve descrever o shell fora do código).