web-dev-qa-db-fra.com

Erreur de syntaxe Bash manquante dans l'attente de "then"

Pour les lignes suivantes dans mon Makefile, j'obtiens l'erreur

Syntax error: end of file unexpected (expecting "then")

Code:

if [ ! -d upload-api/app-router/ ] then
    git clone someRepo upload-api/app-router/
fi

J'ai essayé avec un point-virgule après les crochets mais j'obtiens toujours la même erreur

3
Barsch

Vous devez ensuite mettre à la ligne suivante ou utiliser le point-virgule

if [ ! -d upload-api/app-router/ ] 
then

ou

if [ ! -d upload-api/app-router/ ];then
14
papampi

Dans le contexte d'un makefile, je vois deux choses.

Tout d’abord, vous avez besoin d’un point-virgule ou d’une nouvelle ligne avant le thenname__. La syntaxe de shell pour ifse présente comme suit: if commands... ; then commands... ; fi (où tout point-virgule peut être remplacé par une nouvelle ligne).

Deuxièmement, lorsque makeexécute une recette, il exécute chaque ligne individuelle de la recette dans une instance de shell distincte et cesse de s’exécuter si une seule ligne génère une erreur. Effectivement, ça tourne:

sh -c 'if [ ! -d upload-api/app-router/ ]; then' &&
    sh -c 'git clone someRepo upload-api/app-router/' &&
    sh -c 'fi'

... qui est une erreur de syntaxe sur la première ligne, avec ou sans point-virgule, car ifn'est jamais terminé.

Donc, pour une recette de makefile, vous devez indiquer à makequ'il doit traiter le bloc if ... fi entier comme une seule ligne. Par exemple, utilisez des barres obliques inverses pour la continuation de ligne et des points-virgules aux emplacements appropriés, car le shell ne verra pas de saut de ligne.

my-target:
↦       if [ ! -d upload-api/app-router/ ] ; then \
↦           git clone someRepo upload-api/app-router/ ; \
↦       fi

Cela devient vite assez compliqué, alors ma solution préférée consiste généralement à placer le shellscript dans un fichier séparé, puis à l'exécuter à partir de votre recette.

3
Jander