覆盖 Bash 中先前的输出,而不是附加它

覆盖 Bash 中先前的输出,而不是附加它

对于 bash 计时器我使用以下代码:

#!/bin/bash
sek=60
echo "60 Seconds Wait!"
echo -n "One Moment please "
while [ $sek -ge 1 ]
do
   echo -n "$sek "  
sleep 1
   sek=$[$sek-1]
done
echo
echo "ready!"

这给了我类似的东西

One Moment please: 60 59 58 57 56 55 ...

是否有可能用最新的值替换秒的最后一个值,以便输出不会产生大的轨迹,而是像一个位置的真实时间一样倒计时?(希望你明白我的意思:))

答案1

基本上与 aneeshep 的答案相同,但使用 Return ( \r) 而不是 Backspace ( \b),因为我们不知道长度是否总是相同,例如当$sek < 10

此外,您首先echo应该使用$sek,而不是硬编码60

最后,请注意 后面的空格...

#!/bin/bash
sek=60
echo "$sek Seconds Wait!"
while [ $sek -ge 1 ]
do
   echo -ne "One Moment please $sek ... \r"
   sleep 1
   sek=$[$sek-1]
done
echo
echo "ready!"

答案2

#!/bin/bash
sek=60
echo "60 Seconds Wait!"
echo -n "One Moment please "
while [ $sek -ge 1 ]
do
   echo -n "$sek" #print sek
   sleep 1
   sek=$[$sek-1] #update sek
   echo -en "\b\b\b" #'print' backtrace
done
echo
echo "ready!"

答案3

使用 bash 您可以使用特殊变量SECONDS

#BASH
SECONDS=0;
while sleep .5 && ((SECONDS <= 60)); do 
    printf '\r%s: %2d' "One moment please" "$((60-SECONDS))"
done
printf '\n'

答案4

这是我读完这里以及更多内容后想到的,一句话:

SEC=101;for i in `seq $SEC -1 1`;do printf "\rNext in: %`expr length $SEC`ds" "$i";sleep 1;done;echo

更具可读性:

#!/bin/bash
SEC=101

for i in `seq $SEC -1 1`;do
        printf "\rNext in: %`expr length $SEC`ds" "$i";
        sleep 1;
done
echo

其中 SEC 可以设置为任意正整数,printf 将负责适当的填充。在 Ubuntu 和 cygwin 下测试。

相关内容