在 bash 中,我需要比较两个浮点数,一个是我在脚本中定义的,另一个是作为参数读取的,为此我这样做:
if [[ $aff -gt 0 ]]
then
a=b
echo "xxx "$aff
#echo $CX $CY $CZ $aff
fi
但我收到错误:
[[:-309.585300:语法错误:算术运算符无效(错误标记为“.585300”)
出了什么问题?
谢谢
使用BC:
float1='0.43255'
float2='0.801222'
if (( $(bc <<< "$float1 > $float2") )); then
then
echo "${float1} > ${float2}"
else
echo "${float1} <= ${float2}"
fi
地点:
bc
是一个计算给定表达式的程序,就像计算器>
是 bc 能够理解的表达式语法中的一个运算符,它将返回 0 表示 false,1 表示 true。<<<
是一个“here string”(“here doc”的变体),它将后续字符串输入到 bc 的标准输入中。$( ... )
执行 bc 命令,用生成的 stdout 替换该表达式,即 0 或 1。(( ... ))
根据 Bash 算术规则计算表达式,退出值取决于值:0 导致 1(假)退出值,非零值导致 0(真)退出值。if ...; then
使用 true (0) 或 false (非零) 退出值做明显的事情。使用awk
#!/bin/bash
num1=0.3
num2=0.2
if [ -n "$num1" -a -n "$num2" ];then
result=$(awk -vn1="$num1" -vn2="$num2" 'BEGIN{print (n1>n2)?1:0 }')
echo $result
if [ "$result" -eq 1 ];then
echo "$num1 greater than $num2"
fi
fi
使用 bc 检查数学
a="1.21231"
b="2.22454"
c=$(echo "$a < $b" | bc)
if [ $c = '1' ]; then
echo 'a is smaller than b'
else
echo 'a is larger than b'
fi
test
(通常链接为[
)和bash
内置等效项仅支持整数。
抱歉死了,但是看着@jonretting已经很晚的答案,我认为使用
bc
可能是简洁的最佳选择,尽管这并不能解决 a
或 b
为空或未定义的问题:
( (( $(bc <<< "$a > $b") == 1 )) && echo "a is greater than b") || echo "a is smaller than b"
----------
在脚本中使用
printf "%s\n" [string_to_print]
而不是 echo [string_to_print]
。
我会使用 awk 来实现:
e=2.718281828459045
pi=3.141592653589793
if [ "yes" = "$(echo | awk "($e <= $pi) { print \"yes\"; }")" ]; then
echo "lessthanorequal"
else
echo "larger"
fi
最简单的解决方案是这样的:
f1=0.45
f2=0.33
if [[ $f1 > $f2 ]] ; then echo "f1 is greater then f2"; fi
(在 OSX 上)输出:
f1 is greater then f2
这是另一个结合浮点和整数算术的示例(您需要很棒的小 Perl 脚本 calc.pl,您可以从此处下载):
dateDiff=1.9864
nObs=3
i=1
while [[ $dateDiff > 0 ]] && [ $i -le $nObs ]
do
echo "$dateDiff > 0"
dateDiff=`calc.pl $dateDiff-0.224`
i=$((i+1))
done
哪个输出
1.9864 > 0
1.7624 > 0
1.5384 > 0