¿Por qué esto siempre se detecta como verdadero, incluso si el código clave no es la tecla de flecha derecha?
stty_state=`stty -g`
stty raw; stty -echo
keycode=`dd bs=1 count=1 2>/dev/null`
stty "$stty_state"
echo $keycode
if [ "$keycode"=39 ]; then
echo "Right Arrow Key Pressed!"
fi
bash
shell-script
Confundido
fuente
fuente
Respuestas:
Usted (probablemente) lea primero de dos + bytes.
$keycode
en su script sería ESC cuando se presiona la tecla de flecha.Las teclas de flecha pueden ser:
Siempre se evalúa como verdadero debido a la falta de espacios en la expresión condicional.
Editar: una actualización de esa declaración.
Su
if
opera en el estado de salida del[
comando. El[
comando es equivalente atest
. El hecho de que sea un comando es un hecho muy importante. Como comando requiere espacios entre argumentos. El[
comando es más especial porque requiere]
como último argumento.El comando sale con el estado determinado por EXPRESSION. 1 o 0, verdadero o falso .
Es no una manera exótica de paréntesis escritura. En otras palabras, es no parte de la
if
sintaxis como por ejemplo en C:Por:
usted emite:
que se expande a
Aquí
\x1b=39
se lee como un argumento. Cuandotest
o[
se le da un argumento, sale con falso solo si EXPRESSION es nulo, lo cual nunca será. Incluso si$keycode
estuviera vacío, resultaría en=39
(que no es nulo / vacío).Otra forma de verlo es que dices:
Lea estas preguntas y respuestas para obtener más detalles, así como una discusión sobre
[
vs[[
:En ese sentido, también podría investigar las garrapatas `` vs
$( )
Secuencia de escape multibyte con teclas de flecha:
Como se mencionó en la parte superior: (probablemente) lea primero de dos + bytes.
$keycode
en su script sería ESC cuando se presiona la tecla de flecha.Las flechas y otras teclas especiales dan como resultado que se envíen secuencias de escape al sistema. El byte ESC indica que "aquí vienen algunos bytes que deberían interpretarse de manera diferente" . En cuanto a las flechas que sería el ASCII
[
seguido de ASCIIA
,B
,C
oD
.En otras palabras, debe analizar tres bytes cuando se trata de teclas de flecha.
Puede probar algo en la dirección de esto para verificar:
Rendimiento:
No estoy seguro de qué tan portátil es esto, pero anteriormente he jugado con un código como este para atrapar las teclas de flecha. Presione
q
para salir:(Como nota menor, también (tiene la intención de) probar contra el decimal 39, que parece una mezcla entre decimal y hexadecimal. El primer byte en una secuencia de escape es el valor ASCII ESC , que es decimal 27 y hexadecimal
0x1b
, mientras que el decimal 39 es hexadecimal0x27
. )fuente
=
signo en la prueba, por lo que se analiza simplemente como una cadena no vacía y, por lo tanto, es cierto. El hecho de que las teclas de flecha sean de varios bytes es un problema separado.[
es un comando incorporado, la gente comprende por qué los espacios son importantes mucho más rápidamente. (No es simplemente una forma extraña de golpear con corchetes en lugar de paréntesis). Hay que salir corriendo ahora. Actualizar una vez de vuelta.