Як робити обчислення цілих чи плаваючих чисел у bash чи інших мовах / рамках?


294

Використання echo "20+5"буквально створює текст " 20+5".

Яку команду 25в цьому випадку можна використовувати для отримання числової суми ?

Крім того, який найпростіший спосіб зробити це, просто використовуючи bash для плаваючої точки? Наприклад, echo $((3224/3807.0))принти 0:(.

Я шукаю відповіді, використовуючи або основну командну оболонку ("командний рядок"), або використовуючи мови, доступні з командного рядка.


1
Якщо ви збираєтеся зіткнутись bc, можливо, вам варто почитати про -lпараметр на сторінці man.
glenn jackman

Я припускаю, що автор запитує командний рядок bash, тоді як відповіді всі мають тенденцію до диверсифікації на всі види мов сценаріїв.
цинкування

2
man bash → / вираз
ДМИТРИЙ МАЛИКОВ

1
@zinking Ну, bash створений так, щоб зручно було легко викликати перекладачів для великої кількості інших мов сценарію.
Випадково832

Навчіть цілий поділ bash з результатами з плаваючою комою: stackoverflow.com/a/24431665/3776858
Сайрус

Відповіді:


399

Варіантів багато!

Підсумок

$ printf %.10f\\n "$((10**9 * 20/7))e-9"   # many shells. Not mksh.
$ echo "$((20.0/7))"                       # (ksh93/zsh/yash, not bash)
$ awk "BEGIN {print (20+5)/2}"
$ zcalc
$ bc <<< 20+5/2
$ bc <<< "scale=4; (20+5)/2"
$ dc <<< "4 k 20 5 + 2 / p"
$ expr 20 + 5
$ calc 2 + 4
$ node -pe 20+5/2  # Uses the power of JavaScript, e.g. : node -pe 20+5/Math.PI
$ echo 20 5 2 / + p | dc 
$ echo 4 k 20 5 2 / + p | dc 
$ perl -E "say 20+5/2"
$ python -c "print(20+5/2)"
$ python -c "print(20+5/2.0)"
$ clisp -x "(+ 2 2)"
$ lua -e "print(20+5/2)"
$ php -r 'echo 20+5/2;'
$ ruby -e 'p 20+5/2'
$ ruby -e 'p 20+5/2.0'
$ guile -c '(display (+ 20 (/ 5 2)))'
$ guile -c '(display (+ 20 (/ 5 2.0)))'
$ slsh -e 'printf("%f",20+5/2)'
$ slsh -e 'printf("%f",20+5/2.0)'
$ tclsh <<< 'puts [expr 20+5/2]'
$ tclsh <<< 'puts [expr 20+5/2.0]'
$ sqlite3 <<< 'select 20+5/2;'
$ sqlite3 <<< 'select 20+5/2.0;'
$ echo 'select 1 + 1;' | sqlite3 
$ psql -tAc 'select 1+1'
$ R -q -e 'print(sd(rnorm(1000)))'
$ r -e 'cat(pi^2, "\n")'
$ r -e 'print(sum(1:100))'
$ smjs
$ jspl

Деталі

Раковини

Ви можете використовувати арифметичне розширення POSIX для цілої арифметики echo "$((...))":

$ echo "$((20+5))"
25
$ echo "$((20+5/2))"
22

Досить портативний ( ash dash yash bash ksh93 lksh zsh):
Використовуючи можливість printf друкувати поплавці, ми можемо розширити більшість оболонок, щоб зробити математику з плаваючою комою, хоча і з обмеженим діапазоном (не більше 10 цифр):

$ printf %.10f\\n "$((1000000000 *   20/7  ))e-9"
2.8571428570

ksh93, yashі zshпідтримка плаває тут:

$ echo "$((1.2 / 3))"
0.4

тільки ksh93(безпосередньо) та zshзавантажуючи бібліотеку mathfunc тут:

$ echo "$((4*atan(1)))"
3.14159265358979324

( zshпотрібно завантажити, zmodload zsh/mathfuncщоб отримати такі функції, як atan).


Інтерактивно з zsh:

$ autoload zcalc
$ zcalc
1> PI/2
1.5708
2> cos($1)
6.12323e-17
3> :sci 12
6.12323399574e-17

З (t) csh (лише ціле число):

% @ a=25 / 3; echo $a
8

У rcсімействі оболонок akanga- це той, що має арифметичне розширення:

; echo $:25/3
8

POSIX інструментарій

bc(див. нижче для інтерактивного режиму), посібник тут

Мнемонічний: best calculator (хоча bнасправді є базовим ).

$ echo 20+5/2 | bc
22
$ echo 'scale=4;20+5/2' | bc
22.5000

(підтримує довільні точні числа)


bc інтерактивний режим:

$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
5+5
10

2.2+3.3
5.5

Рішення рішення Rushexpr (без інтерактивного режиму):

$ expr 20 + 5
25
$ expr 20 + 5 / 2
22

Рішення Джошуа : awk(немає інтерактивного режиму):

$ calc() { awk "BEGIN{print $*}"; }
$ calc 1/3
0.333333

Інші більш-менш портативні інструменти

Рішення Arcege , dc(інтерактивний режим :)dc :

Що ще веселіше, оскільки це працює за зворотною польською нотацією.

$ echo 20 5 2 / + p | dc 
22
$ echo 4 k 20 5 2 / + p | dc 
22.5000

Але це не так практично, якщо ви багато не працюєте з зворотною нотацією.

Зауважимо, що dcраніше bcі bcраніше був реалізований як обгортка, dcале dcне був стандартизований POSIX


DQdims «s calc(потрібно sudo apt-get install apcalc):

$ calc 2 + 4
6

Перекладачі мови загального призначення:

рішення manatwork , node(інтерактивний режим :;node функція виводу не потрібна):

$ node -pe 20+5/2  # Uses the power of JavaScript, e.g. : node -pe 20+5/Math.PI
22.5

Perl (інтерактивний режим:) perl -de 1:

$ perl -E "say 20+5/2"
22.5

Python (інтерактивний режим python:; функція виводу не потрібна):

$ python -c "print(20+5/2)"
22 # 22.5 with python3
$ python -c "print(20+5/2.0)"
22.5

Також підтримує довільні точні числа:

$ python -c 'print(2**1234)'
295811224608098629060044695716103590786339687135372992239556207050657350796238924261053837248378050186443647759070955993120820899330381760937027212482840944941362110665443775183495726811929203861182015218323892077355983393191208928867652655993602487903113708549402668624521100611794270340232766099317098048887493809023127398253860618772619035009883272941129544640111837184

Якщо ви clispвстановили, ви також можете використовувати польські позначення:

$ clisp -x "(+ 2 2)"

Рішення Марко , lua(інтерактивний режим:) lua:

$ lua -e "print(20+5/2)"
22.5

PHP (інтерактивний режим:) php -a:

$ php -r 'echo 20+5/2;'
22.5

Ruby (інтерактивний режим irb:; функція виводу не потрібна):

$ ruby -e 'p 20+5/2'
22
$ ruby -e 'p 20+5/2.0'
22.5

Guile (інтерактивний режим :)guile :

$ guile -c '(display (+ 20 (/ 5 2)))'
45/2
$ guile -c '(display (+ 20 (/ 5 2.0)))'
22.5

S-Lang (інтерактивний режим slsh:; функція виводу не потрібна, лише ;термінатор):

$ slsh -e 'printf("%f",20+5/2)'
22.000000
$ slsh -e 'printf("%f",20+5/2.0)'
22.500000

Tcl (інтерактивний режим tclsh:; функція виводу не потрібна, але exprє):

$ tclsh <<< 'puts [expr 20+5/2]'
22
$ tclsh <<< 'puts [expr 20+5/2.0]'
22.5

Оболонки Javascript :

$ smjs
js> 25/3
8.333333333333334
js>

$ jspl
JSC: 25/3

RP: 8.33333333333333
RJS: [object Number]
JSC:
Good bye...

$ node
> 25/3
8.333333333333334
>

Різні SQL:

SQLite (інтерактивний режим :)sqlite3 :

$ sqlite3 <<< 'select 20+5/2;'
22
$ sqlite3 <<< 'select 20+5/2.0;'
22.5

MySQL :

mysql -BNe 'select 1+1'

PostgreSQL :

psql -tAc 'select 1+1

_ Параметри на mysql та postgres зупиняють зображення "мистецтва ascii"!

Спеціалізовані математично орієнтовані мови:

R у звичайному режимі - дозволяє генерувати 1000 звичайних випадкових чисел та отримати стандартне відхилення та роздрукувати його

$ R -q -e 'print(sd(rnorm(1000)))'
> print(sd(rnorm(1000)))
[1] 1.031997

R за допомогою сценарію littler - дозволяє друкувати пі в квадраті

$ r -e 'cat(pi^2, "\n")'
9.869604
$  r -e 'print(sum(1:100))'
[1] 5050

PARI / GP , розгалужена система комп'ютерної алгебри для теорії чисел, лінійної алгебри та багатьох інших речей

$ echo "prime(1000)"|gp -q
7919                        // the 1000th prime
$ echo "factor(1000)" | gp -q
[2 3]
[5 3]                       // 2^3*5^3
$ echo "sum(x=1,5,x)" | gp -q
15                          // 1+2+3+4+5

GNU Octave (мова для інтерпретації високого рівня, призначена в першу чергу для чисельних обчислень)

Також підтримує складні номери:

$ octave
>> 1.2 / 7
ans =  0.17143
>> sqrt(-1)
ans =  0 + 1i

Юлія , високоефективна мова та перекладач наукових та чисельних обчислень.

Неінтерактивний варіант:

$ julia -E '2.5+3.7'
6.2

3
і bc цікаво: whatis bc-> An arbitrary precision calculator language Цікаво! Дякую!
Майкл Дюрант

@MichaelDurrant Ви могли б переглянути свої зміни, я, мабуть, помилково відхилив?
lgarzo

4
Є ще dc, що ще веселіше, оскільки це працює за зворотною польською нотацією. echo 20 5 + p | dc Але це не так практично, якщо ви багато не працюєте з зворотною нотацією.
Арседж

2
Як зміну підходу до bc, я додав наступну функцію (яку я десь знайшов у stackexchange) до свого файлу .bashrc. Я можу просто ввести calc 2 + 3 і отримати 5. ## Command line calculator calc () { bc -l <<< "$@" }
Джо

1
@Chris, риба - рухома мета. Вони працюють над своїм новим mathвбудованим (або як він зараз називається), як ми говоримо. Не соромтеся редагувати. Це не моя відповідь, а це вікі спільноти.
Стефан Шазелас

35

Існує багато способів розрахунку. Для простих виразів ви можете використовувати bashсебе:

echo $((20+5))

або expr:

expr 20 + 5

А для складних випадків є чудовий інструмент bc:

echo "20+5" | bc

Btw, bc може обчислити навіть дуже складний вираз із коренями, логарифмами, cos, sin тощо.


Я додав ваш exprваріант до прийнятої відповіді. Довелося вибрати одного, щоб прийняти та централізувати.
Майкл Дюрант

3
Ви намагаєтесь стратити expr 20+5. Вам потрібно ввести пробіли між числами і плюсами, щоб він працював : expr 20 + 5. Це важливо.
пік

24

Згадані рішення чудово підходять для дуже простих розрахунків, але дуже схильних до помилок. Приклади:

# without spaces expr 20+5 produces literally 20+5
expr 20+5
 20+5

# bc's result doesn't give the fractional part by default
bc <<< 9.0/2.0
 4

# expr does only integer
expr 9 / 2
 4

# same for POSIX arithmetic expansion
echo $((9/2))
 4

# bash arithmetic expansion chokes on floats
echo $((9.0/2.0))
 bash: 9/2.0: syntax error: invalid arithmetic operator (error token is ".0")

# Most `expr` implementations also have problems with floats
expr 9.0 / 2.0
 expr: non-integer argument

Помилка синтаксису, як і останні, легко помічається, але цілі відповіді з відкинутою плаваючою частиною можуть легко пройти непомітно і призвести до неправильних результатів.

Ось чому я завжди використовую для цього мову сценаріїв, як Lua. Але ви можете вибрати будь-яку мову сценаріїв, з якою ви знайомі. Я просто використовую Лую як приклад. Переваги є

  • знайомий синтаксис
  • знайомі функції
  • знайомі застереження
  • гнучка введення
  • пробіли зазвичай не мають значення
  • вихід з плаваючою комою

Приклади:

lua -e "print(9/2)"
 4.5

lua -e "print(9 / 2)"
 4.5

lua -e "print(9.0/2)"
 4.5

lua -e "print (9 /2.)"
 4.5

lua -e "print(math.sqrt(9))"
 3

2
bcРезультат не є цілим числом, а просто округляється до того scale, хто за замовчуванням має значення 0. Отже, bc <<< 'scale=4;9.0/2.0'якщо ви хочете дробову частину.
манатура

Дякуємо за виправлення. Але все-таки це схильність до помилок. Чи потрібно згадати, scaleякщо я буду користуватися bcчерез пару тижнів? Напевно, ні. І навіть якщо є спосіб його постійно змінити, він буде кусати вас, якщо ви працюєте в системі з налаштуваннями за замовчуванням.
Марко

3
Особисто я пам’ятаю про те, scaleяк я зустрівся bcвперше років тому. Але я завжди забув вихід функція luaє putабо puts. ;)
манатура

