Diversas maneiras; os dois mais óbvios são:
- Coloque
entre aspas duplas:
if [ "" = "--test" ]
- Verifique o número de argumentos usando $ #
Melhor ainda, use getopts.
Eu tenho um script bash que é mais ou menos assim:
#!/bin/bash
if [ = "--test" ] || [ = "-t" ]; then
echo "Testing..."
testing="y"
else
testing="n"
echo "Not testing."
fi
Então, o que eu quero fazer é não apenas executá-lo com ./script --test
ou ./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 programá-lo de modo que executá-lo sem nenhum argumento, basta fazer o else
sem gerar o erro? O que estou fazendo errado?
Diversas maneiras; os dois mais óbvios são:
entre aspas duplas: if [ "" = "--test" ]
Melhor ainda, use getopts.
Você precisa citar suas variáveis dentro da condição if. Substitua:
if [ = "--test" ] || [ = "-t" ]; then
com:
if [ "" = '--test' ] || [ "" = '-t' ]; then
Então vai funcionar:
➜ ~ ./test.sh
Não testando.
Sempre sempre duplique suas variáveis!
Você está usando o bash. O Bash tem uma ótima alternativa para [
: [[
. Com [[
, você não precisa se preocupar com citações e obter muito mais operadores que [
, incluindo suporte adequado para ||
:
if [[ = "--test" || = "-t" ]]
then
echo "Testing..."
testing="y"
else
testing="n"
echo "Not testing."
fi
Ou você pode usar expressões regulares:
if [[ =~ ^(--test|-t) ]]
then
echo "Testing..."
testing="y"
else
testing="n"
echo "Not testing."
fi
É claro que as citações adequadas devem sempre ser feitas, mas não há motivo para ficar com [
ao usar o bash.
Para testar se os argumentos estão presentes (em geral, e faça as ações adequadamente) Isso deve funcionar:
#!/bin/bash
check=
if [ -z "$check" ]; then
echo "no arguments"
else echo "there was an argument"
fi
Tags command-line bash scripts