回显具有浮点值的变量

时间:2019-04-11 11:28:22

标签: macos shell floating-point

Declare total=O 
for repeat in {1..100}; do
   executiontime=$(gtime -f "%U" python3 main.py | tail -0)
   total=$(echo "scale=2; $total + $executiontime" | bc)  
done
echo "$total/100"

上面的代码是循环的一部分,我需要变量total才能具有文件 main.py 的平均执行时间。我很难打印变量total的值,因为它是浮点变量。正确的语法是什么?

这是我得到的输出:

 (standard_in) 2: parse error

当我使用该命令时,我认为问题出在命令 tail 之内:  gtime -f "%U" python3 main.py | tail -1 这是我得到的输出:

  $ ./gtime -f "%U" python3 main.py | tail -1 
    10.08
    )

但后面带有-0

gtime -f "%U" python3 main.py | tail -0
9.66

2 个答案:

答案 0 :(得分:1)

gtime将时间写入标准错误,这是您要捕获的时间,而不是标准输出。使用这个:

executiontime=$(gtime -f "%U" python3 main.py 2>&1 >/dev/null)

2>&1将标准错误复制到gtime的标准输出中; >/dev/null导致gtime的标准输出被丢弃。最终结果是您捕获了gtime输出的时间,但没有捕获main.py的输出。

tail -0的管道基本上与> /dev/null相当,但是标准错误是 not 写入管道,这就是为什么仍然看到该数字的原因。但是$(...)并没有捕捉到这一点。

答案 1 :(得分:0)

首先,您需要确保executionTime拥有所需的浮点数,然后可以继续计算平均执行时间。

答案因所使用的外壳而异。例如Bash不支持浮点算术,因此,它将不起作用:

# will output the plain string without performing any arithmetic
echo "$total/100" 

相反,您将需要使用其他方法,例如:

echo $(bc <<< "scale=2; $total/100")

允许我链接一些解释其他方法的相关答案:

  

How do I use floating-point division in bash?

     

How can I do division with variables in a Linux shell?