Просто зараховуйте bc як одну з мов сценаріїв. Я завжди знаю, чи потрібні мені цілі результати, чи ні - якщо ціле число добре, я залишаюсь у bash, інакше в мене рідко є підстави використовувати bc. Для lua ви повинні пам'ятати -e, друк та круглі дужки.
користувач невідомий

7
Просто завжди використовуйте, bc -lа не просто bc, тоді ніколи не переживайте scale.
Dalker

23

Ніхто ще не згадав про awk?

Використовуючи функції оболонки POSIX та awk math power, просто визначте цю (одну лінію) функцію:

calc(){ awk "BEGIN { print $*}"; }

Тоді просто виконайте такі речі, як calc 1+1абоcalc 5/2

Примітка. Щоб функція завжди була доступною, додайте її до ~ / .bashrc (або відповідний файл запуску оболонки)

Звичайно, невеликий сценарій під назвою "calc" із наступним змістом:

#!/bin/sh -
awk "BEGIN { print $* }"

може також працювати.


2
Ух, це найкраще, навіть підтримує поплавці. Він працює, не встановлюючи нічого!
CMCDragonkai

1
Дуже приємно, я хотів мати плаваюче порівняння, ось як я це зробив з вашою допомогою:a=0; b=0.0; if echo "$a" "$b" | awk '{ exit ($1 == $2) ? 0 : 1 }'; then echo 'equals'; else echo 'not equals'; fi
Пол Тобіас

