我正在努力比较Bash脚本中的两个浮点数。我有两个变量,例如。
let num1=3.17648e-22
let num2=1.5
现在,我想对这两个数字做一个简单的比较:
st=`echo "$num1 < $num2" | bc`
if [ $st -eq 1]; then
echo -e "$num1 < $num2"
else
echo -e "$num1 >= $num2"
fi
不幸的是,我有一些问题与num1的正确处理可以是“电子格式”。
我正在努力比较Bash脚本中的两个浮点数。我有两个变量,例如。
let num1=3.17648e-22
let num2=1.5
现在,我想对这两个数字做一个简单的比较:
st=`echo "$num1 < $num2" | bc`
if [ $st -eq 1]; then
echo -e "$num1 < $num2"
else
echo -e "$num1 >= $num2"
fi
不幸的是,我有一些问题与num1的正确处理可以是“电子格式”。
当前回答
更加方便
这可以使用Bash的数值上下文更方便地完成:
if (( $(echo "$num1 > $num2" |bc -l) )); then
…
fi
解释
通过基本计算器命令bc的管道将返回1或0。
选项-l等价于——mathlib;它加载标准数学库。
将整个表达式括在双括号(())之间会将这些值分别转换为true或false。
请确保安装了bc基本计算器包。
注意:指数符号应该写成*10^;不是E,也不是E。
例如:
$ echo "1*10^3==1000" |bc
1
而
$ echo "1E3==1000" |bc
0
这里讨论了克服这种bc限制的策略。
其他回答
一个非常简单的perl解决方案:
$ num1=3.2E8
$ num2=2.5E9
$ perl -e "print $num2 > $num1? \"true\" : \"false\", \"\n\";"
true
$ perl -e "print $num2 < $num1? \"true\" : \"false\", \"\n\";"
false
这证明perl真正理解科学数字表示的“E”符号:
$ perl -e "print $num1, \"\n\";"
320000000
如果你在shell脚本中需要一个' If '语句,在perl中使用exit命令:
$ if perl -e "exit ($num1 > $num2? 0 : 1);"; then echo true; else echo false; fi
false
注意,在shell脚本中,返回0的命令表示成功,并传递'if'条件(因此if-子句被执行)。任何其他非零返回值都意味着失败。
支持所有可能的表示法的解决方案,包括大小写指数的科学表示法(例如,12.00e4):
if (( $(bc -l <<< "${value1/e/E} < ${value2/e/E}") ))
then
echo "$value1 is smaller than $value2"
fi
一个纯Bash解决方案,用于比较没有指数符号,前导或尾随零的浮点数:
if [ ${FOO%.*} -eq ${BAR%.*} ] && [ ${FOO#*.} \> ${BAR#*.} ] || [ ${FOO%.*} -gt ${BAR%.*} ]; then
echo "${FOO} > ${BAR}";
else
echo "${FOO} <= ${BAR}";
fi
逻辑运算符的顺序很重要。整数部分作为数字进行比较,小数部分故意作为字符串进行比较。使用这种方法将变量分成整数部分和小数部分。
它不会比较浮点数和整数(不带点)。
为了简单和清晰,只需使用AWK进行计算,因为它是一个标准的Unix工具,所以很可能与bc一样,而且在语法上更容易使用。
对于这个问题:
$ cat tst.sh
#!/bin/bash
num1=3.17648e-22
num2=1.5
awk -v num1="$num1" -v num2="$num2" '
BEGIN {
print "num1", (num1 < num2 ? "<" : ">="), "num2"
}
'
$ ./tst.sh
num1 < num2
另一个问题和这个问题是一样的
$ cat tst.sh
#!/bin/bash
read -p "Operator: " operator
read -p "First number: " ch1
read -p "Second number: " ch2
awk -v ch1="$ch1" -v ch2="$ch2" -v op="$operator" '
BEGIN {
if ( ( op == "/" ) && ( ch2 == 0 ) ) {
print "Nope..."
}
else {
print ch1 '"$operator"' ch2
}
}
'
$ ./tst.sh
Operator: /
First number: 4.5
Second number: 2
2.25
$ ./tst.sh
Operator: /
First number: 4.5
Second number: 0
Nope...
我把这个作为“4.5:语法错误:无效的算术运算符(错误标记是“.5”)”的答案发布-但代码似乎仍然可以工作。为什么?当它作为这个问题的副本关闭时,这里它也适用于这里。
这个脚本可以帮助我检查安装的Grails版本是否大于最低要求。
#!/bin/bash
min=1.4
current=`echo $(grails --version | head -n 2 | awk '{print $NF}' | cut -c 1-3)`
if [ 1 -eq `echo "${current} < ${min}" | bc` ]
then
echo "Yo, you have an older version of Grails."
else
echo "Hurray, you have the latest version"
fi