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


19

Проблема:

Раз у раз мені потрібно робити просту арифметику в середовищі командного рядка. EG дано наступний вихід:

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.


3
Якщо ви маєте намір зробити це в інтерактивному режимі , вам не потрібно вводити quitв bc; натискання ctrl-Dбуде робити, як і в будь-якій інтерактивній програмі.
marcelm

2
dcє (ІМО) набагато перевершує bc.
Вільям Перселл

1
Я думаю, що нерозподілений простір між ptn 3 та 5 має бути 236 - 192, а не 236 - 128?
Цифрова травма

@DigitalTrauma гарне око! (Це був лише приклад, і ніхто цього не помітив!)
Fabby

1
@JanM. Я той, хто підтримав .... ;-)
Фабі

Відповіді:


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це якраз те, що мені потрібно! :-) (відповідь оновлена, щоб зробити це зрозумілішим)
Fabby

А якщо ви маєте плаваючу крапку: c 'scale = 2; 17/3 '(або краще, змініть масштабну змінну, яка використовується у функції' c () ', і визначте її значення, коли вам потрібно мати n десяткових цифр. За замовчуванням - 0.)
Олів'є Дулак

1
Скоріше використовуйте bc -lу визначенні функції, щоб зробити її більш дієздатною.
Ісаак

22

Оболонка

Найпростіший вапняно в CLI є CLI (оболонка) сама по собі (якщоIFS це по замовчуванню):

$ echo $(( 22 + 333 ))
355

Пробіли можна опустити:

$ echo $((22*333))
7326

Оскільки він є частиною POSIX, майже всі оболонки мають його. І вона включає більшість функцій математики мови C (за винятком того, що 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

в командному рядку.


1
Не ідеально, але досить добре, щоб отримати нагороду. Неправильне розуміння було виправлено в чаті та супроводі, видаленими іншим користувачем . Видалено власну (нижчу) відповідь ... ;-)
Fabby


9

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

$ units "236-192"
    Definition: 44
$ 

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


3
Це універсальний: units -t -d 10 "236GB - 192GB" GBвиходи 44, units -t -d 15 "236GB - 192GB" bytesвиходи 44000000000, і т.д.
АРУ

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
Фабі

2
$((...))називається Арифметичне розширення і воно є частиною POSIX: pubs.opengroup.org/onlinepubs/9699919799/utilities/… Для мене найбільшим недоліком цієї функції оболонки POSIX є те, що вона підтримує лише цілу арифметику :(
pabouk

6

Що я роблю в zsh:

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

У баші, я повинен явно згадати кота:

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

Якби я хотів, щоб результат включав дробові цифри (працює в zsh, а не в bash), я би додав точку радіації до одного з операндів

$ <<< $(( 236 / 128 )) 
1
$ <<< $(( 236. / 128 ))
1.84375

7
echo $((236 - 128))працює теж ;-).
Стівен Кітт

Уникайте zsh : 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'.


Я прочитав TOC керівництва, але не зміг знайти нічого про CLI. (+1 тим часом)
Fabby

1
Дякуємо @Fabby. Я заплутався, і частина CLI насправді трохи відрізняється. Я оновив відповідь, щоб уточнити.
Спархак

Я б хотів, щоб я міг вас висловити двічі! ;-)
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
@ Дев тонни Unix люди люблять PS
phuclv

2

dc -e '236 192-p'

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


Так, переглянув Калькулятор на робочому столі 3 хвилини і знав, що це не для мене: я був TI, а не студент HP.
Фабі

2

Якщо у вас встановлений gradle, у вас є groovy ...

Якщо groovy зафіксовано правильно, ви повинні мати можливість використовувати:

groovy -e "println 1+1"

Це може здатися зайвим у всіх інших прикладах, але:

  • groovy - потужна мова
  • можливо, найкраща бібліотечна підтримка
  • потужні та прості математичні функції (як математика довільної точності)
  • використовує перенаправляючий stdout для його виводу, тому він дивно гнучкий (чудово використовувати всередині пакетних файлів із задніми клавішами `` тощо).

Якщо у вас не встановлено Java, напевно, не варто встановлювати groovy & java - це лише варіант, якщо groovy вже доступний.


Ні, не дуже, але акуратна ідея все одно! :-) +1
Fabby

2

Ви пробували concalc ?

Опис: консольний калькулятор concalc - це калькулятор для консолі Linux. Це просто алгоритм аналізатора extcalc, упакованого в просту консольну програму. Ви можете використовувати його, якщо вам потрібен калькулятор у вашій оболонці. concalc також може запускати сценарії, написані на мові програмування, подібної С.

$ concalc 1+1
2
$ concalc sqrt2
1.41421356237309505

Встановити за допомогою:

sudo apt-get install concalc

1
доказ ... Graag gedaan ... :-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: Джерело


1
(1) Вирішили використовувати echo "$*" | bc -lяк shebang, який ви використовували, /bin/shі я не знаю, чи є у вас ksh / bash / zsh. (2) Зауважте, що ви можете змінити масштаб, щоб обчислити, чи виконуєте ви, наприклад, "c" шкала = 60; 777/333 '. Сподіваюся, що це допомагає @Fabby
Ісаак

1

Якщо встановлено python, ви можете виконати багато математичних операцій через командний рядок. Я спробував навести приклад нижче.

Я використав, що python3ти можеш використовувати python. Різниця між pythonі python3виникає при поділі (дробовій) операції, щоб уникнути проблеми, див. Нижче python vs 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

Експонент - x до сили y (x ^ y):

$ 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 x = log10 (x):

$ 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
>>> 

Це воно. Щасливого кодування!


0

Або bcчи qalc.


Щоб автоматично було bcзавжди округлення до двох цифр: (запустивши його-l нелегко для щоденних матеріалів)

Відредагуйте ~/.bashrc:

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

Відкрийте нову оболонку і біжіть bcтуди.


-1

Створення однолінійки:

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

Тепер ви можете використовувати просту цілу математику:

$ c 1+1
2

$ c 25*4
100

$ c 25*4-10
90

$ c 20*5/4
25

Про це вже йшлося у відповіді Ісаака .
Стівен Кітт

@StephenKitt Так, я підтримав дуже детальну відповідь Ісаака. Я подумав, що корисний буде один підводний підсумок, який резюмує щось із того, що він розмістив. Використання ${1}параметра є унікальним для всіх відповідей.
WinEunuuchs2Unix

2
Я закликаю вас розглянути причини, які інші відповіді не використовують ${1};-)
Стівен Кітт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.