2010-04-09 13 views
5

Bien, entonces estoy teniendo este problema. Escribo un script para ejecutar en cygwin en Windows. He intentado un montón de scripts de ejemplo básicos en caso de que fuera mi problema de scripts.Bash Shell; comando de lectura; usando Cygwin en Windows 7

Así que he intentado esto:

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

entonces voy a ejecutarlo y yo introduzca un nombre para var_name.

me sale esto:

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

Así que por lo que yo entiendo que estoy teniendo un problema con la lectura. Estoy tratando de trabajar en un proyecto para mi clase, pero parece que no puedo entender por qué no lo leerá. Seguí el libro sin ningún triunfo y luego recurrí a estos ejemplos en la web que tampoco me parecen bien. ¿Alguien tiene alguna idea de si es mi configuración o si me falta algo, gracias?

+0

Por lo que vale, su ejemplo funciona como está escrito en mis entornos Cygwin y Linux. Pruebe este ejemplo simple y vea si le funciona: 'lea NAME; echo $ NAME' – meagar

+0

Gracias. Fue un problema de editor. Estaba usando la edición y el guardado de Windows en lugar del editor vi, así que lo tengo funcionando ahora. Gracias por probarlo. – CrazyGrunt

Respuesta

9

que debe hacer un od -xcb en ese guión. Mi cálculo aproximado es que es casi seguro que tendrá el carácter de terminación de línea incorrecta.

La razón por la que sugiero esto se debe a la línea:

': not a valid identifierad: `var_name 

parece sospechosamente a las dos líneas:

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

fusionaron (donde los . caracteres indican algo que ha sido sobrescrito).

que sería el caso si la variable en esa línea era vun r_nunmede retorno de carro en lugar de la más normal var_name.

El hecho de que es Cygwin también apunta a la conclusión de que ya hay a menudo problemas cuando edite sus guiones con un editor dede Windows que utiliza CR/LF donde Cygwin espera simplemente LF.

Supongo que encontrará que al hacer un od -xcb en su secuencia de comandos real, muestra que tiene esas terminaciones de línea de Windows en una o más de sus líneas de secuencia de comandos.


De hecho, sólo probado este bajo Ubuntu poniendo un CTRL-M al final de sólo la línea read y la salida fue (ligeramente modificada para mostrar la 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: 

En otra palabras, muy similar a lo que está viendo.


En un aparte (ahora que tengo acceso a mi entorno Cygwin), lo que estamos viendo es la salida:

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

donde la segunda línea sobrescribe la primera, dando:

`: not a valid identifierad: `var_name 

En otras palabras, la palabra extraña identifierad se compone realmente de identifier y la final de ad:read:. La razón por la que es solo similar a mi ejemplo anterior (en oposición a la exacta) es porque su nombre de archivo y número de línea serán diferentes a mi pequeño script de prueba.

+4

Y puede solucionarlo usando [dos2unix] (http://www.linuxmanpages.com/man1/dos2unix.1.php). –

+0

O simplemente use vi, como $ {DEITY: -GreatGreenArkleseizure} previsto :-) – paxdiablo

+0

De acuerdo, lo reescribí usando el editor vi, funcionó como un amuleto. Muy feliz de superar ese obstáculo de frustración, jajaja. Muchas gracias. – CrazyGrunt

1

puede simplemente usar read para preguntar al usuario. No hay necesidad de la echo

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

Bien, lo intenté, en este punto, supongo que es un problema con la configuración que tengo. Recibo el mismo error que antes cuando uso esa línea junto con la salida como antes. Gracias por la rápida respuesta. – CrazyGrunt

Cuestiones relacionadas