如何在 bash 中使用计时器?

如何在 bash 中使用计时器?

我需要一个计时器,该计时器将在脚本的开头启动并在结尾处停止。

答案1

如果您想要以秒为单位的持续时间,请在顶部使用

start=$SECONDS

最后

duration=$(( SECONDS - start ))

答案2

您可以使用 Linux 的内置time命令。从手册页:

时间命令[参数]

time 确定显示字符串 FORMAT 中的 COMMAND 使用的资源的哪些信息。如果在命令行上未指定格式,但设置了 TIME 环境变量,则使用其值作为格式。

要为脚本计时cleanup.sh,请使用:

$ time cleanup.sh

答案3

我意识到这是一个很老的问题,但当我想/需要知道某件事需要多长时间运行时,这就是我做任何事情的方式。

Bash 有一个内置的秒计时器,其形式为名为 的内部变量SECONDS(请参阅:这里对于其他内部变量)

放在SECONDS=0您要检查其运行时间的任何内容之前。它需要位于任何用户输入之后才能获得良好的结果,因此如果您提示输入信息,请将其放在提示之后。

然后,将其放在您要检查的内容的末尾:

if (( $SECONDS > 3600 )) ; then
    let "hours=SECONDS/3600"
    let "minutes=(SECONDS%3600)/60"
    let "seconds=(SECONDS%3600)%60"
    echo "Completed in $hours hour(s), $minutes minute(s) and $seconds second(s)" 
elif (( $SECONDS > 60 )) ; then
    let "minutes=(SECONDS%3600)/60"
    let "seconds=(SECONDS%3600)%60"
    echo "Completed in $minutes minute(s) and $seconds second(s)"
else
    echo "Completed in $SECONDS seconds"
fi

如果你只想知道以秒为单位的时间,你可以将上面的内容简化为:

echo "Completed in $SECONDS seconds"

举个例子:

read -rp "What's your name? " "name"
SECONDS=0
echo "Hello, $name"
if (( $SECONDS > 3600 )) ; then
    let "hours=SECONDS/3600"
    let "minutes=(SECONDS%3600)/60"
    let "seconds=(SECONDS%3600)%60"
    echo "Completed in $hours hour(s), $minutes minute(s) and $seconds second(s)" 
elif (( $SECONDS > 60 )) ; then
    let "minutes=(SECONDS%3600)/60"
    let "seconds=(SECONDS%3600)%60"
    echo "Completed in $minutes minute(s) and $seconds second(s)"
else
    echo "Completed in $SECONDS seconds"
fi

答案4

@anask 为这个答案做了一个聪明的解决方案,只是我建议使用本机$SECONDS而不是创建一个新的

awk -v t=$SECONDS 'BEGIN{t=int(t*1000); printf "Elapsed Time (HH:MM:SS): %d:%02d:%02d\n", t/3600000, t/60000%60, t/1000%60}'

和 除法的目的printf是将经过的秒数分别转换为相应的单位小时、分钟、秒。

相关内容