bash倒计时计时器echo输出异常:多余字符拼接问题求助
解决Bash倒计时计时器的输出残留问题
问题描述
我编写了一段实现简单倒计时计时器的Bash代码,大体可正常运行,但输出存在异常:预期流程结束后显示Timer Finished,实际却显示Timer Finishedmaining。已尝试调整字符串格式、修改echo选项、移除终端转义序列,但仍未解决。
代码如下:
#Fixed formatting i=0; echo -en "Enter timer length (seconds): "; read num; echo "Timer starting...now"; sleep 1; for i in $(seq $num 1); do echo -ne "$i second(s) remaining"\\r; sleep 1; done; echo -e "\033[34mTimer Finished\033[0m";
问题原因
问题出在\r的行为上:它仅将光标移动到当前行的开头,但不会清除该行已有的内容。当最后输出的Timer Finished字符串长度小于循环中输出的X second(s) remaining时,之前字符串的后半部分(比如maining)会残留并叠加在新内容之后。
解决方案
在输出最终的Timer Finished前,先使用ANSI转义序列\033[K清除当前行从光标到行尾的所有内容,再输出完成信息。
修改后的代码:
#Fixed formatting i=0; echo -en "Enter timer length (seconds): "; read num; echo "Timer starting...now"; sleep 1; for i in $(seq $num 1); do echo -ne "$i second(s) remaining"\\r; sleep 1; done; # 先移到行首并清除行尾残留内容,再输出完成信息 echo -ne "\r\033[K\033[34mTimer Finished\033[0m\n";
额外说明
\r:将光标移至当前行开头\033[K:ANSI转义序列,清除从光标位置到行尾的所有字符- 也可以选择在输出完成信息时添加足够的空格覆盖残留内容,但这种方法不够灵活,当倒计时数字长度变化时可能失效,优先推荐使用ANSI转义序列的方案。
内容的提问来源于stack exchange,提问作者Xavier
相关产品推荐
相关产品推荐

