Pourquoi est-ce toujours détecté comme vrai, même si le code de touche n'est pas la touche flèche droite?
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
ConfusedStack
la source
la source
Réponses:
Vous (probablement) lisez d'abord deux octets +.
$keycode
dans votre script serait ESC lorsque vous appuyez sur la touche fléchée.Les touches fléchées peuvent être:
Il prend toujours la valeur true en raison des espaces manquants dans l'expression conditionnelle.
Edit: une mise à jour sur cette déclaration.
Votre
if
fonctionne sur l'état de sortie de la[
commande. La[
commande est équivalente àtest
. Le fait qu'il s'agisse d'une commande est un fait très important. En tant que commande, elle nécessite des espaces entre les arguments. La[
commande est en outre spéciale en ce qu'elle requiert]
comme dernier argument.La commande se termine avec le statut déterminé par EXPRESSION. 1 ou 0, vrai ou faux .
Ce n'est pas une façon exotique d'écrire des parenthèses. En d'autres termes, il ne fait pas partie de la
if
syntaxe comme par exemple en C:Par:
vous émettez:
qui s'étend à
ici
\x1b=39
est lu comme un argument. Lorsquetest
ou[
reçoit un argument, il ne se termine avec false que si EXPRESSION est null - ce qui ne le sera jamais. Même s'il$keycode
était vide, il en résulterait=39
(qui n'est pas nul / vide).Une autre façon de voir les choses est de dire:
Lisez ces questions et réponses pour plus de détails - ainsi que la discussion sur
[
vs[[
:À cet égard, vous pouvez également rechercher des tiques arrière `` vs
$( )
Séquence d'échappement multi-octets avec touches fléchées:
Comme mentionné en haut: vous lisez (probablement) le premier sur deux octets +.
$keycode
dans votre script serait ESC lorsque vous appuyez sur la touche fléchée.Les flèches et autres touches spéciales entraînent l' envoi de séquences d'échappement au système. L' octet ESC signale que "voici quelques octets qui doivent être interprétés différemment" . En ce qui concerne les touches fléchées qui seraient ASCII
[
suivie par ASCIIA
,B
,C
ouD
.En d'autres termes, vous devez analyser trois octets lorsque vous utilisez les touches fléchées.
Vous pouvez essayer quelque chose dans ce sens pour vérifier:
Rendement:
Je ne sais pas à quel point c'est portable, mais j'ai déjà joué avec du code comme celui-ci pour attraper les touches fléchées. Appuyez
q
pour quitter:(En tant que note mineure, vous avez également (l'intention de) tester la décimale 39 - qui ressemble à un mélange entre décimal et hexadécimal. Le premier octet d'une séquence d'échappement est la valeur ASCII ESC , qui est décimal 27 et hexadécimal
0x1b
, tandis que la décimale 39 est hexadécimal0x27
. )la source
=
signe dans le test, il est donc analysé simplement comme une chaîne non vide et est donc vrai. Le fait que les touches fléchées comportent plusieurs octets est un problème distinct.[
est une commande intégrée, les gens comprennent plus rapidement pourquoi les espaces sont importants. (Ce n'est pas simplement une façon bizarre de bash d'utiliser des crochets au lieu de parenthèses.) Faut épuiser maintenant. Mettre à jour une fois de retour.