cygwin bash - si l'instruction ne fonctionne pas

0

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...fiinstructions, 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 iftout.

Peut-être que j'ai mal configuré cygwin?

Cappielung
la source
Peut-être qu'il manque un point-virgule? Essayez "si [...]; alors". Notez le point-virgule après les crochets.
Jehad
Aussi, je sais que le point-virgule multi-déclarations est juste stylistique, mais peut-être que quelque chose dans la version de cygwin en a besoin!? Je ne sais pas, pas vraiment un gars sous Windows. :)
Jehad

Réponses:

0

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 echocommandes sont exécutées et non if...fi, mais lorsque j'ai commuté mes fins de ligne sur LF, tout a fonctionné comme prévu.

Cappielung
la source
Le script avait l'air OK, et lors de la copie et du collage dans Ubuntu, il fonctionnait bien 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 les if, thenet les filignes, toutes les echocommandes a fonctionné comme prévu. Vous avez soulevé un problème intéressant et j'examinerai davantage, mais pas ce soir.
AFH
1
Je pense avoir bien compris: le CR n'est apparemment pas traité comme un espace blanc, mais comme un caractère de texte. L'ajout de CR aux #lignes n'affecte pas le fait qu'elles soient des lignes de commentaire, tandis que les echolignes avec des CR finaux sont toujours une syntaxe valide, les CR finaux faisant partie du texte à afficher. Les ifet [sont correctement analysée, mais ], thenet fine sont pas, à cause du CR en annexe, et la fin du fichier est rencontrée avant la fin de la ifsyntaxe est terminée.
AFH le
0

Cela fonctionne pour moi, mais si je modifie la terminaison de ligne en style DOS (terminaison de ligne CR / LF)

$ u2d ./prova.sh
unix2dos: converting file ./prova.sh to DOS format...

$ ./prova.sh
Hello
./prova.sh: line 10: syntax error: unexpected end of file

alors convertissez votre script en style unix (LF comme fin de ligne)

$ d2u ./prova.sh
dos2unix: converting file ./prova.sh to Unix format...
$ ./prova.sh
Hello
Success
Hello Again
matzeri
la source