Простой калькулятор командной строки

19

Выпуск:

Время от времени мне нужно делать простую арифметику в среде командной строки. ЭГ дал следующий вывод:

Disk /dev/sdb: 256GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system     Name  Flags
 1      1049kB  106MB   105MB   fat32                 hidden, diag
 2      106MB   64.1GB  64.0GB  ext4
 3      64.1GB  192GB   128GB   ext4
 5      236GB   256GB   20.0GB  linux-swap(v1)

Какой простой способ вычислить в командной строке размер нераспределенного пространства между разделами 3 и 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'. 
236-192
44
quit

где жирный шрифт выше все вещи мне нужно ввести , чтобы сделать простой , 236-192как bc 1+1эхо - сигналыFile 1+1 is unavailable.

выраж

expr 236 - 192

где мне нужно вводить пробелы до и после оператора, как expr 1+1просто эхо 1+1.

Fabby
источник
3
Если вы собираетесь сделать это в интерактивном режиме, вам не нужно вводить quitв bc; Нажатие ctrl-Dсделает, как в любой интерактивной программе.
марта
2
dc(ИМО) намного превосходит bc.
Уильям Перселл
1
Я думаю, что нераспределенное пространство между ptn 3 и 5 должно быть 236 - 192, а не 236 - 128?
Цифровая травма
@DigitalTrauma хороший глаз! (Это был просто пример, и никто его не заметил!)
Fabby
1
@JanM. Я тот, кто проголосовал .... ;-)
Fabby

Ответы:

33

Вы можете значительно уменьшить объем многословия при использовании bc:

$ bc <<<"236-192"
44
$ bc <<<"1+1"
2

(если ваша оболочка это поддерживает).

Если бы вы предпочли это как функцию:

$ c() { printf "%s\n" "$*" | bc }
$ c 1+1
2

Сохраните cопределение в вашем любимом файле запуска оболочки, если вы хотите, чтобы оно всегда было доступно.