18

Ви можете використовувати bc. Наприклад,

$ echo "25 + 5" | bc
30

Альтернативно bc <<< 25+5також буде працювати.

Або інтерактивно, якщо ви хочете зробити більше, ніж просто один простий розрахунок:

$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
25 + 5
30

Реалізація GNU bcдрукує інформацію про заголовок / авторські права при запуску, коли і його stdin, і stdout переходять до терміналу. Ви можете придушити його за допомогою параметра (для GNU) -q. Для отримання додаткової інформації див сторінку man man


1
+1 як для труб ("|"), так і для інтерактивного режиму для bs. Виходить ctrl-dна вихід?
Майкл Дюрант

1
@MichaelDurrant Так, ^ D зробить трюк як завгодноquit
Левон

c () { bc -l <<< "$@" } визначить функцію c для швидкого та простого використання. наприклад c 3/2, дасть вам 1.50000000000000000000. Посилання у наведеному вище описі того, як це зробити, є мертвим.
ijoseph

1
@ Левон посилання на сторінку чоловіка все ще працює. Однак з'являється посилання: paweng.com/2008/08/15/unix-command-line-calculator , яке ви вказали як ціль "Це" у реченні "На цій сторінці також показано, як налаштувати псевдонім ..." мертвий.
ійосеф

