Como escrever um script que funciona com ou sem argumentos?

11

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?

    
por Great Uncle Bulgaria 29.05.2016 / 21:38

4 respostas

16

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.

    
por JayEye 29.05.2016 / 21:48
7

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!

    
por Seth 29.05.2016 / 21:48
4

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.

    
por muru 30.05.2016 / 16:31
3

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
    
por Jacob Vlijm 29.05.2016 / 21:48