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