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
相关产品推荐
相关产品推荐

