开发者

Bash: evaluate a mathematical term?

开发者 https://www.devze.com 2022-12-25 11:20 出处:网络
e开发者_JAVA百科cho 3+3 How can I evaluate such expressions in Bash, in thiscase to 6?echo $(( 3+3 ))
e开发者_JAVA百科cho 3+3

How can I evaluate such expressions in Bash, in this case to 6?


echo $(( 3+3 ))


expr is the standard way, but it only handles integers.

bash has a couple of extensions, which only handle integers as well:

$((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 and (( )) can be used to assign values, e.g.

let a=3+3
((a=3+3))

for floating point you can use bc

echo 3+3 | bc


in shells such as zsh/ksh, you can use floats for maths. If you need more maths power, use tools like bc/awk/dc

eg

var=$(echo "scale=2;3.4+43.1" | bc)
var=$(awk 'BEGIN{print 3.4*43.1}')

looking at what you are trying to do

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


You can make use of the expr command as:

expr 3 + 3

To store the result into a variable you can do:

sum=$(expr 3 + 3)

or

sum=`expr 3 + 3`


Lots of ways - most portable is to use the expr command:

expr 3 + 3


I believe the ((3+3)) method is the most rapid as it's interpreted by the shell rather than an external binary. time a large loop using all suggested methods for the most efficient.


Solved thanks to Dennis, an example of BC-use:

$ cat calc_velo.sh

#!/bin/bash

for i in `cat ball_dropping_times`
do
echo "scale=20; $i / 59.5" | bc 
done > ball_velocities


My understanding of math processing involves floating point processing.

Using bashj (https://sourceforge.net/projects/bashj/) you can call a java method (with floating point processing, cos(), sin(), log(), exp()...) using simply

bashj +eval "3+3"
bashj +eval "3.5*5.5"

or in a bashj script, java calls of this kind:

#!/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

Note the interesting speed : ~ 10 msec per call (the answer is provided by a JVM server).

Note also that u.doubleEval(1/2) will provide 0.5 (floating point) instead of 0 (integer)


One use case that might be useful in this regard is, if one of your operand itself is a bash command then try this.

echo $(( `date +%s\`+10 )) or even echo $(( `date +%s\`+(60*60) ))

In my case I was trying to get Unixtime 10 seconds and hour later than current time respectively.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号