我正在努力比较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限制的策略。
其他回答
这个脚本可以帮助我检查安装的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
Bash只处理整数数学,但是你可以像下面这样使用bc命令:
$ num1=3.17648E-22
$ num2=1.5
$ echo $num1'>'$num2 | bc -l
0
$ echo $num2'>'$num1 | bc -l
1
注意,指数符号必须是大写的。
AWK和类似的工具(我在盯着你看sed…)应该被扔进旧项目的垃圾箱里,因为它们的代码是用永不读的语言写的,所以每个人都不敢碰。
或者你是一个相对罕见的需要优先考虑CPU使用优化而不是代码维护优化的项目……既然如此,那就继续吧。
如果不是,那么就使用一些可读且显式的语言,比如Python。你的程序员同事和未来的自己都会感谢你。您可以像所有其他代码一样,在Bash中使用Python代码。
num1=3.17648E-22
num2=1.5
if python -c "exit(0 if $num1 < $num2 else 1)"; then
echo "yes, $num1 < $num2"
else
echo "no, $num1 >= $num2"
fi
对于非整数数学,最好使用AWK。你可以使用这个Bash实用函数:
numCompare() {
awk -v n1="$1" -v n2="$2" 'BEGIN {printf "%s " (n1<n2?"<":">=") " %s\n", n1, n2}'
}
称之为:
numCompare 5.65 3.14e-22
5.65 >= 3.14e-22
numCompare 5.65e-23 3.14e-22
5.65e-23 < 3.14e-22
numCompare 3.145678 3.145679
3.145678 < 3.145679
更加方便
这可以使用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限制的策略。