/ / Bash si erreur de syntaxe d'instruction [duplicate] - bash

Bash if error syntax error [duplicate] - bash

Je ne comprends pas pourquoi cela donne une erreur de syntaxe. Des idées?

#!/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

Quand je cours, je reçois:

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

Réponses:

4 pour la réponse № 1

La raison pour laquelle il s’agit d’une erreur de syntaxe est que [ Cela ne fait pas partie de la syntaxe du shell; c’est en fait une commande. À l’origine, c’était juste un lien symbolique vers test commander. C’est toujours le cas, mais c’est aussi une commande intégrée dans bash et d’autres shells dérivés de Bourne.

if est un mot-clé shell, mais le shell voit if[, ne pas if. Parce qu'il n'a pas vu un if, il ne sait pas quoi faire quand il voit then. (En fait, il sait exactement quoi faire: affiche un message d'erreur de syntaxe.)

...

Un peu d’expérimentation montre que ce n’est pas aussi simple que je le pensais. J'ai essayé de créer une commande if[ et le mettre dans un répertoire dans mon $PATH. Quand je tape juste if[ à l'invite, le shell demande plus d'informations. En fait, je ne sais pas ce qu’il cherche, mais apparemment le [ le caractère est spécialement traité par la coquille. Le shell ne se divise pas if[ dans le if mot clé et le [ commande (comme vous pouvez raisonnablement vous attendre en fonction du fonctionnement des autres langues) (Si je voulais vraiment exécuter cette commande, je pourrais taper if[ ou "if[" - ou lui donner un nom sain d'esprit en premier lieu.

Dans tous les cas, cette dernière partie n’a probablement pas d’importance; l’ajout d’un espace permettra de résoudre le problème.


1 pour la réponse № 2

Ajouter de l'espace avant [

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

1 pour la réponse № 3
if[ `date +%H` -lt 20 ] ;

vous devez placer un espace après if

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