2010-04-09 5 views
5

Ok, quindi ho riscontrato questo problema. Scrivo uno script da eseguire in cygwin su Windows. Ho provato un sacco di script di esempio di base nel caso in cui fosse il mio problema di script.Bash Shell; comando di lettura; utilizzando Cygwin su Windows 7

Così ho provato questo:

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

Poi correrò e mi inserire un nome per nome_var.

ottengo questo:

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

Quindi, per quanto ho capito io sto avendo un problema con la lettura. Sto cercando di lavorare su un progetto per la mia classe, ma non riesco a capire perché non lo leggerà. Ho seguito il libro senza trionfare, quindi ho fatto ricorso a questi esempi sul web che non sembrano funzionare neanche per me. Qualcuno ha qualche idea se è il mio setup o se mi manca qualcosa, grazie.

+0

Per quello che vale, il tuo esempio funziona come scritto in entrambi i miei ambienti Cygwin e Linux. Prova questo esempio più semplice e vedi se funziona per te: 'leggi NAME; echo $ NAME' – meagar

+0

Grazie. Era un problema di editor. Stavo usando l'editing di Windows e il salvataggio piuttosto che l'editor vi, quindi ora funziona. Grazie per provarlo però. – CrazyGrunt

risposta

9

si dovrebbe fare un od -xcb su quello script. La mia ipotesi è che quasi sicuramente avrà il carattere di fine riga sbagliato.

La ragione per cui vi suggerisco questo è perché la linea:

': not a valid identifierad: `var_name 

guarda con sospetto, come le due linee:

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

fuse insieme (dove i . caratteri indicano qualcosa che è stato sovrascritto).

Questo sarebbe il caso se la variabile in quella linea era vunr_nunmeritorno a capo piuttosto che il più normale var_name.

Il fatto che è Cygwin anche punti a questa conclusione in quanto c'è spesso problemi quando si modifica i propri script con un editor didi Windows che usa CR/LF in cui Cygwin si aspetta solo LF.

Ho il sospetto che scoprirete che facendo uno od -xcb sul vostro script effettivo si mostri che avete terminazioni di linea di Windows su una o più delle vostre linee di script.


Infatti, ho appena testato questo sotto Ubuntu mettendo un CTRL-M alla fine solo la linea read e l'uscita stato (leggermente modificato che mostra l'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: 

Nell'altra parole, molto simile a quello che stai vedendo.


Per inciso (ora che ho l'accesso al mio ambiente Cygwin), quello che stai vedendo è l'uscita:

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

dove la seconda linea sovrascrive la prima, dando:

`: not a valid identifierad: `var_name 

In altre parole, la strana parola identifierad è in realtà composto da identifier e la finale ad: da read:. Il motivo per cui è solo simile al mio esempio sopra (al contrario di esatto) è perché il nome del file e il numero di riga saranno diversi dal mio piccolo script di test.

+4

E puoi aggiustarlo usando [dos2unix] (http://www.linuxmanpages.com/man1/dos2unix.1.php). –

+0

O semplicemente usa vi, come $ {DEITY: -GreatGreenArkleseizure} inteso :-) – paxdiablo

+0

Ok, l'ho riscritto usando l'editor vi, ha funzionato come un incantesimo. Così felice di superare questo ostacolo della frustrazione, lol. Grazie mille. – CrazyGrunt

1

è sufficiente utilizzare read per richiedere all'utente. Non c'è bisogno del echo

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

Okay, ci ho provato, a questo punto credo sia un problema con il setup che ho. Ottengo lo stesso errore di prima quando uso quella linea insieme all'output di prima. Grazie per la pronta risposta. – CrazyGrunt