【发布时间】:2011-02-02 20:57:51
【问题描述】:
echo 3+3
如何在 Bash 中评估此类表达式,在本例中为 6?
【问题讨论】:
标签: bash math sh evaluation
echo 3+3
如何在 Bash 中评估此类表达式,在本例中为 6?
【问题讨论】:
标签: bash math sh evaluation
echo $(( 3+3 ))
【讨论】:
expr 是标准方式,但它只处理整数。
bash 有几个扩展,它们也只处理整数:
$((3+3)) returns 6
((3+3)) used in conditionals, returns 0 for true (non-zero) and 1 for false
let 3+3 same as (( ))
let 和(( )) 可用于赋值,例如
let a=3+3
((a=3+3))
对于浮点,您可以使用bc
回声 3+3 |公元前
【讨论】:
在 zsh/ksh 等 shell 中,您可以使用浮点数进行数学运算。如果您需要更多数学能力,请使用bc/awk/dc等工具
例如
var=$(echo "scale=2;3.4+43.1" | bc)
var=$(awk 'BEGIN{print 3.4*43.1}')
看看你想做什么
awk '{printf "%.2f\n",$0/59.5}' ball_dropping_times >bull_velocities
【讨论】:
| bc 获得我个人的认可印章
【讨论】:
epr 3 + 3。
很多方法 - 最便携的是使用expr 命令:
expr 3 + 3
【讨论】:
我相信 ((3+3)) 方法是最快的,因为它是由 shell 而不是外部二进制文件解释的。 使用所有建议的方法为大循环计时,以获得最有效的时间。
【讨论】:
感谢 Dennis,BC 使用示例:
$ cat calc_velo.sh
#!/bin/bash
for i in `cat ball_dropping_times`
do
echo "scale=20; $i / 59.5" | bc
done > ball_velocities
【讨论】:
>,它每次都会截断(覆盖)目标文件。将其更改为附加运算符>> 或将重定向放在done 之后而不是bc 之后,如下所示:done > ball_velocities。
我对数学处理的理解涉及浮点处理。
使用 bashj (https://sourceforge.net/projects/bashj/),您可以简单地调用 java 方法(带有浮点处理、cos()、sin()、log()、exp()...)
bashj +eval "3+3"
bashj +eval "3.5*5.5"
或在 bashj 脚本中,此类 java 调用:
#!/usr/bin/bashj
EXPR="3.0*6.0"
echo $EXPR "=" u.doubleEval($EXPR)
FUNCTIONX="3*x*x+cos(x)+1"
X=3.0
FX=u.doubleEval($FUNCTIONX,$X)
echo "x="$X " => f(x)=" $FUNCTIONX "=" $FX
注意有趣的速度:每次调用约 10 毫秒(答案由 JVM 服务器提供)。
另请注意,u.doubleEval(1/2) 将提供 0.5(浮点)而不是 0(整数)
【讨论】:
在这方面可能有用的一个用例是,如果您的一个操作数本身是 bash 命令,那么试试这个。
echo $(( `date +%s\`+10 )) 甚至echo $(( `date +%s\`+(60*60) ))
在我的例子中,我试图让 Unixtime 分别比当前时间晚 10 秒和一个小时。
【讨论】: