/ / Bash if erro de sintaxe de instrução [duplicado] - bash

Bash se o erro de sintaxe de instrução [duplicado] - bash

Não sei por que isso está dando um erro de sintaxe. Alguma ideia?

#!/bin/bash

if [ `date +%H` -lt 11 ] ; then exit 0;
fi

if [ `date +%H` -gt 14 ] ; then
if[ `date +%H` -lt 20 ] ; then  # <--- this line is the culprit, it seems
exit 0;
fi
fi

Quando corro, recebo:

./get.sh: line 7: syntax error near unexpected token `then"
./get.sh: line 7: `  if[ `date +%H` -lt 20 ] ; then "

Respostas:

4 para resposta № 1

A razão pela qual este é um erro de sintaxe é que [ não é parte da sintaxe do shell; na verdade, é um comando. Originalmente, era apenas um link simbólico para o test comando. Ainda é, mas também é um comando embutido no bash e em outros shells derivados de Bourne.

if é uma palavra-chave shell, mas o shell vê if[, não if. Porque não vi um if, ele não sabe o que fazer quando vê then. (Na verdade, ele sabe exatamente o que fazer: imprimir uma mensagem de erro de sintaxe.)

...

Um pouco de experimentação mostra que não é tão simples quanto eu pensava. Tentei criar um comando chamado if[ e colocá-lo em um diretório no meu $PATH. Quando eu digito apenas if[ no prompt, o shell pede mais entrada. Na verdade, não sei o que ele está procurando, mas aparentemente o [ personagem é especialmente tratado pelo shell. A casca simplesmente não se divide if[ no if palavra-chave e o [ (como você pode razoavelmente esperar com base em como outras linguagens funcionam). (Se eu realmente quisesse executar esse comando, poderia digitar if[ ou "if[" - ou dê a ele um nome lógico em primeiro lugar.

Em qualquer caso, essa última parte provavelmente não importa; adicionar um caractere de espaço resolverá o problema.


1 para resposta № 2

Adicione espaço antes [

if [ `date +%H` -lt 20 ]

1 para resposta № 3
if[ `date +%H` -lt 20 ] ;

você precisa colocar um espaço depois if

if [ `date +%H` -lt 20 ] ;