计算 bash 中的时间(h:m:s 或 m:s)差异

Calculate time (h:m:s or m:s) difference in bash

我想在脚本中显示命令的持续时间。根据持续时间,我想要这样的东西:12 minutes 04 seconds01 hours 15 minutes 02 seconds。始终带有前导零。

我尝试了我发现的不同方法 here,但没有得到结果。

顺便说一句:这是我在 bash 中的第一次尝试。

#!/bin/bash
DATE1=$(date +%s)  
# ... your commands 
DATE2=$(date +%s)
DIFF=$(awk -vdate1=$DATE1 -vdate2=$DATE2 'BEGIN{print strftime("%H hour %M minutes %S seconds",date2-date1,1)}')
echo $DIFF

时间转换为秒并存储在变量 DATE1 和 DATE2 中 前提条件 DATE2 > DATE1

DATE1=$(date +%s)  
# ... your commands 
DATE2=$(date +%s)

strftime 用于获取以秒为单位的时差并格式化 1作为UTC标志

作为第三个参数传递
strftime("%H hour %M minutes %S seconds",date2-date1,1)

您可以使用 time 可执行文件(不是 bash 内置程序,因为外部程序具有格式选项 -f 并以 [hours:]minutes:seconds 形式提供时间,我现在没有心情等待一个小时来了解内置函数如何向我们显示时间 :) ) 和 awk 像这样(使用示例 sleep 2):

/usr/bin/time -f "%E" sleep 2 2> >( 
   awk -F : ' 
    { if(FN>2) printf("%02d hours %02d minutes %02d seconds\n", , , )
      else printf("%02d minutes %02d seconds\n", , ) 
    }' 
)

这里我们使用 /usr/bin/time 及其 -f 选项。然后我们将 stderr 的输出通过管道传输到 awk,在 : 处拆分字符串。 (时间写入 stderr,因此我们需要 2> 将 stderr 重定向到 >( awk ... ) 过滤器。

awk 过滤器决定 NF 它使用的 printf 语句中字段的数量。