Bash脚本中如何区分按下的是回车键[ENTER]还是空格键[SPACE]
原代码失效原因
原实现有两个核心问题:
read未加-r参数,默认会将反斜杠识别为转义符,容易出现特殊字符读取异常;同时未加-s参数,按键会直接回显到终端,交互体验差。- 判断逻辑完全错误:
- bash的
read默认以换行符作为输入终止标记,即使指定-n1,按下回车时也不会把换行符\n存入变量,只会返回空值,因此判断$Input == \n永远不会成立。 - 按下空格键时,空格是实际可读取的字符,会被存入变量(值为半角空格
,长度为1),并非空字符串,原逻辑把两个按键的判断条件写反了。
- bash的
可直接运行的实现方案
方案1:纯read参数实现(兼容性最好)
#!/bin/bash # -r: 禁用反斜杠转义 -s: 关闭输入回显 -n1: 读取1个字符立即返回 read -rsn1 Input if [[ -z $Input ]]; then echo "Enter is Pressed" elif [[ $Input == " " ]]; then echo "Space is pressed" fi
关键逻辑说明:
-z $Input用来判断变量值为空,对应按下回车键的场景$Input == " "用来匹配半角空格字符,对应按下空格键的场景
方案2:原始终端模式实现(读取最精准)
如果需要严格读取按键的原始字节(避免tty层对输入做特殊处理),可以临时修改终端配置实现:
#!/bin/bash # 备份当前终端配置 stty_backup=$(stty -g) # 配置终端为原始模式、关闭回显 stty raw -echo # 读取1个字节的原始输入 Input=$(head -c1) # 恢复终端原有配置,避免终端异常 stty "$stty_backup" if [[ $Input == $'\n' ]]; then echo "Enter is Pressed" elif [[ $Input == " " ]]; then echo "Space is pressed" fi
这个方案下回车键会被读取为真实的换行符$'\n',判断逻辑更直观,也能兼容更多特殊按键的识别场景。
内容的提问来源于stack exchange,提问作者Random Guy
相关产品推荐
相关产品推荐

