2010-04-10 18 views
12

Necesito comparar mi entrada con Introduzca/Volver clave ...de Bash Scripting - clave volver/Enter

read -n1 key 
if [ $key == "\n" ] 
    echo "@@@" 
fi 

Pero esto no está funcionando .. Lo que está mal con este código

+1

Falta "entonces" en la línea entre "si" y "eco". No es el único problema, pero uno – Phil

Respuesta

28

Varios problemas con el código publicado. Los comentarios en línea detalle qué se debe corregir:

#!/bin/bash 
# ^^ Bash, not sh, must be used for read options 

read -s -n 1 key # -s: do not echo input character. -n 1: read only 1 character (separate with space) 

# double brackets to test, single equals sign, empty string for just 'enter' in this case... 
# if [[ ... ]] is followed by semicolon and 'then' keyword 
if [[ $key = "" ]]; then 
    echo 'You pressed enter!' 
else 
    echo "You pressed '$key'" 
fi 
4

read lee una línea desde la entrada estándar, hasta pero sin incluir la nueva línea al final de la línea. -n especifica el número máximo de caracteres, forzando read a regresar temprano si alcanza esa cantidad de caracteres. Sin embargo, aún finalizará antes, cuando se presione la tecla Volver. En este caso, devuelve una cadena vacía: todo hasta la clave Devolver pero sin incluirla.

Tiene que comparar con la cadena vacía para saber si el usuario presiona de inmediato Devuelve.

read -n1 KEY 
if [[ "$KEY" == "" ]] 
then 
    echo "@@@"; 
fi 
1

También es buena idea para definir IFS $ vacías (separador de campo interno) antes de hacer comparaciones, porque de lo contrario puede terminar con "" y "\ n" en igualdad de condiciones.

Así que el código debería tener este aspecto:

# for distinguishing " ", "\t" from "\n" 
IFS= 

read -n 1 key 
if [ "$key" = "" ]; then 
    echo "This was really Enter, not space, tab or something else" 
fi 
+0

#esto no funciona para mí si se usa la operación de impresión en bucle IFS = echo -e "Presione [ENTER] para la configuración del teclado." para ((i = 10; i> 0; i--)); do printf "\ rInicio en $ i segundos ..." lea -n 1 -t 1 clave if ["$ key" = $ '\ e']; entonces echo "Este es ESC" ruptura elif [ "$ tecla" == ""]; a continuación, echo -e "se pulsa el espacio \ n" ruptura fi hecho –

+0

tal vez la cosa es que la sintaxis de línea deberías usar IFS =; echo ... (con punto y coma) – tsds

0

estoy añadiendo a continuación código sólo para referencia si alguien va a querer utilizar dicha solución que contiene bucle de cuenta atrás.

IFS='' 
echo -e "Press [ENTER] to start Configuration..." 
for ((i=10; i>0; i--)); do 

printf "\rStarting in $i seconds..." 
read -s -N 1 -t 1 key 

if [ "$key" = $'\e' ]; then 
     echo -e "\n [ESC] Pressed" 
     break 
elif [ "$key" == $'\x0a' ] ;then 
     echo -e "\n [Enter] Pressed" 
     break 
fi 

done 
Cuestiones relacionadas