用于检测回车键的Bash代码在交互式shell中不起作用
我从站内其他回答中凑来这份用于检测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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。