Стивен Китт
источник
2
bc<RET>236-128<RET>quit<RET>16 нажатий клавиш. bc<<<"236-128"<RET>это 15 нажатий клавиш. Не то, что я бы назвал «значительно уменьшенное количество печатания» :-) Кроме того, bcможно выйти с помощью ^D, поэтому первый вариант уменьшен до 13 нажатий клавиш (считая ^Dдва).
Л. Леврел
Да, это больше о многословии ;-).
Стивен Китт
2
@ L.Levrel С помощью функции это c 1+1именно то, что мне нужно! :-) (ответ обновлен, чтобы прояснить
ситуацию
И если вы делаете с плавающей запятой: c 'scale = 2; 17/3 '(или лучше, масштабировать переменную, используемую внутри функции' c () ', и определять ее значение всякий раз, когда вам нужно иметь n десятичных цифр. По умолчанию - 0.)
Оливье Дюлак
1
Скорее используйте bc -lв определении функции, чтобы сделать его более способным.
Исаак
22

Ракушка

Простейший известково в 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
Исаак
источник
20

Читая комментарии на этой странице , я вижу UNIX / Linux-программу, calcкоторая делает именно то, что вы хотите. Если на Debian / Ubuntu / производные:

sudo apt-get install apcalc

тогда ты можешь:

calc 236-192

и если вы добавите псевдоним alias c='calc'к вашему .bashrcили /etc/bash.bashrcтогда он просто становится:

c 1+1

в командной строке.

number9
источник
1
Не идеально, но достаточно хорошо, чтобы поднять голос. Исправлено недоразумение в чате и удалено другим пользователем . Удален мой собственный (
неполный
15

В zsh:

$ autoload zcalc # best in  ~/.zshrc
$ zcalc
1> 1+1
2
2> ^D
$ zcalc 5+5
1> 10
2>
Стефан Шазелас
источник
9

unitsПрограммы, в то время как не предназначены для использования в качестве калькулятора, на самом деле работает довольно хорошо , как один.

$ units "236-192"
    Definition: 44
$ 

Если в выражении есть пробелы, то выражение должно быть защищено кавычками.
Поддерживает экспоненты и глубокое вложение скобок

CSM
источник
3
Это универсально: units -t -d 10 "236GB - 192GB" GBвыходы 44, units -t -d 15 "236GB - 192GB" bytesвыходы 44000000000и т. Д.
agc
6

Как отмечалось в комментарии к предыдущему ответу, стандартная оболочка (ba) sh позволяет оценивать арифметические выражения внутри $((...)) . Я не мог дважды проверить, является ли это частью стандарта POSIX, но я проверял, что он также работает на Cygwin и оболочке Mingw32.

Чтобы увидеть результат, вам действительно нужно набрать echo $((...)), что делает некоторые символы более (интерактивное использование) bc. Однако, чтобы использовать результат в сценарии, это, скорее всего, будет короче, чем bcрешение (которое может быть, например, `echo ...|bc`).

Что касается многословия, bcкоманда разрешает опцию, -qкоторая подавляет вывод «обычного bcприветствия GNU » .

В качестве последнего, слегка ограничивающего замечания, отметим, что bcэто не просто калькулятор, а полноценный язык программирования (включая пользовательские функции, циклы & для и т. Д. И т. Д.). Еще один факт, который предлагает предпочесть встроенные арифметические возможности для таких простых вычислений, а не внешней программе. Тем не менее, извлечение данных для заданных номеров разделов и работа с суффиксами «M», «G», как казалось, требовалось в первоначальном вопросе, может потребовать, (g)awkа не bc.

Источники: https://www.gnu.org/software/bc/manual/html_mono/bc.html https://www.gnu.org/software/gawk/manual/html_node/Getting-Started.html

Максимум
источник
Благодарность! Отличный первый ответ! +1
Fabby
2
$((...))называется Arithmetic Expansion и является частью POSIX: pubs.opengroup.org/onlinepubs/9699919799/utilities/… Для меня самым большим недостатком этой функции оболочки POSIX является то, что она поддерживает только целочисленную арифметику :(
pabouk
6

Что я делаю в Zsh:

$ <<< $(( 236 - 192 ))
44

В bash я бы явно упомянул cat:

$ cat <<< $(( 236 - 192 ))
44

Если бы я хотел, чтобы результат включал дробные цифры (работает в zsh, а не в bash), я бы добавил точку радиуса к одному из операндов

$ <<< $(( 236 / 128 )) 
1
$ <<< $(( 236. / 128 ))
1.84375
Йол
источник
7
echo $((236 - 128))тоже работает ;-).
Стивен Китт
Избегайте ЗШ: zsh -c 'print $((12345678901234567890123 + 1))' zsh:1: number truncated after 22 digits: 12345678901234567890123 + 1 -1363962815083169259.
Исаак
@ Isaac, по крайней мере, zsh говорит, что он усекается; Bash просто дает вам неправильный ответ без жалоб.
Стивен Китт
@StephenKitt Проблема с zsh более сложна, чем один вывод. Сравните: zsh -c 'print $((12345678901234567890123 + 1))'иzsh -c 'print $((123456789012345678901 + 1))' . Он усекается на разную длину и дает разные числовые результаты.
Исаак
@StephenKitt Вместо Bash следует руководству (и языку C о переполнении со знаком int). Не то чтобы мне лично это нравилось, но это задокументировано как таковое. Пытатьсяbash -c 'echo $((1<<63))' `` bash -c 'echo $ (((1 << 63) -1))' `.
Исаак
6

Лично мне нравится libqalculate (версия Qalculate для командной строки ).

$ qalc
> 236-192

  236 - 192 = 44

Хотя интерфейс, конечно, прост, (lib) qalculate - мощный, полноценный калькулятор. например

> fibonacci(133) to hex

  fibonacci(133) = approx. 0x90540BE2616C26F81F876B9

> 100!

  factorial(100) = approx. 9.3326215E157

> sin(pi)

  sin(pi * radian) = 0

Он также делает полезные вещи, такие как завершение табуляции, открывать / закрывать скобки, когда это необходимо, и печатает свою интерпретацию запроса.

> 18-2)/4

  (18 - 2) / 4 = 4

Чтобы выйти, я просто нажимаю Ctrl+ d.

Для еще более быстрого доступа установите что-то вроде alias ca='qalc'.

Sparhawk
источник
Я прочитал оглавление руководства, но не смог найти ничего о CLI. (+1 тем временем)
Fabby
1
Спасибо @ Фабби. Я запутался, и часть CLI фактически немного отличается. Я обновил ответ, чтобы уточнить.
Sparhawk
Хотел бы я дважды проголосовать за тебя! ;-)
Fabby
4

Python открыть в другой вкладке?

Python 3.6.3 (v3.6.3:2c5fed8, Oct  3 2017, 17:26:49) [MSC v.1900 32 bit (Intel)] on 
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 3+3
6
>>>
Майкл Хирн
источник
Нет, не совсем, но в любом случае это хорошая идея! :-) +1
Fabby
PowerShell также может делать то же самое
phuclv
1
@phuclv да, но никто не любит PS
Dev
3
@Dev тонн Unix люди любят PS
phuclv
2

dc -e '236 192-p'

... конечно, если вы не знакомы dcи вам нужно больше, чем вычитать два числа, вы потратите больше времени на поиск способов использования dc(и, возможно, RPN в целом), чем сэкономите с помощью более знакомых методов.

Аарон Томас
источник
Да, я в течение 3 минут посмотрел на Desk Calculator и знал, что это не для меня: я был TI, а не студент HP.
Fabby
2

Если у вас установлен Gradle, то у вас есть отличный ...

Если groovy исправлен правильно, вы можете использовать:

groovy -e "println 1+1"

Это может показаться немного избыточным со всеми другими примерами, но:

  • Groovy это мощный язык
  • возможно лучшая доступная поддержка библиотеки
  • мощные и простые математические функции (как математика произвольной точности)
  • для вывода использует перенаправляемый stdout, поэтому он поразительно гибок (отлично подходит для использования внутри пакетных файлов с обратными символами `` и т.п.).

Если у вас не установлена ​​java, то, вероятно, не стоит устанавливать groovy & java - это просто вариант, если groovy уже доступен.

Билл К
источник
Нет, не совсем, но в любом случае это хорошая идея! :-) +1
Fabby
2

Вы пробовали Concalc ?

Описание: консольный калькулятор concalc - это калькулятор для консоли Linux. Это просто алгоритм синтаксического анализа extcalc, упакованный в простую консольную программу. Вы можете использовать его, если вам нужен калькулятор в вашей оболочке. concalc также может запускать скрипты, написанные на C-подобном языке программирования.

$ concalc 1+1
2
$ concalc sqrt2
1.41421356237309505

Установить с помощью:

sudo apt-get install concalc
Ян М.
источник
1
доказательство ... Грааг Гедан ... :-D
Fabby
2

До того, как были опубликованы любые другие блестящие ответы, я создал сценарий, /usr/local/bin/cсодержащий:

#!/bin/sh
IFS=' '               # to be on the safe side, some shells fail to reset IFS.
if [ "$#" -eq 0 ];  then
    echo "$(basename "$0"): a (very) simple calculator."
    echo "type $(basename "$0") expression to evaluate (uses bc internally)"
fi

printf '%s\n' "$*" | bc -l  # safe for most shells
                            # we may use 'bc -l <<<"$*"` for ksh, bash, zsh

итак: печатать c 1+1урожайность 2! :-)

Примечание 1: я использовал, cпотому что эта команда не существует ни в одной системе Unix, которую я мог найти. Если вы добавили это в свой компилятор c, используйте что-нибудь короткое и не используйте его.
Примечание 2: Источник

Fabby
источник
1
(1) Решили использовать echo "$*" | bc -lв качестве шебанга, который вы использовали, /bin/shи я не знаю, есть ли у вас ksh / bash / zsh. (2) Обратите внимание, что вы можете изменить масштаб для вычисления, например, если вы выполните `c 'scale = 60; 777/333'. Надеюсь, это поможет @Fabby
Исаак
1

Если Python установлен, вы можете сделать много математических операций через командную строку. Я попытался привести пример ниже.

Я использовал, python3вы можете использовать python. Разница между pythonи python3возникает при делении (дробной) операции, чтобы избежать этой проблемы, см. Ниже python против python3 .

Примечание. В последней версии всех дистрибутивов Linux по умолчанию установлены Python 2.7 и Python 3.5. В случае, если требуется установить Python, нажмите здесь .

Добавить, вычесть, умножить и разделить:

$ python3 <<< "print(12+3)"
15
$ python3 <<< "print(12-3)"
9
$ python3 <<< "print(12*3)"
36
$ python3 <<< "print(12/3)"
4

Модуль - остаток от деления:

$ python3 <<< "print(14%3)"
2

Этажное деление:

$ python3 <<< "print(14//3)"
4

Экспонента - х в степени у (х ^ у):

$ python3 <<< "print(3**2)"
9

Квадратный корень (например: √4 = 2):

$ python3 <<< "print(4**0.5)"
2

Более научная часть, вам потребуется импорт математической библиотеки. Пример:

Натуральный логарифм x = log (x):

$ python3 <<< "import math; print(math.log(4))"
1.386294361119890e6

Основание-10 логарифм х = log10 (х):

$ python3 <<< "import math; print(math.log10(10))"
1.0

Факториал (например: 3! = 3.2.1 = 6):

$ python3 <<< "import math; print(math.factorial(3))"
6

Trigonometry- sin(x), cos(x), tan(x):

$ python3 <<< "import math; print(math.sin(90))"
0.8939966636005579

Подробнее о математических функциях смотрите здесь .

pythonVs python3:

-Для разделения: (используйте float):

$ python <<< "print(10.0/3)"
3.33333333333

-вместо того

$ python <<< "print(10/3)"
3

Также вы можете использовать прямой терминал:

$ python3
Python 3.6.8 (default, Jan 14 2019, 11:02:34) 
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 1+3
4
>>> import math
>>> math.log10(4)
0.6020599913279624
>>> math.sqrt(4)
2.0
>>> 

Вот и все. Удачного кодирования!

AHJeebon
источник
0

Либо bcили qalc.


Для автоматического bcокругления до двух цифр: (запускать его с -lгромоздкими текстами для повседневных задач)

Отредактируйте ваш ~/.bashrc:

alias bc="BC_ENV_ARGS=<(echo "scale=2") \bc"

Откройте новую оболочку и запустите bcтам.

sjas
источник
-1

Создание однострочника:

$ c () { echo $(( ${1} )) }

Теперь вы можете использовать простую целочисленную математику:

$ c 1+1
2

$ c 25*4
100

$ c 25*4-10
90

$ c 20*5/4
25
WinEunuuchs2Unix
источник
Это уже обсуждалось в ответе Исаака .
Стивен Китт
@StephenKitt Да, я проголосовал за очень подробный ответ Исаака. Я подумал, что будет полезен однострочник с кратким изложением того, что он написал. Использование ${1}параметра является уникальным для всех ответов.
WinEunuuchs2Unix
2
Я призываю вас изучить причины, по которым другие ответы не используются ${1};-)
Стивен Китт