对于 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 下测试。