Bash脚本倒计时5分钟,单行显示[关闭]


23

我想倒数5分钟,每秒更新一次,并在同一行显示结果。使用Bash脚本甚至可以做到吗?


倒计时做什么?您需要对整个事情更具体一些。
AdrianFrühwirth'13

这绝对是可能的。如果您告诉我们原因(您要解决的实际系统/网络管理问题是什么),我们可以告诉您许多可用的方法中的哪一种可能最适合您。如果是一般性的“如何在bash脚本中执行此操作?”问题,那么您的问题可能更适合Unix&Linux-让我知道,我可以为您迁移它:)
voretaq7 2013年

Answers:


42

这在Bash shell中有效:

secs=$((5 * 60))
while [ $secs -gt 0 ]; do
   echo -ne "$secs\033[0K\r"
   sleep 1
   : $((secs--))
done

特殊字符\ 033 [OK表示行尾,如果前一个输出中还剩下任何字符,则清理行的其余部分,并且\ r是回车符,它将光标移动到行首。stackoverflow.com上有一个关于此功能的不错的线程。

您可以添加自己的命令,也可以在while循环中添加任何内容。如果您需要更具体的信息,请向我提供更多详细信息。


您是按照\ ascii-table.com/ansi-escape-sequences.php而不是0K来表示\ 033 [K ?
乔迪·李·布鲁雄

我将\r光标放在行首(这防止它隐藏第一个字符)。这是更新的版本:gist.github.com/boillodmanuel/676b3af823fae4177f1d0b41a6f23442 感谢
user1067920

13

这是一种改进的正确输出格式(HH:MM:SS),带有正确的前导零和支持时间:

#!/bin/bash

m=${1}-1 # add minus 1 

Floor () {
  DIVIDEND=${1}
  DIVISOR=${2}
  RESULT=$(( ( ${DIVIDEND} - ( ${DIVIDEND} % ${DIVISOR}) )/${DIVISOR} ))
  echo ${RESULT}
}

Timecount(){
        s=${1}
        HOUR=$( Floor ${s} 60/60 )
        s=$((${s}-(60*60*${HOUR})))
        MIN=$( Floor ${s} 60 )
        SEC=$((${s}-60*${MIN}))
     while [ $HOUR -ge 0 ]; do
        while [ $MIN -ge 0 ]; do
                while [ $SEC -ge 0 ]; do
                        printf "%02d:%02d:%02d\033[0K\r" $HOUR $MIN $SEC
                        SEC=$((SEC-1))
                        sleep 1
                done
                SEC=59
                MIN=$((MIN-1))
        done
        MIN=59
        HOUR=$((HOUR-1))
     done
}

Timecount $m

提供如下所示的输出:

02:04:15

输出不完全HH:MM:SS。对于单位数分钟或秒,您可以看到00:4:5
chishaku 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.