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

如何在Bash中实现实时倒计时并接收用户输入?解决重复输出问题

问题分析

你的代码每轮循环都会重复打印题目、空行和输入提示,加上倒计时输出,导致每一秒内容都重复刷新。要实现固定区域显示题目和输入框,仅实时更新倒计时的效果,需要借助终端光标控制工具来定位输出位置。

修复后的代码
readFile(){
    linenumber=1
    end=10
    while  [ $linenumber -lt 18 ];do
        # 清屏后先打印当前题目和输入提示,固定布局
        clear
        sed -n "$linenumber, $((linenumber + 5))p" < QuestionBank.txt            
        echo -e "\n\n"
        echo -n "Please Choose an Answer: "
        
        # 保存当前光标位置(输入提示后的位置)
        tput sc
        
        # 倒计时循环:只更新倒计时行,不干扰题目和输入框
        for (( i=0; i<=10; i++ )); do
            # 回到保存的光标位置,再上移3行到倒计时行(根据实际行数调整)
            tput rc
            tput cuu 3
            # 覆盖打印倒计时,清除该行多余内容
            echo -ne "Time Remaining: $((end - i))\033[0K"
            
            # 回到输入提示的光标位置,等待用户输入
            tput rc
            
            # 尝试读取输入,超时1秒;如果用户输入,立即跳出倒计时
            if read -t 1 -n 1 answer; then
                echo
                break
            fi
        done
        linenumber=$((linenumber + 6))
    done
}
核心改进说明
  • clear:每道题开始时清屏,避免上一题的内容残留
  • tput sc/tput rc:分别保存和恢复光标位置,确保可以精准回到输入提示处
  • tput cuu 3:将光标上移到倒计时显示的固定行,实现倒计时单独刷新,不打乱题目布局
  • 增加输入判断:用户输入答案后直接终止当前倒计时,进入下一题流程

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 04:35:06