2010-04-09 8 views
5

Bon, j'ai ce problème. J'écris un script à exécuter dans cygwin sur Windows. J'ai essayé un tas de scripts d'exemple de base au cas où c'était mon problème de scripts.Bash Shell; lire la commande; en utilisant Cygwin sur Windows 7

J'ai donc essayé ceci:

#!/bin/bash 
echo -e "Enter your name and press [ENTER]: \c" 
read var_name 
echo "Your name is: $var_name" 

Alors je vais courir et j'entrez un nom pour var_name.

Je reçois ceci:

$ ./project1.sh 
Enter your name and press [ENTER]: Jake 
': not a valid identifierad: `var_name 
Your name is: 

Pour autant que je le comprends, je suis un problème avec lecture. J'essaie de travailler sur un projet pour ma classe, mais je n'arrive pas à comprendre pourquoi il ne le lira pas. J'ai suivi le livre sans triomphe puis ai recouru à ces exemples sur le web qui ne semblent pas fonctionner pour moi non plus. Est-ce que quelqu'un a une idée si c'est ma configuration ou si quelque chose me manque, merci.

+0

Pour ce que ça vaut, votre exemple fonctionne comme écrit dans mes deux environnements Cygwin et Linux. Essayez cet exemple le plus simple et voyez si cela fonctionne pour vous: 'lisez NAME; echo $ NAME' – meagar

+0

Merci. C'était un problème d'éditeur. J'utilisais Windows en éditant et en sauvegardant plutôt que l'éditeur vi, donc je l'ai fonctionné maintenant. Merci de l'avoir testé. – CrazyGrunt

Répondre

9

Vous devriez faire une od -xcb sur ce script. Mon estimation est que ça va certainement avoir le mauvais caractère de fin de ligne dedans.

La raison pour laquelle je suggère cela est parce que la ligne:

': not a valid identifierad: `var_name 

ressemble étrangement les deux lignes:

.........................ad: `var_name 
': not a valid identifier 

fusionné ensemble (où les . caractères indiquent quelque chose qui a été écrasé).

Ce serait le cas si votre variable dans cette ligne était vunr_nunmeretour chariot plutôt que plus normale var_name. Le fait que ce soit Cygwin pointe également vers cette conclusion car il y a souvent des problèmes quand vous éditez vos scripts avec un éditeur Windows qui utilise CR/LF où Cygwin attend juste LF.

Je suppose que vous constaterez que faire un od -xcb sur votre script actuel montre que vous avez ces fins de ligne Windows sur une ou plusieurs de vos lignes de script.


En fait, je viens de tester cette sous Ubuntu en mettant un CTRL-M à la fin de juste la ligne read et la sortie a été (légèrement modifié pour afficher le CTRL-M):

[email protected]:~$ od -xcb qq.sh ; ./qq.sh 

0000000 2123 622f 6e69 622f 7361 0a68 6365 6f68 
      # ! / b i n / b a s h \n e c h o 
     043 041 057 142 151 156 057 142 141 163 150 012 145 143 150 157 
0000020 2d20 2065 4522 746e 7265 7920 756f 2072 
       - e  " E n t e r  y o u r  
     040 055 145 040 042 105 156 164 145 162 040 171 157 165 162 040 
0000040 616e 656d 6120 646e 7020 6572 7373 5b20 
      n a m e  a n d  p r e s s  [ 
     156 141 155 145 040 141 156 144 040 160 162 145 163 163 040 133 
0000060 4e45 4554 5d52 203a 635c 2022 720a 6165 
      E N T E R ] :  \ c "  \n r e a 
     105 116 124 105 122 135 072 040 134 143 042 040 012 162 145 141 
0000100 2064 6176 5f72 616e 656d 0a0d 6365 6f68 
      d  v a r _ n a m e \r \n e c h o 
               ^^ 

     144 040 166 141 162 137 156 141 155 145 015 012 145 143 150 157 
0000120 2220 6f59 7275 6e20 6d61 2065 7369 203a 
       " Y o u r  n a m e  i s :  
     040 042 131 157 165 162 040 156 141 155 145 040 151 163 072 040 
0000140 7624 7261 6e5f 6d61 2265 0a0a 
      $ v a r _ n a m e " \n \n 
     044 166 141 162 137 156 141 155 145 042 012 012 
0000154 

Enter your name and press [ENTER]: Pax 
': not a valid identifierar_name 
Your name is: 

Dans d'autres mots, très similaire à ce que vous voyez.


En aparté (maintenant que j'ai accès à mon environnement Cygwin), ce que vous voyez est la sortie:

abcdefghij.sh: line 99 read: `var_name 
`: not a valid identifier 

où la deuxième ligne écrasez la première, ce qui donne:

`: not a valid identifierad: `var_name 

En d'autres termes, le mot étrange identifierad est en réalité composé de identifier et la ad: finale de read:. La raison pour laquelle il est seulement semblable à mon exemple ci-dessus (par opposition à exact) est parce que votre nom de fichier et numéro de ligne sera différent de mon petit script de test.

+4

Et vous pouvez le réparer en utilisant [dos2unix] (http://www.linuxmanpages.com/man1/dos2unix.1.php). –

+0

Ou simplement utiliser vi, comme $ {DEITY: -GreatGreenArkleseizure} destiné :-) – paxdiablo

+0

Ok, je l'ai réécrit en utilisant l'éditeur vi, travaillé comme un charme. Donc heureux de surmonter cet obstacle de frustration, lol. Merci beaucoup. – CrazyGrunt

1

vous pouvez simplement utiliser read pour inviter l'utilisateur. Pas besoin du echo

read -r -p "Enter your name and press: " var_name 
+0

Okay J'ai essayé, à ce stade, je suppose que c'est un problème avec la configuration que j'ai. Je reçois la même erreur qu'auparavant lorsque j'utilise cette ligne avec la sortie comme avant. Merci pour votre réponse rapide. – CrazyGrunt