(bash)我如何将float varibale传递给if条件

时间:2017-11-06 23:11:14

标签: bash variables if-statement

我试图用浮点值传递这个组合变量:

j=1
DA1=178.2929838483883283
if (( $(bc <<< "$((DA$j)) > 150") )) && (( $(bc <<< "$((DA$j)) < -150") ))
then
    D="T"
fi

但我明白了:

178.2929838483883283: syntax error: invalid arithmetic operator (error token is ".2929838483883283")

2 个答案:

答案 0 :(得分:4)

首先,对于x > 150 && x < -150的所有值,x将为false。

其次,我注意到你问题中的一个共同模式: 使用带有数字后缀的动态变量名称。 这非常棘手,难以阅读且容易出错, 当存在更好,更简单和更安全的替代方案时:数组。

使用Bash数组重写上述代码:

DA=()

j=0
DA[0]=178.2929838483883283
if (( $(bc <<< "${DA[j]} > 150") )) || (( $(bc <<< "${DA[j]} < -150") ))
then
    D="T"
fi

我在条件中将&&替换为||,让它有机会成为真实。

答案 1 :(得分:1)

此外,您的错误不言自明:

178.2929838483883283: syntax error: invalid arithmetic operator \
(error token is ".2929838483883283")

您无法使用((...))算术运算符和浮点数进行比较。请注意,您编号:

178.2929838483883283

请注意错误:

syntax error: invalid arithmetic operator (error token is ".2929838483883283")

(( ... ))评估不知道如何处理".2929838483883283",因为bash中的数学是整数数学。

准确的问题在于:

$((DA$j))

触发错误:

178.2929838483883283: syntax error: invalid arithmetic operator \
(error token is ".2929838483883283")

在将任何内容传递给bc之前。

要故意与BASH FAQ006发生冲突,您可以创建一个包含组合DA#的变量并使用间接访问该值,但这不是推荐的解决方案,例如

#!/bin/bash

j=1
DA1=178.2929838483883283

foo="DA$j"  ## create a variable to allow indirection

if (( $(bc <<< "${!foo} > 150") )) || (( $(bc <<< "${!foo} < -150") ))
then
    D="T"
fi

echo "D=$D"

示例使用/输出

$ bash compare.sh
D=T