1
@ijoseph Дякую .. Я видалив посилання на це 6-річне посилання (бажаю, щоб посилання чіткіше виділялися в моєму браузері - навіть не бачив, коли я вчора подивився)
Левон

16

Ви можете використовувати calc:

Якщо ви просто не входите calcбез інших аргументів, він переходить в інтерактивний режим, де ви можете просто продовжувати займатися математикою. Ви виходите з цього, ввівши вихід:

C-style arbitrary precision calculator (version 2.12.3.3)
Calc is open software. For license details type:  help copyright
[Type "exit" to exit, or "help" for help.]

; 2+4
6
; 3+5
8
; 3.4+5
8.4
; 2^4
16
; exit

Або ви використовуєте його з виразом як аргумент, і він надасть відповідь і потім вийде

$calc 2 + 4
    6
$

calcподібний до bcмене, мені просто подобається, як краще поводитись як за замовчуванням


1
Вам не потрібно входити в інтерактивний режим, якщо ви цього особливо не хочете, наприклад: calc -e '2+4; 3+5; 3.4+5; 2^4друкує 4 вихідні рядки або просто calc -e 33+(3^3).. +1 Мені подобається ідея використовувати для калькулятора щось, що називається "calc" :)
Peter.O

1
Я щойно зрозумів, що -eваріант не потрібен, коли є лише один вираз ... акуратний! ..
Peter.O

