我有两个用科学计数法表示的数字,我想在 bash 的 if 语句中对它们进行一些比较。这样做时,我收到类似 bwlow 的错误: 例如:
bash-4.2$ a=10e-12
bash-4.2$ b=12e-12
bash-4.2$ if (( a > b )); then r=1; else r=0; fi
bash: ((: 10e: value too great for base (error token is "10e")
如果 a 和 b 是整数,则不会出现同样的问题。如果我使用上述语句,我会发现浮点数存在问题。有没有一种简单的方法可以在 if 语句中进行比较?
答案1
使用“awk”
正如@Theophrastus 上面所指出的,既不bash
也不bc
支持科学记数法。
对于简单的比较和计算,我建议使用awk
(它确实处理 xEy 数字):
a=10e-12
b=12e-12
r=$(awk 'BEGIN{print ('$a'>'$b')?1:0}')
echo $r
对于更复杂的表达式,您可以通过将变量传递给awk
with 来避免繁琐的引号处理和转义-v
,这实际上是首选方法:
r=$(awk -v a="$a" -v b="$b" 'BEGIN{print (a<b)?1:0}')
使用“bc”
有多种方法可以将您的符号重新格式化为替代形式x * 10^y这是可以理解的bc
(或者你可以自己做),但是bc
当涉及到负指数时有一些特殊性(如你的例子):
$ bc
10^12
1000000000000
10^-12
0