OU operador no bash scripting [duplicado]

1
    

Esta pergunta já tem uma resposta aqui:

    

Este código gera um erro linha 3: [: missing ']' . Então, por que estou recebendo esse erro?

#!/bin/bash
read x
if [ $x == "Y" ] || [ $x == "y"]
then
   echo "YES"
else
   echo "NO"
fi

Obrigado antecipadamente.

    
por Rajat Garg 12.11.2014 / 10:44

3 respostas

1

você precisa adicionar um espaço entre "e]

$ ./test.sh
Y
YES

$ cat test.sh
#!/bin/bash 
read x
if [ $x == "Y" ] || [ $x == "y" ] 
then
    echo "YES"
else
    echo "NO"
fi

Felicidades.

    
por 12.11.2014 / 10:59
1

O colchete de abertura [ é na verdade um comando (embora também esteja disponível como um shell embutido, mas isso é uma história diferente).

$ which [
/usr/bin/[

O shell executa este comando com as opções fornecidas. No seu caso, haverá uma chamada com as quatro opções $x , == , Y e ] e outra com as três opções $x , == e y] . Isso ocorre porque o shell usa espaço em branco para separar opções de comandos e de outro. Aspas (") não são passadas, mas usadas pelo shell para" escapar "significados especiais de certos caracteres (por exemplo, quando você precisa passar espaço em branco para um comando).

Neste ponto, o shell é feito com os colchetes (e tudo no meio), e cabe ao comando [ fazer algo útil. [ está programado para esperar ] como seu último parâmetro (por razões óbvias; note que quando chamado como test , outro nome para o mesmo comando, ] não é esperado). Devido à falta de espaço em branco, ] não foi encontrado e [ reclama.

    
por 12.11.2014 / 11:14
-1

Você tem que usar a chave dupla e incluir suas variáveis com "":

#!/bin/bash
read x;
if [[ "$x" = "Y" ||  "$x" = "y" ]];  then
   echo "YES"
else
   echo "NO"
fi;

No entanto, eu prefiro usar:

echo $x |tr '[A-Z]' '[a-z]'

É muito melhor que a declaração if.

    
por 12.11.2014 / 12:27

Tags