10

Мені подобається запускати Python і використовувати його як інтерактивний калькулятор (але знову ж таки, я програміст Python).


я також! Python - мій швейцарський армійський ніж
Левон

У мене завжди є одне вікно в screenпросто запущеному Python.
Арседж

1
pythonpy ( github.com/russell91/pythonpy ) - це приємний спосіб зробити це та інші речі в синтаксисі python, не запускаючи інтерактивну оболонку: py '3.2 * 5' => 16
RussellStewart

Мені подобається python, але час запуску стає важливим, якщо ви просто хочете додати два числа у кількох місцях вашого скрипту bash
ndemou

@ndemou Я сказав "інтерактивний" калькулятор. Хоча також варто зазначити, що в якийсь момент, якщо ви робите досить складні речі в сценарії, розумність наказує вам використовувати щось інше, ніж баш (наприклад, Python).
asmeurer

10

Оскільки ніхто інший цього не згадував, і хоча це не суворо калькулятор (але це також не всі ці сценарії загального призначення), я хотів би зазначити units:

$ units "1 + 1"
        Definition: 2
$ units "1 lb" "kg"
        * 0.45359237
         / 2.2046226

Або для меншої кількості результатів, щоб ви могли отримати просто число, яке потрібно використовувати $()для присвоєння чомусь:

$ units -t "1 + 1"
2
$ units -t "1 lb" "kg"
0.4539237

І це навіть робить перетворення температури

$ units -t "tempC(20)" "tempF"
68

Щоб отримати перетворення температури в виразі для подальшого розрахунку, зробіть це:

$ units -t "~tempF(tempC(20))+1"
68.1

Існує так багато варіантів, що не вимагає встановлення додаткової програми, що я не бачу, чому можна було б піти таким шляхом.
ndemou

@ndemou На деяких дистрибутивах він встановлений за замовчуванням ... і багато інших відповідей це не так. І чи справді вам потрібно було коментувати відповідь, якій вже п’ять років?
Випадково832

1
Я думаю, що добре коментувати, коли я проголосую, і це також заохочує ДП, я не розумію, чому п’ять років є актуальними. Цей же коментар стосується всіх подібних відповідей - нічого особистого. (BTW навіть найбільш незрозумілу програму можна встановити за замовчуванням на деякому розповсюдженні. У цьому випадку я протестував останні установки Debian, Ubuntu, CentOS і RedHat і одиниць немає)
ndemou

6
$> ghc -e '20 + 5'
25
it :: Integer

Крім того ghci, саме компілятор Глазго-Хаскелла в інтерактивному режимі ( ghc --interactiveна відміну від нього, що оцінює вираз із -e), створює захоплюючий "калькулятор":

$>ghci
GHCi, version 7.8.3: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> pi
3.141592653589793
Prelude> ceiling pi
4
Prelude> compare 1 2
LT

3
Це ghcозначає компілятор Глазго Хаскела?
манатура

