我想将$SECONDS
命令的结果保存到一个变量中,以格式打印时间HH:MM:SS
。
这是我迄今为止尝试过的。我尝试以不同的方式打印它并且总是得到如下结果0
:
time_spent="$SECONDS"
echo "Time: $time_spent"
Run Code Online (Sandbox Code Playgroud)
我想在关闭控制台时打印在 shell 中花费的时间。我创建了一个每次关闭控制台时都会运行的脚本。
要$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)
您已经引用了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
正确的。
如果您确定这$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)
这是一个快速的,自打开外壳以来给出了数小时的分秒:
~$ 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)
希望这可以帮助!