48
echo 3+3

如何在 Bash 中评估此类表达式,在这种情况下为 6?

4

9 回答 9

106
echo $(( 3+3 ))
于 2010-03-31T10:42:01.133 回答
32

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 | 公元前

于 2010-03-31T10:47:36.243 回答
22

在 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
于 2010-03-31T10:55:23.310 回答
10

您可以将expr命令用作:

expr 3 + 3

要将结果存储到变量中,您可以执行以下操作:

sum=$(expr 3 + 3)

或者

sum=`expr 3 + 3`
于 2010-03-31T10:42:13.643 回答
3

很多方法 - 最便携的是使用expr命令:

expr 3 + 3
于 2010-03-31T10:41:44.340 回答
2

我相信 ((3+3)) 方法是最快的,因为它是由 shell 而不是外部二进制文件解释的。使用所有建议的方法为大循环计时,以获得最有效的时间。

于 2010-03-31T11:03:51.363 回答
1

感谢 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
于 2010-03-31T10:56:31.887 回答
0

在这方面可能有用的一个用例是,如果您的一个操作数本身是bash命令,那么试试这个。

echo $(( `date +%s\`+10 ))甚至echo $(( `date +%s\`+(60*60) ))

就我而言,我试图分别比当前时间晚 10 秒和 1 小时获得 Unixtime。

于 2019-06-19T23:29:35.823 回答
0

我对数学处理的理解涉及浮点处理。

使用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(整数)

于 2018-06-20T13:41:21.513 回答