Bash:评估一个数学术语?

Posted

技术标签:

【中文标题】Bash:评估一个数学术语?【英文标题】:Bash: evaluate a mathematical term? 【发布时间】:2011-02-02 20:57:51 【问题描述】:
echo 3+3

如何在 Bash 中评估此类表达式,在本例中为 6?

【问题讨论】:

【参考方案1】:
echo $(( 3+3 ))

【讨论】:

【参考方案2】:

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

【讨论】:

expr 不仅处理整数,在 expr 之后才正常工作。 expr ( "0.5" \ 【参考方案3】:

在 zsh/ksh 等 shell 中,您可以使用浮点数进行数学运算。如果您需要更多数学能力,请使用bc/awk/dc等工具

例如

var=$(echo "scale=2;3.4+43.1" | bc)
var=$(awk 'BEGINprint 3.4*43.1')

看看你想做什么

awk 'printf "%.2f\n",$0/59.5' ball_dropping_times >bull_velocities

【讨论】:

对 AWk 的评论标志有任何想法吗?如果我想明确说明我的测量格式?只阅读列可能会令人困惑。 我不明白。通过问题中的示例说明您的意思 POP - 管道的力量! | bc 获得我个人的认可印章 OP 专门询问了 bash【参考方案4】:

您可以将expr 命令用作:

expr 3 + 3

要将结果存储到变量中,您可以这样做:

sum=$(expr 3 + 3)

sum=`expr 3 + 3`

【讨论】:

我想补充一点(因为这篇文章显然是为 Unix 初学者准备的)最后一行的反引号是这样的,所以 shell 在 sum 被分配之前评估 epr 3 + 3【参考方案5】:

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

expr 3 + 3

【讨论】:

【参考方案6】:

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

【讨论】:

*nix 进程被设计成非常轻量级和快速的,这正是这个原因。因此,考虑到常见用法的整体脚本性能,使用外部二进制文件并没有那么慢。【参考方案7】:

感谢 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

【讨论】:

把这个放到你的问题中。此外,您可以只使用一个 awk 命令。它解析文件,并处理十进制数学。看我的回答。 您正在使用重定向运算符>,它每次都会截断(覆盖)目标文件。将其更改为附加运算符>> 或将重定向放在done 之后而不是bc 之后,如下所示:done > ball_velocities【参考方案8】:

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

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

【讨论】:

【参考方案9】:

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

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

在我的例子中,我试图让 Unixtime 分别比当前时间晚 10 秒和一个小时。

【讨论】:

以上是关于Bash:评估一个数学术语?的主要内容,如果未能解决你的问题,请参考以下文章

数学表达式评估

评估数学表达式的最佳和最短方法

从字符串评估数学表达式并将其插入堆栈

如何有条件地评估 bash 脚本

sh Bash:让:评估算术

为啥没有在动态 SQL 中评估数学条件?