echo 3+3
我该如何在Bash中评估这样的表达式,以便得到6?
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
echo 3+3 | bc
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
获得了我的个人认可。 - Sridhar Sarnobatexpr
是20世纪70年代的产物。自从POSIX.2在90年代初出版以来,shell就必须支持sum=$((3 + 3))
,这更加高效。 - Charles Duffy我认为((3+3))方法是最快的,因为它由shell解释而不是外部二进制文件。使用所有建议的方法来计时一个大循环以获得最高效率。
fork()
+execve()
比在Windows上更便宜,但仍然比在已经运行的进程中执行操作要慢得多。人们轻易地执行昂贵的操作,这是“整体脚本性能”被普遍认为速度不可接受的原因之一。 - Charles Duffy感谢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
。 - Dennis Williamson在这方面可能有用的一个用例是,如果你的操作数本身是一个bash命令,那么尝试这个。
echo $(( `date +%s\`+10 ))
或者甚至是 echo $(( `date +%s\`+(60*60) ))
在我的情况下,我正在尝试获取比当前时间晚10秒和1小时的Unix时间。
我对数学处理的理解涉及浮点处理。
使用bashj(https://sourceforge.net/projects/bashj/),您可以简单地调用一个带有浮点处理、cos()、sin()、log()、exp()等的Java方法。
bashj +eval "3+3"
bashj +eval "3.5*5.5"
或者在bash脚本中,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
$(( ))
和expr
一样标准,自从早在90年代初期的 POSIX.2 中就已经被指定,并且执行速度更快。相比之下,let
只是为了向后兼容1980年代的 ksh 而存在于 bash 中。(与此相反,没有前导$
的(( ))
是 bash 的扩展功能)。 - Charles Duffyexpr
副本提供的任何浮点支持都是非标准扩展。 - Charles Duffy