2010-11-28 16 views
31
read -p "Please Enter a Message:" message 

¿Cómo puedo agregar un salto de línea después de Message:?¿Cómo agrego un salto de línea para leer el comando?

+0

Puede considerar actualizar la respuesta aceptada a [este] (http://stackoverflow.com/a/15696250/1048539) ya que es mucho menos hacky (y menos confuso para nosotros los futuros visitantes ...). – enderland

Respuesta

28

me gusta Huang F. Lei's answer, pero si no te gusta el salto de línea literal, esto funciona:

read -p "Please Enter a Message: `echo $'\n> '`" message 

Shows:

Please Enter a Message: 
> _

... donde _ es donde está el cursor termina. Tenga en cuenta que dado que las nuevas líneas finales generalmente se descartan durante la sustitución del comando, he incluido el > posteriormente. Pero, en realidad, no parece que su pregunta original a querer esa parte del sistema, por lo que:

# Get a carriage return into `cr` -- there *has* to be a better way to do this 
cr=`echo $'\n.'` 
cr=${cr%.} 

# Use it 
read -p "Please Enter a Message: $cr" message 

Muestra

Please Enter a Message: 
_

Tiene que haber una mejor manera, sin embargo.

+0

Espero que haya una mejor manera :) – Strawberry

+0

@Doug: Sí. Acaba de actualizarse con una * leve * mejora. Todavía no estoy contento con eso. :-) –

+0

@Doug: Aunque ahora lo pienso, dado que 'echo' (como' read') es un bash incorporado, aunque lo anterior es un poco incómodo, al menos no está generando procesos innecesariamente. –

2

Desde la página de manual bash:

-p prompt 
    Display prompt on standard error, without a trailing new- 
    line, before attempting to read any input. The prompt is 
    displayed only if input is coming from a terminal. 

Por lo tanto, no con read sí mismo, y poniendo \n en la cadena del mensaje simplemente se hace eco de \n. La respuesta debe ser simple, aunque - no reciben read para mostrar la línea:.

echo "Please Enter a Message:" 1>&2 
read message 
+0

Pero el 'echo' ocurrirá ya sea que la entrada provenga de un terminal o no; el mensaje 'leer' no lo mostrará. –

+0

punto justo, _if_ el script se usará de forma no interactiva. – Alnitak

+1

Además, tendría que redireccionar el eco al flujo de errores. – Strawberry

9
$ read -p "Please Enter a Message: 
> " message 
Please Enter a Message: 

Pulsar un "salto de línea" entre ':' y '"' directamente

+1

solución limpia, pero podría confundir a alguien que lea el código más tarde. – Alnitak

+1

Funciona, pero es realmente una solución de ghetto. +1 independientemente – Strawberry

+1

Es lo que funciona para mí, porque también tengo una variable, y con la solución 'read -p '$ (echo -e' Please Enter a Message: \ n \ b ')" message', imprime el nombre de la variable literalmente . Esta solución se expande adecuadamente. – aliteralmind

-2

read -p "Please Enter a Message:Volver" message

+0

No funciona para mí con bash en Ubuntu 10.04. ¿Estás seguro de tu sintaxis allí? –

+0

¿Quizás quiere presionar la tecla de retorno como la solución de Huang F. Lei? –

+0

@LucaBorrione: sí –

5

sólo para mejorar las respuestas de Huang F. Lei y de T.J. Crowder que me gusta (1) y ha añadido .. Puede utilizar una de las siguientes sintaxis también, que básicamente son los mismos, depende de su gusto (yo prefiero el primero):

read -p "$(echo -e 'Please Enter a Message: \n\b')" message 
read -p "`echo -e 'Please Enter a Message: \n\b'`" message 

que tanto producirá la siguiente salida:

Please Enter a Message: 
_ 

donde _ es el cursor.
En caso de necesitar una nueva línea en cualquier parte de la cadena, pero al final, puede utilizar \n, por ejemplo

read -p "`echo -e '\nPlease Enter\na Message: '`" message 

producirá

. 
Please Enter 
a Message: _ 

dónde. es una primera línea nueva en blanco y _ es el cursor.

Sólo para añadir un salto de línea final final que se tiene que utilizar \n\b como en mi primer ejemplo

41

Sólo en busca de exactamente la misma cosa.Se puede utilizar:

# -r and -e options are unrelated to the answer. 
read -rep $'Please Enter a Message:\n' message 

y funcionará exactamente como se preguntó:

Please enter a Message: 
_ 

Aquí es un extracto de la página de manual de bash explicarla:

palabras de la forma $ 'cadena 'son tratados especialmente. La palabra se expande a cadena, con caracteres de escama invertida reemplazados como se especifica en el estándar ANSI C . secuencias de escape de barra invertida, si está presente, se decodifican como sigue:

  • (...)
  • \ n nueva línea
  • (...)

El resultado expandido es único -citado, como si el signo de dólar no hubiera estado presente en .

Me tomó un tiempo averiguarlo.

Tenga en cuenta que las comillas simples y comillas dobles se comportan de manera diferente en este sentido:

Una cadena entre comillas dobles precedida por un signo de dólar ($) hará que la cadena a traducir de acuerdo a la localización actual. Si la configuración de alquiler cur- es C o POSIX, se ignora el signo de dólar. Si la cadena se traduce y reemplaza, el reemplazo se cotiza en doble.

+0

@ t-j-crowder Esta es una mejor manera, la que [T.J. Crowder] (http://stackoverflow.com/users/157247/t-j-crowder) estaba insinuando :) – dmitri

+0

Me gusta esto. gracias por mejorar mi conocimiento –

+0

¿Qué hace '-e' exactamente? funciona conmigo sin que '-e',' -e' cause solo para mí que '-s' ya no funciona. –

1

Aquí hay una mejora en la respuesta aceptada que no requiere el desove un subnivel:

read -p "Please Enter a Message:"$'\n' message 

Desde el GNU Bash reference manual:

palabras de la forma $'string' se tratan de forma especial. La palabra se expande a cadena, con los caracteres escapados de barra invertida sustituidos según lo especificado por el estándar ANSI C.

Cuestiones relacionadas