Warum wird dies immer als wahr erkannt, auch wenn der Schlüsselcode nicht die rechte Pfeiltaste ist?
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
quelle
quelle
Antworten:
Sie lesen (wahrscheinlich) zuerst aus zwei + Bytes.
$keycode
In Ihrem Skript wäre ESC, wenn die Pfeiltaste gedrückt wird.Pfeiltasten können sein:
Es wird immer als wahr ausgewertet, da Leerzeichen im bedingten Ausdruck fehlen.
Bearbeiten: eine Aktualisierung dieser Anweisung.
Sie
if
bearbeiten den Exit-Status des[
Befehls. Der[
Befehl entsprichttest
. Die Tatsache, dass es sich um einen Befehl handelt, ist eine sehr wichtige Tatsache. Als Befehl sind Leerzeichen zwischen Argumenten erforderlich. Der[
Befehl ist insofern etwas Besonderes, als er]
als letztes Argument benötigt wird.Der Befehl wird mit dem durch EXPRESSION festgelegten Status beendet. 1 oder 0, wahr oder falsch .
Es ist keine exotische Art, Klammern zu schreiben. Mit anderen Worten, es ist nicht Teil der
if
Syntax wie zum Beispiel in C:Durch:
Sie geben aus:
das erweitert sich zu
Hier
\x1b=39
wird als ein Argument gelesen . Wenntest
oder[
wenn ein Argument angegeben wird, wird es nur dann mit false beendet , wenn EXPRESSION null ist - was niemals der Fall sein wird. Selbst wenn$keycode
es leer wäre, würde es dazu führen=39
(was nicht null / leer ist).Eine andere Sichtweise ist, dass Sie sagen:
Lesen Sie diese Fragen und Antworten für weitere Details - sowie eine Diskussion über
[
vs[[
:In dieser Hinsicht könnten Sie auch Zecken `` vs.
$( )
Multibyte-Escape-Sequenz mit Pfeiltasten:
Wie oben erwähnt: Sie lesen (wahrscheinlich) zuerst aus zwei + Bytes.
$keycode
In Ihrem Skript wäre ESC, wenn die Pfeiltaste gedrückt wird.Pfeil und andere Sonderschlüssel führen dazu, dass Escape-Sequenzen an das System gesendet werden. Das ESC- Byte signalisiert, dass "hier einige Bytes kommen, die anders interpretiert werden sollten" . Wie für den Pfeiltasten , die die ASCII sein würde ,
[
gefolgt von ASCIIA
,B
,C
oderD
.Mit anderen Worten, Sie müssen drei Bytes analysieren, wenn Sie mit Pfeiltasten arbeiten.
Sie könnten etwas in diese Richtung versuchen, um zu überprüfen:
Ausbeute:
Ich bin mir nicht sicher, wie portabel dies ist, habe aber früher mit Code wie diesem herumgespielt, um Pfeiltasten zu fangen. Drücken Sie
q
zum Beenden:(Als kleine Anmerkung (beabsichtigen Sie auch), gegen Dezimal 39 zu testen - was wie eine Verwechslung zwischen Dezimal und Hexadezimal aussieht. Das erste Byte in einer Escape-Sequenz ist der ASCII-Wert ESC , der Dezimal 27 und Hexadezimal ist
0x1b
, während Dezimal 39 Hexadezimal ist0x27
. )quelle
=
Zeichen im Test nicht durch Leerzeichen umgeben ist. Daher wird es einfach als nicht leere Zeichenfolge analysiert und ist daher wahr. Die Tatsache, dass Pfeiltasten mehrere Bytes sind, ist ein separates Problem.[
ein eingebauter Befehl ist, schneller verstehen , warum Räume wichtig sind. (Es ist nicht einfach eine seltsame Art, Klammern anstelle von Klammern zu verwenden.) Sie müssen jetzt ausgehen. Einmal zurück aktualisieren.