[RESOLU] Syntax error: "fi" unexpected

Bien le bonjour !

J’ai rédigé un petit script nommé runscript.sh,
mais lorsque je fais ./runscript.sh j’obtiens l’erreur suivante :

Syntax error: “fi” unexpected

Pourtant, il s’agit bien d’un format Unix, donc pas de caractères bizarres dus à Windows et la syntaxe me parait correcte après plusieurs essais.

Voici le code :

#!/bin/sh

# Run Environment Variables Config

if [ "${DISPLAY_ERRORS}" == true ]; then
 sed -i -r 's/display_errors = Off/display_errors = On/g' /etc/php5/apache2/php.ini
 sed -i -r 's/display_errors = Off/display_errors = On/g' /etc/php5/cli/php.ini
else
fi
if [ "${DISPLAY_ERRORS}" == false ]; then
 sed -i -r 's/display_errors = On/display_errors = Off/g' /etc/php5/apache2/php.ini
 sed -i -r 's/display_errors = On/display_errors = Off/g' /etc/php5/cli/php.ini
else
fi

Et voici l’erreur au complet ./runscript.sh: 9: ./runscript.sh: Syntax error: “fi” unexpected

Si quelqu’un siat ce qui ne va pas dans mon code, je lui serait reconnaissant de bien vouloir me l’indiquer.
Merci beaucoup ! :slightly_smiling:

Vire les ‘else’ avant fi

Je plussoie ! :smiley:

Je trissoie.

Essaie de supprimer les 3 lignes en rouge et ça devrait fonctionner.

if [ “${DISPLAY_ERRORS}” == true ]; then
sed -i -r ‘s/display_errors = Off/display_errors = On/g’ /etc/php5/apache2/php.ini
sed -i -r ‘s/display_errors = Off/display_errors = On/g’ /etc/php5/cli/php.ini
else
fi
if [ “${DISPLAY_ERRORS}” == false ]; then

sed -i -r ‘s/display_errors = On/display_errors = Off/g’ /etc/php5/apache2/php.ini
sed -i -r ‘s/display_errors = On/display_errors = Off/g’ /etc/php5/cli/php.ini
else
fi

Ou bien insère [mono]:[/mono] (commande sans effet) entre [mono]else[/mono] et [mono]fi[/mono].

Attention : en toute rigueur la condition [mono][ “${DISPLAY_ERRORS}” == false ][/mono] n’est pas le complément de [mono][ “${DISPLAY_ERRORS}” == true ][/mono] car dans l’absolu la variable DISPLAY_ERRORS pourrait avoir d’autres valeurs que “true” et “false”.

Ou bien insère [mono]:[/mono] (commande sans effet) entre [mono]else[/mono] et [mono]fi[/mono].

Attention : en toute rigueur la condition [mono][ “${DISPLAY_ERRORS}” == false ][/mono] n’est pas le complément de [mono][ “${DISPLAY_ERRORS}” == true ][/mono] car dans l’absolu la variable DISPLAY_ERRORS pourrait avoir d’autres valeurs que “true” et “false”.[/quote]

Dans l’absolu, c’est exact mais, étant donné qu’il ne donne que ces seules deux possibilités, il serait étonnant qu’il en existe d’autres. Dans ce cas, on emploie “case” de préférence à “if/fi”.
Mais, dans l’absolu, tu as raison. :wink:

Ah, le retour de la fameuse loi de Murphy

Je ne vais pas prendre le temps de la décrire en détail, mais en résumé c’est une loi qui est utilisée tant en ingénierie qu’en informatique et qui conseille de toujours prévoir les pires cas d’erreurs possibles. L’idée étant que si l’auteur du programme sait bien aujourd’hui quelles valeurs il est capable de traiter, un autre utilisateur ou même l’auteur dans quelques années risque à tout moment d’y entrer des valeurs que le programme ne sait pas traiter.

Si ce cas n’a pas été prévu à l’avance, le programme risque d’avoir un comportement incohérent dont l’origine sera difficile à déterminer.

Un exemple perso pour ceux qui comprennent le shell :
dotslashplay.it/scripts/fr/p … .0.0.12.sh
Aux lignes 242, 261, 282 et 311, ce script teste les valeurs assignées par l’utilisateur à différentes variables, et si la valeur donnée ne se trouve pas être une de celles que ce script peut traiter celui-ci s’interrompra sur une erreur explicite donnant la liste des valeurs acceptées. En programmant ces cas de gestion d’erreur, j’évite que le script continue son exécution et plante peut-être 100 ou 200 lignes plus tard avec une erreur cryptique qui ne pourra pas forcement être facilement liée aux valeurs erronées données en entrée.


Pour l’exemple du script discuté ici, je partirais sur un bloc similaire à celui-ci :

if [ "${DISPLAY_ERRORS}" == true ]; then action 1 elif [ "${DISPLAY_ERRORS}" == false ]; then action 2 else arrêt avec message d’erreur explicite fi

À la rigueur, si tu es sûr qu’il n’y a pas une autre possibilité.
Dans le cas où il y a plus de trois possibilités, je préfère l’emploi de “case”.

La programmation shell recèle bien des pièges. Contrairement d’autres langages de programmation comme le C, les variables d’environnement du shell ne sont pas “typées”, ce ne sont que des chaînes de caractères arbitraires utilisées dans des opérations de substitution. Si on veut utiliser une variable comme un booléen (tout ou rien, vrai ou faux, oui ou non, 0 ou 1), il est plus sûr de définir une valeur comme vraie et toutes les autres comme fausses (ou l’inverse). Ainsi toute valeur aura un sens bien défini. Si on définit une valeur pour vrai et une pour fausse, alors toutes les autres valeurs possibles auront un sens non défini et risquent d’être sources d’erreur.

Sûr !
Dans ce cas, ce que propose vv222 est valable :

else arrêt avec message d’erreur explicite
Genre de message à renvoyer :
«Pour les autres possibilités, prière de joindre le dev. à dev@trucmuche.com» en expliquant clairement votre cas. :wink:

Merci à vous ! :smiley: Je suis désolé du retard de ma réponse, merci de m’avoir aidé, je comprends mieux mon erreur à présent ! Ah oui, et tout fonctionne à merveille :wink: à bientôt ! :slightly_smiling: