如何将函数输出转换为数字

时间:2018-05-01 01:41:56

标签: bash function if-statement floating-point sh

所以想要转换这个函数,其输出是一个数字。这个数字是通过一些无关的json文件卷曲的。

#error input 1
if (($(masterfunc) >= 1)); then
#I've also tried
#error input 2
if (($(masterfunc | bc -l) >= 1)); then

我得到这些错误,我假设这是因为它将其作为字母或命令输出而不是数字。

#error output 1
((: 1.00048333447157914468 >= 1: syntax error: invalid arithmetic 
operator (error token is ".00048333447157914468 >= 1")
#error output 2
((: .99989817794934530799 >= 1: syntax error: operand expected (error 
token is ".99989817794934530799 >= 1")

我假设这是一个浮点运算问题,但是它应该通过bc解决?

我是bash的新手,所以如果问题是一些无关的语法错误,我道歉。

2 个答案:

答案 0 :(得分:2)

这实际上相当复杂。 shell根本不理解实数,所以你必须得到其他东西(比如bc)来做比较并输出一些bash可以理解的更简单的东西。我认为最简单的方法是:

if [ $(echo "$(masterfunc) >= 1" | bc) -eq 1 ]; then

解释,一步一步:

  • echo "$(masterfunc) >= 1"运行masterfunc功能,添加"> = 1"到它的输出,并将结果(例如" 1.00048333447157914468> = 1")发送到标准输出。

  • echo "$(masterfunc) >= 1" | bc运行以上内容并将其传送到bc,这将进行比较并打印" 1"如果masterfunc输出大于或等于1," 0"如果不是那么的话。注意:您可以尝试手动运行它,看看它是如何工作的。

    这" 1" /" 0"输出更符合bash可以理解的范围,但我们仍然需要实际告诉bash该怎么做。

  • [ $(echo "$(masterfunc) >= 1" | bc) -eq 1 ]运行上述内容,使用$( )捕获其输出,并将其嵌入测试表达式中。基本上,根据bc的输出,这相当于[ 1 -eq 1 ][ 0 -eq 1 ]

答案 1 :(得分:0)

使用此:

if (( $(printf '%s >= 1\n' "$(masterfunc)" | bc -l) )); then ...