用于检测回车键的Bash代码在交互式shell中不起作用

编程语言 2026-07-12

我从站内其他回答中凑来这份用于检测Enter键的代码:

while true
do
    read -r -s -n 1 key

    if [[ "$key" == $'\n' ]]
    then
        echo "Breaking loop..."
        break
    fi
done

不过它在命令行中不起作用。为什么会这样?

解决方案

关键点在于 -n 1。当你按下Enter时,终端会发送一个换行字符,但在规范的终端输入处理下,Bash常常把Enter解释为完成一行,而不是把 \n 作为你所期望的单一字符传递。

按下Enter之后,看看读取到的是什么:

read -r -s -n 1 key
printf '%q\n' "$key"

它将是一个空字符串,因此改用 if [[ -z "$key" ]]

备选方案1

看起来你是在尝试在换行符是第一个字符时进行检测。这等同于一个空行。

试试看:

while true; do
   read -r fun
   echo $fun
   if [ "$fun" == "" ]; then
      break
   fi
done

备选方案2

换行字符会被丢弃,因为 read 默认把它既作为记录分隔符,又作为字段分隔符。你需要覆盖默认设置。尝试

IFS= read -r -d '' -s -n 1 key

IFS= 设置没有字段分隔符,-d '' 实质上把记录分隔符设为NUL字符。这样换行字符就不会被特殊处理。

有关使用 read 的有用信息,请参阅 BashFAQ/001 (How can I read a file (data stream, variable) line-by-line (and/or field-by-field)?)

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章