Ракушка
Простейший известково в CLI является CLI (оболочка) сама по себе (если IFS
это по умолчанию):
$ echo $(( 22 + 333 ))
355
Пробелы могут быть опущены:
$ echo $((22*333))
7326
Поскольку он является частью POSIX, почти все оболочки имеют его. И он включает в себя большинство математических функций языка Си (за исключением того, что zsh имеет другой приоритет, установите C_PRECEDENCES, чтобы восстановить его в совместимое значение):
$ echo $((22*333^2))
7324
И некоторые оболочки имеют большую часть математического синтаксиса языка Си (включая запятую):
$ echo $((a=22,b=333,c=a*b,c))
7326
Но это только целочисленная математика (и обычно менее 2 63 в современных операционных системах) в некоторых оболочках:
$ echo $((1234/3))
411
$ zsh -c 'echo $((2**63))'
-9223372036854775808
Некоторые снаряды могут делать плавающую математику:
$ ksh -c 'echo $((1234/3.0))'
411.333333333333333
$ ksh -c 'echo $((12345678901234567890123/3.0))'
4.11522630041152263e+21
Избегайте zsh (у zcalc есть похожие проблемы):
$ zsh -c 'echo $((12345678901234567890123 + 1))'
zsh:1: number truncated after 22 digits: 12345678901234567890123 + 1
-1363962815083169259
Я рекомендую вам избегать expr
, иногда нужны странные побеги:
$ expr 22 \* 333
7326
До нашей эры
На следующем уровне ( также POSIX ) bc
(двоюродный брат RPN dc
)
$ echo '22*333' | bc
7326
$ echo '22 333 * p' | dc
7326
dc
Был POSIX , но был удален в 2017 году .
Короче, если ваша оболочка это поддерживает:
$ bc <<<'22*333'
7326
Или даже:
$ <<<'22*333' bc
7326
Оба калькулятора произвольной точности с некоторыми внутренними математическими функциями:
$ bc <<<2^200
1606938044258990275541962092341162602522202993782792835301376
$ echo 's(3.1415/2)' | bc -l # sine function
.99999999892691403749
AWK
После этих действительно базовых инструментов калькуляции вам нужно перейти на другие языки
$ awk "BEGIN {print (22*33)/7}"
103.714
$ perl -E "say 22*33/7"
103.714285714286
$ python3 -c "print(22*33/7)"
103.71428571428571
$ php -r 'echo 22*33/7,"\n";'
103.71428571429
функция
Вы можете определить функцию любой из вышеперечисленных опций:
c ()
{
local in="$(echo " $*" | sed -e 's/\[/(/g' -e 's/\]/)/g')";
gawk -M -v PREC=201 -M 'BEGIN {printf("%.60g\n",'"${in-0}"')}' < /dev/null
}
И использовать:
$ c 22* 33 /7 # spaces or not, it doesn't matter.
103.714285714285714285714285714285714285714285714285714285714
quit
вbc
; Нажатиеctrl-D
сделает, как в любой интерактивной программе.