Je suis novice en script bash et j'essaie d'apprendre sous Windows. J'ai donc téléchargé cygwin. Sous Windows 10, cygwin v2.5.1
Je me suis assuré d'avoir installé le paquet bash (c'est ce que j'ai fait) et j'ai donc commencé à suivre quelques tutoriels, mais lorsque j'ai atteint les if...fi
instructions, cela a cessé de fonctionner. Voici mon code:
#!/usr/bin/env bash
#
echo 'Hello'
#
if [ 1 -eq 1 ]
then
echo 'Success'
fi
echo 'Hello Again'
La sortie est
>./test.sh
Hello
./test.sh: line 10: syntax error: unexpected end of file
Je n'arrive pas à comprendre ce qui ne va pas. J'ai copié / collé des instructions et essayé différents types d'expressions, mais cela ne semble pas enregistrer du if
tout.
Peut-être que j'ai mal configuré cygwin?
Réponses:
Eh bien ... je me sens bête. Mais je répondrai à cette question pour quiconque ayant le même problème.
Depuis que je développe sur un ordinateur Windows, il utilise des fins de ligne CRLF. J'utilise Sublime Text et je ne pense jamais aux fins de ligne, car je développe toujours pour Windows.
Mais, bien sûr, les scripts bash doivent utiliser des fins de ligne LF, sinon il se passera des choses étranges. Je ne saurais dire pourquoi les
echo
commandes sont exécutées et nonif...fi
, mais lorsque j'ai commuté mes fins de ligne sur LF, tout a fonctionné comme prévu.la source
bash
. Je n'avais jamais remarqué de problème avec les nouvelles lignes CR / LF, car les CR superflus devraient être traités comme des espaces, mais lorsque j'ai ajouté les CR à votre script collé, la même erreur s'est produite. Pourtant, quand je commentais lesif
,then
et lesfi
lignes, toutes lesecho
commandes a fonctionné comme prévu. Vous avez soulevé un problème intéressant et j'examinerai davantage, mais pas ce soir.#
lignes n'affecte pas le fait qu'elles soient des lignes de commentaire, tandis que lesecho
lignes avec des CR finaux sont toujours une syntaxe valide, les CR finaux faisant partie du texte à afficher. Lesif
et[
sont correctement analysée, mais]
,then
etfi
ne sont pas, à cause du CR en annexe, et la fin du fichier est rencontrée avant la fin de laif
syntaxe est terminée.Cela fonctionne pour moi, mais si je modifie la terminaison de ligne en style DOS (terminaison de ligne CR / LF)
alors convertissez votre script en style unix (LF comme fin de ligne)
la source