web-dev-qa-db-fra.com

Bash: évaluer un terme mathématique?

echo 3+3

Comment puis-je évaluer de telles expressions dans Bash, dans ce cas à 6?

32
hhh

dans les shells tels que zsh/ksh, vous pouvez utiliser des floats pour les maths. Si vous avez besoin de plus de puissance mathématique, utilisez des outils tels que bc/awk/dc

par exemple

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

en regardant ce que vous essayez de faire

awk '{printf "%.2f\n",$0/59.5}' ball_dropping_times >bull_velocities
12
ghostdog74
echo $(( 3+3 ))
72
Marcelo Cantos

expr est la méthode standard, mais elle ne gère que les entiers.

bash a quelques extensions, qui ne gèrent que les entiers également:

$((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 et (( )) peuvent être utilisés pour affecter des valeurs, par exemple.

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

pour une virgule flottante, vous pouvez utiliser bc

echo 3 + 3 | avant JC

27
Dan Andreatta

Use peut utiliser la commande expr en tant que:

expr 3 + 3

Pour stocker le résultat dans une variable, vous pouvez faire:

sum=$(expr 3 + 3)

ou

sum=`expr 3 + 3`
5
codaddict

Beaucoup de façons - la plus portable consiste à utiliser la commande expr :

expr 3 + 3
3
anon

Je crois que la méthode ((3 + 3)) est la plus rapide car elle est interprétée par le shell plutôt que par un fichier binaire externe . Fois une grande boucle utilisant toutes les méthodes suggérées pour la plus efficace.

2
The HCD

Résolu grâce à Dennis, un exemple d'utilisation en Colombie-Britannique:

$ cat calc_velo.sh

#!/bin/bash

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

Ma compréhension du traitement mathématique implique le traitement en virgule flottante.

En utilisant bashj ( https://sourceforge.net/projects/bashj/ ), vous pouvez appeler une méthode Java (avec un traitement en virgule flottante, cos (), sin (), log (), exp ) ...) en utilisant simplement

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

ou dans un script bashj, les appels Java de ce type:

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

Notez la vitesse intéressante: ~ 10 ms par appel (la réponse est fournie par un serveur JVM).

Notez également que u.doubleEval (1/2) donnera 0.5 (virgule flottante) au lieu de 0 (entier)

0
Fil