Dlaczego to zawsze wykrywa jako prawdziwe, nawet jeśli kod klucza nie jest klawiszem ze strzałką w prawo?
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
źródło
źródło
Odpowiedzi:
Najprawdopodobniej przeczytałeś pierwszy z dwóch + bajtów.
$keycode
w twoim skrypcie będzie ESC po naciśnięciu klawisza strzałki.Klawisze strzałek mogą być:
Zawsze zwraca wartość true, ponieważ brakuje spacji w wyrażeniu warunkowym.
Edycja: aktualizacja tego oświadczenia.
Twój
if
działa na statusie wyjścia[
polecenia.[
Komenda jest równoważnatest
. Fakt, że jest to polecenie, jest bardzo ważnym faktem. Jako polecenie wymaga spacji między argumentami.[
Komenda jest dodatkowo specjalny w to, że wymagają]
jako ostatni argument.Polecenie kończy pracę ze statusem określonym przez WYRAŻENIE. 1 lub 0, prawda lub fałsz .
To nie jest egzotyczny sposób pisania nawiasów. Innymi słowy, nie jest to część
if
składni, jak na przykład w C:Przez:
wydajesz:
który rozwija się do
tutaj
\x1b=39
jest czytany jako jeden argument. Kiedy podanotest
lub[
podano jeden argument, kończy się ono na fałsz tylko wtedy, gdy EXPRESSION ma wartość null - co nigdy nie będzie. Nawet jeśli$keycode
byłby pusty, spowodowałoby to=39
(co nie jest zerowe / puste).Innym sposobem spojrzenia na to jest powiedzenie:
Przeczytaj te pytania i odpowiedzi, aby uzyskać więcej informacji - a także dyskusję na temat
[
vs[[
:W tym względzie można również zbadać tyknięcia `` vs
$( )
Wielobajtowa sekwencja ucieczki za pomocą klawiszy strzałek:
Jak wspomniano u góry: Najprawdopodobniej przeczytałeś pierwszy z dwóch + bajtów.
$keycode
w twoim skrypcie będzie ESC po naciśnięciu klawisza strzałki.Strzałki i inne specjalne klawisze powodują wysłanie sekwencji ucieczki do systemu. W ESC bajt sygnały, że „tutaj jest kilka bajtów, które powinny być interpretowane w różny sposób” . Co do klawiszy strzałek, które byłyby ASCII
[
następnie ASCIIA
,B
,C
lubD
.Innymi słowy, musisz parsować trzy bajty podczas obsługi klawiszy strzałek.
Możesz spróbować czegoś w tym kierunku, aby sprawdzić:
Wydajność:
Nie jestem pewien, jak przenośny, ale wcześniej bawiłem się takim kodem do łapania klawiszy strzałek. Naciśnij,
q
aby wyjść:(Jako drobna uwaga, również (zamierzasz) przetestować dziesiętnie 39 - co wygląda jak połączenie dziesiętnego i szesnastkowego. Pierwszy bajt w sekwencji specjalnej to wartość ASCII ESC , która jest dziesiętna 27 i szesnastkowa
0x1b
, podczas gdy dziesiętna 39 jest szesnastkowa0x27
. )źródło
=
znak w teście, więc jest on parsowany po prostu jako niepusty ciąg i dlatego jest prawdziwy. Fakt, że klawisze strzałek są wieloma bajtami, stanowi osobny problem.[
jest wbudowanym poleceniem, ludzie szybko rozumieją, dlaczego spacje są ważne. (To nie jest po prostu dziwny sposób bash używać nawiasów zamiast nawiasów.) Musisz teraz skończyć. Zaktualizuj raz.