我需要一个计时器,该计时器将在脚本的开头启动并在结尾处停止。
答案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
是将经过的秒数分别转换为相应的单位小时、分钟、秒。