如何在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
相关产品推荐
相关产品推荐

