2012-03-15 19 views
24

Siguiendo el guión que estoy cumpliendoShell Script, leer en la misma línea tras hacerse eco de un mensaje

#!/bin/sh 

echo "Enter [y/n] : " 
read opt 

Su salida es

Enter [y/n] : 
Y 

Quiero que la variable debe leerse en el mismo línea como a continuación

Enter [y/n] : Y 

Debería ser simple, supongo, pero soy nuevo en bash scripting.

+0

@Aaron Gracias para formatear la enviar. Fue mi primer mensaje. Me aseguraré de que mis otras publicaciones estén bien formateadas. – user1263746

+0

De nada :-) –

Respuesta

26

El tinglado #!/bin/sh significa que estás escribiendo código, ya sea para el shell Bourne histórica (que todavía se encuentran en algunos sistemas como Solaris creo), o más probablemente, el lenguaje estándar de shell como se define por POSIX Esto significa que read -p y echo -n son poco confiables.

La solución estándar/portable es:

printf 'Enter [y/n] : ' 
read -r opt 

(El -r impide que el tratamiento especial de \, ya read acepta normalmente que como una continuación de línea cuando está al final de una línea.)

Si sabe que su script se ejecutará en sistemas que tienen Bash, puede cambiar el shebang a #!/bin/bash (o #!/usr/bin/env bash) y usar todas las características de lujo de Bash. (Muchos sistemas han /bin/sh enlace simbólico a bash por lo que funciona en ambos sentidos, pero confiando en que es una mala práctica, y bash realidad deshabilita algunas de sus propias características cuando se ejecuta bajo el nombre sh.)

+1

Esa es una gran y muy clara explicación. Estoy en RHEL 5.5 por cierto. – user1263746

29

Solución: read -p "Enter [y/n] : " opt

De help read:

-p prompt output the string PROMPT without a trailing newline before 
     attempting to read 
+0

Funciona a la perfección. Gracias por la explicación sobre el modificador -p. – user1263746

6
echo -n "Enter [y/n] : " ; read opt 

O! (Más tarde es mejor)

read -p "[y/n]: " opt 
+0

Funciona muy bien, ¡Gracias! – user1263746

Cuestiones relacionadas