2010-04-09 7 views
5

Okay, so ich dieses Problem habe. Ich schreibe ein Skript auf, das in Cygwin unter Windows ausgeführt werden soll. Ich habe einige grundlegende Beispielskripte ausprobiert, falls es mein Skriptproblem war.Schlag-Shell; Lesebefehl; mit Cygwin unter Windows 7

So habe ich versucht, dies:

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

Dann laufe ich es und ich geben Sie einen Namen für var_name.

ich dieses:

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

So so weit ich es verstehe ich habe ein Problem mit Lese-. Ich versuche, an einem Projekt für meine Klasse zu arbeiten, aber ich kann nicht scheinen, um herauszufinden, warum sie es nicht lesen. Ich folgte das Buch ohne Triumph dann auf diese Beispiele auf dem Netz zurückgegriffen, die für mich auch nicht zu funktionieren scheint. Hat jemand eine Idee, ob es mein Setup ist oder wenn mir etwas fehlt, danke.

+0

Für das, was es wert ist, funktioniert Ihr Beispiel wie in meinen Cygwin und Linux-Umgebungen geschrieben. Versuchen Sie dieses einfachste Beispiel und sehen Sie, ob es für Sie funktioniert: 'Lesen Sie NAME; echo $ NAME' – meagar

+0

Danke. Es war ein Editor-Problem. Ich habe Windows-Editing und -Speichern anstelle des VI-Editors verwendet, so dass ich jetzt arbeite. Danke fürs Testen. – CrazyGrunt

Antwort

9

Sie sollten an diesem Skript ein od -xcb tun. Mein guesstimate ist, dass es mit ziemlicher Sicherheit geht in die falsche Zeile in ihm hat Endzeichen.

Der Grund, warum ich dies vorschlagen, ist, weil die Zeile:

': not a valid identifierad: `var_name 

sieht verdächtig wie die beiden Linien:

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

verschmolzen zusammen (wo die . Zeichen zeigen etwas, das überschrieben worden ist).

Das ist der Fall, wenn Ihre Variable in dieser Zeile veinr wäre _neinmeWagenrücklauf- anstatt die normal war var_name.

Die Tatsache, dass es Cygwin verweist auch auf diesen Schluss da oft gibt es Probleme, wenn Sie Ihre Skripte mit einem Windows--Editor bearbeiten, die CR/LF-Anwendungen, bei denen Cygwin nur LF erwartet.

Ich vermute, Sie werden feststellen, dass eine od -xcb auf Ihrem tatsächlichen Skript zeigt, dass Sie diese Windows-Zeilenenden auf eine oder mehrere Ihrer Skriptzeilen haben.


In der Tat, ich dies unter Ubuntu nur getestet, indem ein CTRL-M am Ende nur die read Linie setzen und die Ausgabe wurde (leicht die CTRL-M zeigen modifiziert):

[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: 

In anderen Wörter, sehr ähnlich wie Sie sehen.


Als Neben (jetzt, dass ich Zugriff auf meine Cygwin-Umgebung haben), was Sie sehen, ist die Ausgabe:

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

wo die zweite Zeile der ersten überschreibt, geben:

`: not a valid identifierad: `var_name 

Mit anderen Worten, das seltsame Wort identifierad eigentlich aus identifier und den endgültigen ad: von read: gemacht. Der Grund, dass es nur meinem obigen Beispiel ähnlich ist (im Gegensatz zu genau) ist, weil Ihr Dateiname und Ihre Zeilennummer sich von meinem kleinen Testskript unterscheiden.

+4

Und Sie können es reparieren mit [dos2unix] (http://www.linuxmanpages.com/man1/dos2unix.1.php). –

+0

Oder einfach vi verwenden, da $ {DITY: -GreatGreenArkelseizure} gemeint ist :-) – paxdiablo

+0

Okay, ich habe es mit dem vi-Editor umgeschrieben, funktioniert wie ein Zauber. Ich bin so glücklich über diese Frustrationshürde zu kommen, lol. Vielen Dank. – CrazyGrunt

1

Sie können nur read verwenden Benutzer aufzufordern. Keine Notwendigkeit, die echo

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

Okay, ich habe das versucht, an dieser Stelle meine Vermutung ist, dass es ein Problem mit dem Setup ist, das ich habe. Ich bekomme den gleichen Fehler wie zuvor, wenn ich diese Zeile zusammen mit der Ausgabe wie zuvor verwende. Danke, für die schnelle Antwort. – CrazyGrunt

Verwandte Themen