беручи пропуск на програми, які мені потрібно встановити, але thx.
Майкл Дюрант

4

Я не можу повірити, що читаю "потужність JavaScript" (але мені довелося підтримати відповідь на інші частини, за винятком perl, звичайно.

Практично для простих випадків, коли ціла арифметика достатня, я використовую buildin $ ((...)) і рекомендую його. Ще, майже у всіх випадках лунає "..." | bc достатня.

Для деяких арифметичних операцій, таких як статистика, матричні операції та інше, Rє кращим інструментом:

echo 25 + 5 | R --vanilla

а для невеликих наборів даних та результатів графічного викидання oocalc- це приємна утиліта.


4

Я використовую невеликий скрипт python, який оцінить вираз python і надрукує результат, тоді я можу запустити щось на кшталт

$ pc '[i ** 2 for i in range(10)]'
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

сценарій:

#!/usr/local/bin/python3

import sys
import traceback
from codeop import CommandCompiler

compile = CommandCompiler()
filename = "<input>"
source = ' '.join(sys.argv[1:]) + '\n'

try:
    code = compile(source, filename) 
except (OverflowError, SyntaxError, ValueError):
    type, value, sys.last_traceback = sys.exc_info()
    sys.last_type = type
    sys.last_value = value
    if filename and type is SyntaxError:
        # Work hard to stuff the correct filename in the exception
        try:
            msg, (dummy_filename, lineno, offset, line) = value.args
        except ValueError:
            # Not the format we expect; leave it alone
            pass
        else:
            # Stuff in the right filename
            value = SyntaxError(msg, (filename, lineno, offset, line))
            sys.last_value = value
    lines = traceback.format_exception_only(type, value)
    print(''.join(lines))
else:
    if code:
        exec(code)
    else:
        print('incomplete')

На жаль, я не пам'ятаю, звідки я запозичив більшу частину коду, тому не можу це навести.


не print(eval(' '.join(sys.argv[1:])))зробив би те саме?
g.rocket

Ви використовуєте молоток, щоб вдарити сюди муху
ndemou

4

Гнуплот

gnuplot - інтерактивна програма побудови графіку
Перейдіть за вищенаведеним посиланням або наберітьgnuplotформу підказки, а потімhelpвсерединіінтерпретатора gnuplot .
Gnuplot - це програма, яка народжується для побудови даних, але також може використовуватися для обчислення. Перевага дає змогу визначати функції та використовувати вбудовані функції.

echo  "pr 20+5/2"  |  gnuplot          #  Lazy-note `pr` instead of print
22                                     #  Integer calculation & result
echo  "pr 20.+5/2"  |  gnuplot         #  Lazy-note `pr` instead of print
22.0                                   #  Floating point result
echo  "pr sin(2*pi/3.)"  |  gnuplot    #  Some functions ...
0.866025403784439

Корінь (або інший перекладач C )

Система ROOT надає набір структур OO з усією функціональністю, необхідною для обробки та аналізу великої кількості даних дуже ефективним способом ...

Ви можете використовувати його в якості C перекладача , CINT , або ви можете використовувати один з багатьох багатьох інших інтерпретаторів C . ІМХО, це величезна, складна, потужна і не завжди доброзичлива, але може також принести велике задоволення.

Якщо ви справді не хочете прислухатися до маленького голосу всередині вас, який цитує Confucio, і ви готові зламати (масло) муху на колесі, ви можете використовувати root . У цьому випадку -lобов'язково уникати показу екрана ...

echo  "20+5/2"   | root -l
(const int)22
echo  "20+5/2."  | root -l
(const double)2.25000000000000000e+01

echo  "cout<< 20+5/2 << endl;"   | root -l
22

4

Для арифметики цілого числа (де 3/2 = 1)

  • bash echo $(( 1+1 ))
  • fish math 1+1
  • zsh* echo $((1+1))

*: і кш93, яш

Для арифметики з плаваючою комою (де 3/2 = 1,5)

  • bash awk "BEGIN {print 10/3}" (низька точність)
  • bash echo "10/3"|bc -l (висока точність)
  • fish math -s4 10/3
  • zsh* echo $((10./3))

*: і кш93, яш

Звичайно, ви можете налаштувати свою оболонку для використання awk з мінімальним набором тексту calc 10/3(див. Примітки про те, як це зробити для bash 1 та fish 2 ).

Основна причина, на яку можна запропонувати awk для bash, полягає в тому, що він попередньо встановлений майже на всіх Unix-подібних ОС і є досить легким (звичайно, варто запустити процес) з менш точним, але більш зручним для людини результатом, ніж bc -lякий друкує 20 десятків цифр (хоча ви, звичайно, можете налаштувати awk, щоб отримати більше десяткових цифр ).


Примітки

(1) Як використовувати спрощений синтаксис у bash

Додайте цю функцію bash до своїх ~/.bashrc:

calc(){ awk "BEGIN { print $*}"; }

(2) Як використовувати спрощений синтаксис у рибі

Створіть функцію calcриби (тобто текстовий файл з назвою /home/ndemou/.config/fish/functions/calc.fish):

function calc
    awk "BEGIN{ print $argv }" ;
end

awkбуде використовувати doubleтип плаваючої крапки у вашій системі , тому він буде таким же точним, як і більшість інших інструментів, які не роблять довільної точності (зауважте, що gawk може робити довільну точність). awkвикористовує OFMTзмінну для перетворення числа в їх рядкове представлення для виведення ( %.6gза замовчуванням, ви можете змінити це, якщо %.17gви хочете більш високої точності ).
Стефан Шазелас

Зауважте, що fishs math- це лише функція, яка викликає bc(хоча це зміниться )
Stéphane Chazelas

1
Ну, це була функція, яка дзвонить bc. Це вже не в нових версіях, де такі речі math "scale=4; 10/3"більше не працюватимуть ( math -s4 10/3замість цього зараз)
Stéphane Chazelas

Дякую, Стефан Шазелас - я оновив свою відповідь ( math -s4схоже, підтримується і в старих версіях)
ndemou

3

Для консольних розрахунків я використовую concalc. ( sudo aptitude install concalc)

Після цього просто введіть concalc і натисніть Enter. Він не надасть підказку, але просто введіть свій розрахунок (немає пробілів) і натисніть клавішу Enter, а в наступному рядку він дасть вам числове значення.


3

SQLite :

echo 'select 1 + 1;' | sqlite3 

MySQL :

mysql -e 'select 1 + 1 from dual;'

PostgreSQL :

psql -c 'select 1 + 1 as sum;'

3
Деякі незначні деталі, які варто згадати: 1) from dualOracle потрібен, MySQL може selectбез fromзастережень. 2) PostgreSQL не вимагає псевдоніму. 3) ;Потрібен лише SQLite. 4) MySQL і PostgreSQL працюватимуть лише в тому випадку, якщо вони здатні підключитися до сервера баз даних. 5) MySQL та PostgreSQL намалюють ASCII-таблицю мистецтва навколо результатів. Щоб отримати лише значення: mysql -BNe 'select 1+1'і psql -tAc 'select 1+1.
манатура

2

Використовуйте бібліотеку множинної точності арифметики GNU через додану run-exprпрограму:

  • Завантажте та витягніть (вам знадобиться lzip): tar -xvf gmp-5.1.3.tar.lz
  • У верхньому каталозі ./configureта make(не потрібно встановлювати)
  • У демо-версії / expr, make run-expr
  • Мені подобається створити символічне посилання на нього у своєму ~/binкаталозі:ln -s /path/to/gmp/demos/expr/run-expr ~/bin/run-expr
  • Додайте псевдонім для зручного використання; наприклад, alias calcf='run-expr -f'для оцінки з плаваючою комою

Вихід:

# calcf '2/3'
"2/3" base 0: result 0.666666666666666666667e0

З run-expr.cфайлу:

Usage: ./run-expr [-z] [-q] [-f] [-p prec] [-b base] expression...

   Evaluate each argument as a simple expression.  By default this is in mpz
   integers, but -q selects mpq or -f selects mpf.  For mpf the float
   precision can be set with -p.  In all cases the input base can be set
   with -b, or the default is "0" meaning decimal with "0x" allowed.

Дивіться посібник щодо відмінностей та деталей класів функцій.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.