如何在 bash 脚本中使用 $SECONDS?

And*_*rew 9 bash scripts

我想将$SECONDS命令的结果保存到一个变量中,以格式打印时间HH:MM:SS

这是我迄今为止尝试过的。我尝试以不同的方式打印它并且总是得到如下结果0

time_spent="$SECONDS"
echo "Time: $time_spent"
Run Code Online (Sandbox Code Playgroud)

我想在关闭控制台时打印在 shell 中花费的时间。我创建了一个每次关闭控制台时都会运行的脚本。

ste*_*ver 9

$SECONDS进入 HH:MM:SS 格式,您需要做一些(整数)数学运算:

secs=$SECONDS
hrs=$(( secs/3600 )); mins=$(( (secs-hrs*3600)/60 )); secs=$(( secs-hrs*3600-mins*60 ))

printf 'Time spent: %02d:%02d:%02d\n' $hrs $mins $secs
Time spent: 431:48:03
Run Code Online (Sandbox Code Playgroud)

  • 我认为最好先将 `$SECONDS` 保存为变量——以保持一致性(不确定最后两次计算会剩下多少秒)。 (18认同)

hee*_*ayl 7

您已经引用了bash内部变量SECONDS(它输出自调用当前 shell 实例以来经过的秒数)并将该值保存为另一个变量time_spent。现在,之后每次检查 variable 的值时time_spent,您都会得到相同的值——保存的值,在SECONDS.

要动态获取SECONDS,您应该$SECONDS直接引用而不是使用中间变量:

echo "Time: $SECONDS"
Run Code Online (Sandbox Code Playgroud)

如果您坚持使用中间变量,请确保$SECONDS每次都进行扩展。


关于价值SECONDS的存在0,你可以很容易地重现此:

% bash -c 'echo $SECONDS'
0
Run Code Online (Sandbox Code Playgroud)

关键是:当你计算这个值时,还不是一秒,所以这个值是0正确的。


Dig*_*uma 7

如果您确定这$SECONDS将少于 1 天(即 86400 秒),那么GNU core-utils date可以很好地完成所需的格式化:

$ date -ud "@$SECONDS" "+Time elapsed: %H:%M:%S"
Time elapsed: 00:32:05
$
Run Code Online (Sandbox Code Playgroud)


Ter*_*nce 5

这是一个快速的,自打开外壳以来给出了数小时的分秒:

~$ cat how_long_open 
#!/bin/bash

time=$SECONDS
printf '%dh:%dm:%ds\n' $(($time/3600)) $(($time%3600/60)) $(($time%60))
Run Code Online (Sandbox Code Playgroud)

由于脚本在子 shell 中运行,因此获得输出的最佳方法是获取脚本而不是调用它。

例子:

不采购脚本

~$ ./how_long_open 
0h:0m:0s
Run Code Online (Sandbox Code Playgroud)

随着采购脚本

~$ source ./how_long_open 
1h:24m:40s
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!