我试图用浮点值传递这个组合变量:
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")
答案 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