You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本捕获ESC键失败:整数比较语法问题排查

Bash脚本ESC键捕获失效问题修复

问题背景

你编写的Bash脚本可以无需回车捕获普通按键,但ESC键始终无法被正确捕获。尝试了多种数值/字符串比较写法(如$VALUE -eq 27、$VALUE == 27等),要么无响应,要么抛出语法错误,且shellcheck未检测出异常。脚本代码如下:

#!/usr/bin/bash
clear

function getkey () {
  read -rs -n1 -t.001 KEYIN         # read 1 chr, no echo, no delay
  VALUE=\'$KEYIN
  if [[ $VALUE -eq 27 ]]; then     # trap esc key
    printf "esc caught\n"
  fi
}

while :; do    # --- Infinite loop ---
  KEYIN=""
  VALUE=0
  getkey
  if [[ $KEYIN == [Qq] ]]; then exit; fi
  if [[ $KEYIN != "" ]]; then printf "%s : %d\n" "$KEYIN" "$VALUE"; fi
done

核心问题

VALUE=\'$KEYIN这行是错误根源:它给KEYIN的字符额外添加了单引号,导致按下ESC键时,VALUE实际是'(单引号+ESC控制字符),而非ESC对应的ASCII码27,所有比较自然无法匹配。

修复步骤

1. 正确获取字符的ASCII码

用printf "%d" "'$KEYIN"来获取按键字符的ASCII数值,修改后的getkey函数:

function getkey () {
  read -rs -n1 -t.001 KEYIN         # read 1 chr, no echo, no delay
  if [[ -n "$KEYIN" ]]; then
    VALUE=$(printf "%d" "'$KEYIN")
    if [[ $VALUE -eq 27 ]]; then     # 捕获ESC键
      printf "esc caught\n"
    fi
  fi
}

2. (可选)完整捕获箭头键

箭头键是多字符序列(ESC+[+A/B/C/D),当前脚本仅读取1个字符,若要识别箭头键,需在捕获ESC后继续读取后续字符:

function getkey () {
  read -rs -n1 -t.001 KEYIN
  if [[ -n "$KEYIN" ]]; then
    VALUE=$(printf "%d" "'$KEYIN")
    if [[ $VALUE -eq 27 ]]; then
      # 读取箭头键的后续2个字符
      read -rs -n2 -t.001 ARROW_SUFFIX
      case "$ARROW_SUFFIX" in
        A) printf "上箭头被捕获\n" ;;
        B) printf "下箭头被捕获\n" ;;
        C) printf "右箭头被捕获\n" ;;
        D) printf "左箭头被捕获\n" ;;
        *) printf "esc键被捕获\n" ;;
      esac
    fi
  fi
}

额外说明

  • 添加[[ -n "$KEYIN" ]]判断,避免read超时(无按键输入)时执行printf产生错误输出。
  • 保持read的-rs参数:-r禁止反斜杠转义,-s隐藏输入回显,符合无回车捕获按键的需求。

内容的提问来源于stack exchange,提问作者user3859005

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 21:44:52