OSX bash 命令行倒计时器

OSX bash 命令行倒计时器

我发现这里在超级用户上,我可以在我的 .bash_profile 中包含以下不错的倒计时脚本:

function countdown(){  
   date1=$((`date +%s` + $1));   
   while [ "$date1" -ne `date +%s` ]; do   
     echo -ne "$(date -u --date @$(($date1 - `date +%s`)) +%H:%M:%S)\r";  
     sleep 0.1  
  done  
}

据我所知,它在 OSX 上不起作用,因为命令不同date。另一位用户也发表了同样的评论,但该问题仍未得到解决。

同样的问题(我认为)也得到了讨论和解决这里但我不知道如何修改倒计时脚本来利用这个解决方案。

答案1

就我个人而言,我会稍微重构一下以提高可读性(仍然依赖 GNU 日期)

function countdown(){  
    local now=$(date +%s)
    local end=$((now + $1))
    while (( now < end )); do   
        printf "%s\r" "$(date -u -d @$((end - now)) +%T)"  
        sleep 0.25  
        now=$(date +%s)
    done  
    echo
}

将日期调用映射到 OSX 的 BSD 日期(手册页在这里

它看起来像 GNU 日期调用

date -u -d @$((end - now)) +%T

转换为此 BSD 日期调用

date -u -j -f %s $((end - now)) +%T

但这尚未经过测试。

答案2

我在 macOS Mojave 上的 Bash 和 Zsh 中尝试了 @glenn 的答案,效果很好。echo他代码中最后一行附近的最后一个可能不需要:

function countdown() {  
    local now=$(date +%s)
    local end=$((now + $1))
    while (( now < end )); do   
        printf "%s\r" "$(date -u -j -f %s $((end - now)) +%T)"  
        sleep 0.25  
        now=$(date +%s)
    done  
}

并倒计时:

countdown 30                       # for 30 seconds
countdown $((10*60))               # 10 minutes
countdown $((1*60*60 + 30*60))     # 1 hour 30 minutes

我不太熟悉 shell 脚本,所以如果倒计时超过一天,也许有人可以添加天数显示。

要在倒计时结束时发出铃声,请在末尾添加一行:

function countdown() {  
    local now=$(date +%s)
    local end=$((now + $1))
    while (( now < end )); do   
        printf "%s\r" "$(date -u -j -f %s $((end - now)) +%T)"  
        sleep 0.25  
        now=$(date +%s)
    done  
    echo -en "\a"
}

相关内容