如何在Bash脚本中实现带按键中止的倒计时功能?
实现带倒计时的Bash按键中止功能
要同时实现倒计时显示和按键中止的功能,核心是将倒计时放到后台进程运行,同时前台监听用户输入,配合ANSI终端控制码实现同一行更新倒计时。以下是完整的可运行代码:
#!/bin/bash # 配置倒计时总时长(秒) countdown=10 # 启动后台倒计时子进程 ( while [ $countdown -gt 0 ]; do # \r 回到行首,\033[K 清除当前行剩余内容,实现同一行覆盖更新 echo -ne "\r\033[K倒计时剩余 $countdown 秒,按任意键中止..." sleep 1 ((countdown--)) done # 倒计时结束后清除提示行 echo -ne "\r\033[K" ) & # 保存后台倒计时进程的PID,用于后续终止 countdown_pid=$! # 前台监听用户输入,超时时间与倒计时时长一致 if read -n 1 -s -t $countdown; then # 用户按键,终止后台倒计时进程 kill $countdown_pid 2>/dev/null # 清除当前提示行并输出中止信息 echo -ne "\r\033[K已中止操作\n" exit 0 else # 超时未按键,等待后台倒计时进程结束 wait $countdown_pid 2>/dev/null echo -ne "\r\033[K继续执行后续操作\n" # 在此添加超时后要执行的代码逻辑 # 示例:echo "开始执行后续任务..." fi
关键细节说明
- 后台进程分离:将倒计时逻辑放到子shell并后台运行(
&),避免阻塞前台的read命令,实现两者并行执行。 - 终端输出控制:
\r:将光标移动到当前行开头,确保新的倒计时内容从行首开始输出。\033[K:ANSI终端控制码,清除从光标位置到行尾的所有内容,解决倒计时换行的问题。
- 进程管理:通过记录后台进程PID,在用户按键时及时终止倒计时进程,避免其继续输出干扰终端显示。
- 输入监听同步:
read的-t参数设置为倒计时总时长,确保输入等待和倒计时周期完全同步。
解决你之前的问题
- 之前的代码未将倒计时后台运行,导致
read和倒计时逻辑互相阻塞,无法同时工作。 - 倒计时代码中的
\033[OK\r是错误的控制码,替换为\033[K即可实现同一行内容更新。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

