如何在bash中添加两个时间输出

ban*_*nuj 4 bash time date

我想用bash计算几个命令所花费的平均时间.time命令的输出是min:sec.milisec.

我不知道如何在bash中添加这种输出,最后计算平均值.

我试图用日期转换输出,但输出是"日期:无效日期`0:01.00'".

Sie*_*geX 6

这是一个三部分答案

第一部分

首先,使用TIMEFORMAT变量仅输出经过的秒数.然后你可以直接添加它

man bash

TIMEFORMAT 此参数的值用作格式字符串,指定应如何显示以时间保留字为前缀的管道的时序信息.%字符引入了一个转义为时间值或其他信息的转义序列.逃逸序列及其含义如下; 括号表示可选部分.

这是一个仅输出精度为0的秒的示例,即没有小数点.阅读第三部分为什么这很重要.

TIMEFORMAT='%0R'; time sleep 1
1
Run Code Online (Sandbox Code Playgroud)

第二部分

第二,我们如何捕获输出time?这实际上有点棘手,这里是你如何通过上面的命令捕获时间

TIMEFORMAT='%0R'; time1=$( { time sleep 1; } 2>&1 )
Run Code Online (Sandbox Code Playgroud)

第三部分

我们如何将时间加在一起并获得平均值?

在bash中,我们使用$(( ))构造来进行数学运算.请注意,bash本身不支持浮点,因此您将进行整数除法(因此精度为0.)这是一个脚本,它将捕获time来自两个命令并输出每个单独的时间及其平均值

#!/bin/bash

TIMEFORMAT='%0R'
time1=$( { time sleep 1; } 2>&1 )
time2=$( { time sleep 4; } 2>&1 )
ave=$(( (time1 + time2) / 2))

echo "time1 is $time1 | time2 is $time2 | average is $ave"
Run Code Online (Sandbox Code Playgroud)

产量

time1 is 1 | time2 is 4 | average is 2
Run Code Online (Sandbox Code Playgroud)

如果整数除法对你来说是非启动的并且你想要精度,只要你不介意调用外部二进制文件bc,你就可以很容易地做到这一点.

#!/bin/bash

TIMEFORMAT='%3R'
time1=$( { time sleep 1; } 2>&1 )
time2=$( { time sleep 4; } 2>&1 )
ave=$( bc <<<"scale=3; ($time1 + $time2)/2" )

echo "time1 is $time1 | time2 is $time2 | average is $ave"
Run Code Online (Sandbox Code Playgroud)

产量

time1 is 1.003 | time2 is 4.003 | average is 2.503
Run Code Online (Sandbox Code Playgroud)