Почему это всегда определяется как истина, даже если код клавиши не является клавишей со стрелкой вправо?
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
источник
источник
Ответы:
Вы (вероятно) читаете сначала из двух + байтов.
$keycode
в вашем скрипте будет ESC при нажатии клавиши со стрелкой.Клавиши со стрелками могут быть:
Он всегда оценивается как true из-за отсутствия пробелов в условном выражении.
Изменить: обновление этого заявления.
Ваш
if
действует на выходе из[
команды. Команда[
эквивалентнаtest
. Тот факт, что это команда, является очень важным фактом. В качестве команды требуются пробелы между аргументами. Кроме того,[
команда особенная, поскольку она требует]
последнего аргумента.Команда выходит со статусом, определенным EXPRESSION. 1 или 0, правда или ложь .
Это не экзотический способ написать круглые скобки. Другими словами, он не является частью
if
синтаксиса, как, например, в C:По:
вы выпускаете:
который расширяется до
здесь
\x1b=39
читается как один аргумент. Когдаtest
или[
дается один аргумент, он завершается со значением false, только если EXPRESSION имеет значение null, чего никогда не будет. Даже если бы он$keycode
был пустым, это привело бы к=39
(который не является нулевым / пустым).Другой способ взглянуть на это так: вы говорите:
Прочитайте эти вопросы и ответы для получения более подробной информации - а также обсуждение
[
vs[[
:В связи с этим вы также можете исследовать тики назад `` против
$( )
Многобайтовая escape-последовательность с клавишами со стрелками:
Как упомянуто сверху: вы (вероятно) читаете сначала из двух + байтов.
$keycode
в вашем скрипте будет ESC при нажатии клавиши со стрелкой.Стрелка и другие специальные клавиши приводят к тому, что в систему отправляются escape-последовательности . В ESC байтовые сигналы , которые «здесь приходит несколько байтов , которые должны быть истолкованы по- разному» . Что касается клавиш со стрелками , которые будут ASCII -
[
следуют ASCIIA
,B
,C
илиD
.Другими словами, вы должны анализировать три байта при работе с клавишами со стрелками.
Вы можете попробовать что-то в этом направлении, чтобы проверить:
Уступать:
Не уверен, насколько это переносимо, но раньше играл с таким кодом для ловли клавиш со стрелками. Нажмите,
q
чтобы выйти:(Как второстепенное примечание вы также (намереваетесь) проверить десятичную 39 - которая выглядит как смешивание десятичной и шестнадцатеричной. Первый байт в escape-последовательности - это значение ASCII ESC , которое является десятичным 27 и шестнадцатеричным
0x1b
, а десятичное 39 - шестнадцатеричным0x27
. )источник
=
в тесте нет пробелов, окружающих знак, поэтому он анализируется просто как непустая строка и, следовательно, имеет значение true. Тот факт, что клавиши со стрелками состоят из нескольких байтов, является отдельной проблемой.[
- это встроенная команда, люди понимают, почему пробелы важны гораздо быстрее. (Это не просто странный способ использования bash вместо скобок). Обновите один раз назад.