You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

关键细节说明

  1. 后台进程分离:将倒计时逻辑放到子shell并后台运行(&),避免阻塞前台的read命令,实现两者并行执行。
  2. 终端输出控制:
    • \r:将光标移动到当前行开头,确保新的倒计时内容从行首开始输出。
    • \033[K:ANSI终端控制码,清除从光标位置到行尾的所有内容,解决倒计时换行的问题。
  3. 进程管理:通过记录后台进程PID,在用户按键时及时终止倒计时进程,避免其继续输出干扰终端显示。
  4. 输入监听同步:read的-t参数设置为倒计时总时长,确保输入等待和倒计时周期完全同步。

解决你之前的问题

  • 之前的代码未将倒计时后台运行,导致read和倒计时逻辑互相阻塞,无法同时工作。
  • 倒计时代码中的\033[OK\r是错误的控制码,替换为\033[K即可实现同一行内容更新。

内容的提问来源于stack exchange,提问作者Mike

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 20:27:36