Подтвердить что ты не робот

Bash: оцените математический термин?

echo 3+3

Как я могу оценить такие выражения в Bash, в этом случае - 6?

4b9b3361

Ответ 1

в оболочках, таких как zsh/ksh, вы можете использовать float для математики. Если вам нужна дополнительная математическая мощность, используйте такие инструменты, как 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

Ответ 2

echo $(( 3+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

эхо 3 + 3 | Ьс

Ответ 4

Вы можете использовать команду expr как:

expr 3 + 3

Чтобы сохранить результат в переменной, вы можете сделать:

sum=$(expr 3 + 3)

или

sum='expr 3 + 3'

Ответ 5

Множество способов - самая портативная - использовать команду expr:

expr 3 + 3

Ответ 6

Я считаю, что метод ((3 + 3)) является самым быстрым, поскольку он интерпретируется оболочкой, а не внешним двоичным. время большой цикл, используя все предложенные методы для наиболее эффективного.

Ответ 7

Решено благодаря Деннису, пример использования 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

Ответ 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 секунд и час позже, чем текущее время соответственно.