Будь-який калькулятор командного рядка для Ubuntu?


119

Я шукаю калькулятор, який може робити обчислення в самому терміналі без будь-яких інших зайвих префіксів і суфіксів.

Наприклад: Якщо я набрав щось на зразок 10000-9000 в терміналі, відповідь повинна вийти як "1000".

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


1
Може бути пакети.ubuntu.com/ saucy/ apcalc ?
прокидання

2
Це може бути можливим , щоб зламати що - щось подібне з видом попереднього гака; але це саме по собі можна зробити тільки по-справжньому потворним і хакітським способом . Ні, я дуже думаю, що це не гарна ідея. Баш в цілому мається на увазі як звичайна мова сценаріїв вводу-виводу, все, що вона робиться, окрім цього, є більш-менш тимчасовим і не працює дуже добре. З іншого боку, Python (або навіть, наприклад, Haskell) - це сучасна універсальна мова програмування з великим синтаксисом. Тож було б просто дурно не користуватися цим.
близько

3
У цьому ж ключі ви також можете зробити щось із command_not_foundгачком та спробувати подати команду на bc/ calc/ що завгодно, якщо це буде нечітко схоже на математику. Але все ще відчувається трохи брудно.
хроніт

1
Зачекайте, що саме ви маєте на увазі "перейти на" пітон? і "без зайвих префіксів"? Ви хочете сказати, що хочете мати можливість обчислювати речі підказки, не виконуючи команди ?
Випадково832

Відповіді:


78

Арифметика Баша

Ще одне можливе рішення - додати просту функцію для вбудованої арифметики Баша. Помістіть це у свій .bashrcфайл, щоб спробувати:

=() {
    echo "$(($@))"
}

Тож зараз вам навіть $((...))більше не потрібно , =що здається досить природним.

Заміна

Інша справа, якщо ви хочете бути ще швидшими: ви можете змусити її замінити pна +і xна *. Це буде працювати для цього:

=() {
    local IFS=' '
    local calc="${*//p/+}"
    calc="${calc//x/*}"
    echo "$(($calc))"
}

= 5 x 5  # Returns 25
= 50p25  # Returns 75

Тепер вам навіть Shiftбільше не потрібно , єдине - це перед арифметикою.

Шестидесятковий вихід

Висновок може бути відображений як у десятковій, так і в шістнадцятковій формі, якщо це потрібно. ( Примітка : використання xпідстановки суперечить 0x...шістнадцятковому синтаксису)

=() {
    local answer="$(($@))"
    printf '%d (%#x)\n' "$answer" "$answer"
}

Приклад:

$ = 16 + 0x10
272 (0x110)

$ = 16**3 + 16**4
69632 (0x11000)

Використання bc

Якщо ви хочете трохи більш досконалі розрахунки, ви можете зробити bcтак, щоб так:

=() {
    local IFS=' '
    local calc="${*//p/+}"
    calc="${calc//x/*}"
    bc -l <<<"scale=10;$calc"
}

= 'sqrt(2)' # Returns 1.4142135623
= '4*a(1)'  # Returns pi (3.1415926532)

Функції, що надаються bcтакими (і їх можна знайти man bc):

sqrt ( expression )
       The value of the sqrt function is the square root of the expression.  
       If the expression is negative, a run time error is generated.

s (x)  The sine of x, x is in radians.

c (x)  The cosine of x, x is in radians.

a (x)  The arctangent of x, arctangent returns radians.

l (x)  The natural logarithm of x.

e (x)  The exponential function of raising e to the value x.

j (n,x)
       The Bessel function of integer order n of x.

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

Майте на увазі , що він замінить pі xв функції / імен змінних. Можливо, краще просто видалити заміни.

Використання gcalccmd

Ви також можете здійснити виклик функції gcalccmdgnome-calculator) так:

=() {
    local IFS=' '
    local calc="$*"
    # Uncomment the below for (p → +) and (x → *)
    #calc="${calc//p/+}"
    #calc="${calc//x/*}"
    printf '%s\n quit' "$calc" | gcalccmd | sed 's:^> ::g'
}

= 'sqrt(2)' # Returns 1.4142135623
= '4^4'     # Returns 256

Наявні функції, схоже, є (взяті прямо з вихідного коду ), ==позначають еквівалентні функції:

ln()
sqrt()
abs()
int()
frac()
sin()
cos()
tan()
sin⁻¹() == asin()
cos⁻¹() == acos()
tan⁻¹() == atan()
sinh()
cosh()
tanh()
sinh⁻¹() == asinh()
cosh⁻¹() == acosh()
tanh⁻¹() == atanh()
ones()
twos()

1
Дякую, чи можете ви додати більше підтримки в наукових розрахунках?
rɑːdʒɑ

2
@rajagenupula Дивіться мої зміни вище
kiri

Вибачте за цю пізню відповідь, але команда, яку ви дали для, gcalccmdпрацює не дуже добре. Це відображається, Error 3ймовірно, із-за того бродячого простору. Однак цей трохи модифікований працював для мене ідеально:echo -e "$calc\nquit"| gcalccmd | sed "s:^> ::g"
udiboy1209

Я побудував науковий аналіз за допомогою R! function = { R -q --vanilla -e "$@" | grep -E '[^>](.*)' -o -x --color=never }
Мортеза Мілані

Привіт, і дякую. Це досить круто. До речі, ваша заміна на "x" зробить його невдалим для шістнадцяткового введення, що в іншому випадку працює нормально. Якщо говорити про те, чи можу я отримати відповідь у «шістнадцятковій»? напр. = 2 + 0x20 34 (0x22)
FractalSpace

93

Ви можете виконати просту цілу арифметику на базі, використовуючи ((...))синтаксис, наприклад

$ echo $((10000-9000))
1000

Є також bcкалькулятор, який може приймати арифметичні вирази на стандартному вході

$ echo "10000-9000" | bc
1000

bcПрограма може зробити арифметику з плаваючою точкою , а також

$ echo "scale = 3; 0.1-0.09" | bc
.01

11
Це, мабуть, найближче, що можна отримати. Щоб скоротити додаткове введення тексту (хоч і не усунути його повністю), ви можете помістити функцію у свій ~ / .bashrc: calc()NL {NL echo "$@" | bcNL, }де NL - це новий рядок. Потім ви можете ввести calc 1234 + 768(друкує 2002) або будь-яку іншу формулу, яка bcможе інтерпретувати. Звичайно, ви можете використовувати будь-яке ім'я функції, я просто думав, що це calcдобре відповідає тому, що це робить.
CVn

4
раз python є кращим, ніж відлуння весь час. моя думка.
rɑːdʒɑ

6
Ви також можете використовувати bc інтерактивно, якщо вам не знадобиться ехо з іншої причини: просто запустіть bc та введіть вираз. Введіть Ctrl-D у власну лінію для виходу.
Марно

якщо ви зробили будь-яке автоматичне вираження, використовуючи псевдонім або щось інше, то це було б чудово.
rɑːdʒɑ

3
Не потрібно echo:bc <<< "2*2"
Бернхард

90

Можна використовувати calc. Не встановлено за замовчуванням, але ви можете швидко встановити його за допомогою наступної команди:

sudo apt-get install apcalc

Після встановлення ви можете зробити будь-який розрахунок, на який хочете:

$ calc 5+2
    7
$ calc 5-2
    3
$ calc 5*2          
    10
$ calc 5/2
    2.5
$ calc 5^2
    25
$ calc 'sqrt(2)' 
    1.4142135623730950488
$ calc 'sin(2)'
    0.9092974268256816954
$ calc 'cos(2)'
    -0.416146836547142387
$ calc 'log(2)'
    ~0.30102999566398119521
$ calc 'sqrt(sin(cos(log(2))))^2'
    ~0.81633199125847958126
$ # and so on...

Для отримання додаткової інформації перегляньте його чоловічу сторінку


2
Дякую за відповідь, я бачу, що відповідь має своє значення. Мені більше подобається про всі ці розрахунки тригонометричних функцій. будь-який посібник або деяка сторінка про те, що більше може зробити, може покращити відповіді на багато відповідей. :)
rɑːdʒɑ

@rajagenupula man calcі calc helpкаже все.
Radu Rădeanu

2
Моє намір полягає в тому, що якщо хтось дивиться на це, це повинно бути зрозумілим і швидким. спасибі.
rɑːdʒɑ

1
Насправді ви використовуєте calc help builtinдля перегляду списку підтримуваних функцій на кшталтsin()
Penghe Geng

Дає більше десяткових знаків, тому він краще підходить для моїх цілей, ніж вбудована арифметика в базі. Дякую.
Mrmfldmn

30

На жаль, "легшого" способу зробити це не існує. Інтерактивний інтерфейс пітон в командному рядку краще підходить для того, що вам потрібно, тому що в відміну від apcalc\, pythonбуде включений в Ubuntu. Я не впевнений, чи bcвключений досі, проте пітон є фаворитом цієї речі.

Ви можете просто запустити інтерактивний pythonінтерфейс у командному рядку, а потім зробити математику таким чином. Ви можете використовувати це як свій калькулятор.

Для цього ви відкриваєте термінал, набираєте python, а потім натискаєте Enterкнопку.

Потім, в Пітоні рядку , яка показує, ви можете ввести математику. Наприклад, 10000 - 9000. Наступний вихідний рядок - результат.


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

$ 10000 - 9000
1000
$

... тоді немає ніякого способу зробити це просто в терміналі без нічого іншого, тому що Bash не обробляє подібні числові аргументи.


1
Я згадував, що не хочу переходити на python
rɑːdʒɑ

1
@rajagenupula оновлено, також включив речі, про які я згадував у чаті.
Томас Уорд

bc більше не включається?
Випадково832

1
Як осторонь, ipythonце набагато корисніше, ніж стандартна оболонка Python, коли йдеться про розрахунки тощо.
Naftuli Kay

bc включено за замовчуванням (принаймні в 16.04)
TJ Ellis

23

Я б радив створити просту функцію для основних обчислень Python. Щось подібне у вашому .bashrc:

calc() {
    python3 -c 'import sys; print(eval(" ".join(sys.argv[1:])))' "$@"
}

calc 5 + 5
# Returns 10

result="$(calc 5+5)"
# Stores the result into a variable

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

calc() {
    python3 -c 'from math import *; import sys; print(eval(" ".join(sys.argv[1:])))' "$@"
}

calc 'sqrt(2)'  # Needs quotes because (...) is special in Bash
# Returns 1.4142135623730951

result="$(calc 'sqrt(2)')"
# Stores the result into a variable

(Примітка. Оскільки Python є мовою програмування, деякі речі можуть здаватися дивними, наприклад, **для повноважень та %для модуля)

Крім того, ви можете створити сценарій Python calc,

#!/usr/bin/python3
from math import *
import sys
print(eval(' '.join(sys.argv[1:])))

помістіть його в каталог, що входить до PATHзмінної, і встановіть його виконуваний прапор, щоб отримати таку ж calcкоманду, як вище (не потрібно створювати функцію Bash для запуску сценарію Python).

Якщо ви хочете метод в чистому Bash, використовуйте відповідь steeldriver. Ця відповідь справді корисна, лише якщо вам потрібні більш вдосконалені функції (тобто від math), оскільки Python порівняно повільний порівняно з Bash.


Я не впевнений, якщо це порушить ваш "перехід на пітон, він може це зробити, і я не хочу його таким чином". зауважте, але вам не потрібно вводити інтерактивне підказку, і результат доступний у Bash, тому ця відповідь здається вірною (як мінімум, для мене).


кожного разу всі вони повинні означати не так легко і гнучко. Дякую. якісь вдосконалення ви можете зробити так, щоб вони виглядали більш простими та зрозумілими? Я б це любив.
rɑːdʒɑ

1
@rajagenupula Ви можете покласти , що в функції у вашому .bashrc (можливо , з більш коротким ім'ям: c, ?або +?) , так що ви будете мати його кожен термінал при відкритті.
кірі

1
Остерігайтеся: З Python 3 це чудово працює, але якщо ви хочете використовувати Python 2, вам доведеться відредагувати фрагмент: в python2 -c "from __future__ import division; from math import *; print($*)"іншому випадку він завжди буде робити ціле поділ, наприклад, calc 5/2ви отримаєте 2замість цього 2.5. Дивіться тут для довідки: stackoverflow.com/a/183870/202504
jmiserez

Рішення Python насправді може бути кращим, ніж apcalc, оскільки ви можете імпортувати додаткові бібліотеки, і він підтримує літеральні piта e. Я вважаю, що викласти це як окремий сценарій є більш гнучким та портативним. Ось простий суть його: gist.github.com/jasongeng/279eb396c01e74beb9ef
Penghe Geng

21

Використовуйте gcalccmdз gnome-calculator(> = 13.04) або gcalctool(<13,04) пакета. Я думаю, що пакет встановлений за замовчуванням

% gcalccmd
> 2+3
5
> 3/2
1.5
> 3*2
6
> 2-3
−1
> 

Найкращий до цих пір .. Не потрібно робити зайвих справ, а також встановити за замовчуванням .. man gcalccmdкаже: консольний калькулятор . Просто, це саме те, чого хоче ОП .. :)
Саурав Кумар

Thats cool, схожий на bc, python, ocatve калькулятори. Дякую.
rɑːdʒɑ

Оскільки gcalccmd досить важко набрати, добре додати до нього псевдонім на ./bash_aliasesзразок «like» alias calc='gcalccmd'або якщо ви хочете зробити одноразові розрахунки (з миттєвою відповіддю), ви можете додати alias calc='gnome-calculator -s'- використання останнього: calc 2000/1300або calc 2+3. У цьому випадку немає необхідності виходити з калькулятора - він просто дає відповідь, і вам не потрібно вводити текст quit.
Рафаль

10

Ось швидкий сценарій оболонки для цього:

#!/bin/bash
echo "$@" | bc

Збережіть це як "c", а потім покладіть його десь у свій шлях (наприклад, / bin), а потім позначте його виконуваним.

# nano /bin/c
# chmod +x /bin/c

Відтепер ви можете проводити обчислення в терміналі так:

$ c 10000-9000
1000

Ви чудово, додавши лише один лист перед розрахунком, це справді класна ідея. це супер, якщо мені потрібно 2 - 3 розрахунки. Я можу піти на пітон чи інший довше, але коротше я вибираю це. Дякую, що завітали.
rɑːdʒɑ

2
Я б радив використовувати echo "$@" | bcзамість цього, щоб ви могли помістити пробіли в обчисленнях природніше
kiri

Як щодо використання =замість cназви цієї команди? Bash насправді дозволяє вам використовувати це як назву функції.
Каз

1
Ви можете помістити програми ~/bin(у домашній каталог bin) і переконатися, що вони /home/yourname/binє у вашому PATH.
Каз

@ minerz029 Гарне мислення. Я відповідно відредагував свою відповідь.
user530873

8

Ось модифікація відповідної частини /etc/bash.bashrc(на Ubuntu 10.04), яка модифікує command_not_foundобробник, щоб запустити оцінювач виразів оболонки, якщо першим символом невідомої команди є число або -або +.

Ви зможете виконати будь-яку арифметику оболонок таким чином; див. http://www.gnu.org/software/bash/manual/bashref.html#Shell-Arithmetic для списку арифметичних операторів.

Зауважте, що якщо вираз, який ви хочете оцінити, містить a *, вам доведеться навести цитату *з \або цитатами, оскільки оболонка виконає розширення імені файлів, перш ніж вирішити, яку команду запустити. Те саме для інших операторів, як >>.

Помістіть це у свій ~/.bashrc, а потім наберіть . ~/.bashrcі спробуйте.

# if the command-not-found package is installed, use it
if [ -x /usr/lib/command-not-found -o -x /usr/share/command-not-found ]; then
    function command_not_found_handle {
        if [[ $1 == [0-9+-]* ]]; then
           echo $(( $@ ))
        elif [ -x /usr/lib/command-not-found ]; then
           /usr/bin/python /usr/lib/command-not-found -- $1
           return $?
        elif [ -x /usr/share/command-not-found ]; then
           /usr/bin/python /usr/share/command-not-found -- $1
           return $?
        else
           return 127
        fi
    }
fi

Вибірка зразка: (Я набираю cta, помилка друку , просто щоб перевірити, що наш новий обробник command_not_found все ще намагатиметься шукати невідомі команди).

mp@ubuntu:~$ cta
No command 'cta' found, did you mean:
 Command 'cda' from package 'xmcd' (universe)
 Command 'cat' from package 'coreutils' (main)
cta: command not found
mp@ubuntu:~$ 9000-1000
8000

Чи є якийсь спосіб ми могли б додати більше підтримки для розрахунків?
rɑːdʒɑ

1
Ви можете взяти рядок, який говорить, echo $(( $@ ))і змінити його, замість цього, запустити одну з більш просунутих програм калькулятора, про яку згадували інші відповідачі, які беруть свої аргументи в командному рядку.
Марк Плотнік

8

Ще одне рішення, якого я не бачив тут, - Qalculate (qalc) .

sudo apt-get install qalc

для версії CLI,

sudo apt-get install qalculate-gtk

для GUI.

Він має купу функцій, таких як:

  • підтримка підрозділів : напр20 m / s * 12 h = 864 kilom
  • вбудовані константи , такі як pi, e, c,avogadro
  • багато вбудовані функції : наприклад sin(pi) = 0, gamma(4) = 6, 5! = 120,log(1024, 2) = 10
  • перетворення одиниці, наприклад:

> 120 in
120 * inch = 120 in
> convert cm
120 in = 304.8 centim

  • символічний розрахунок , наприклад(x + y)^2 = x^2 + 2xy + y^2
  • інтеграція, наприклад integrate 3*x^2 = x^3,diff sin(x), pi
  • вбудована допомога, наприклад help convert,help integrate
  • вкладка виконання команд
  • все перекладено, наприклад, моя система перекладена голландською мовою, тому я можу писати і factorial(5)і faculteit(5).
  • і більше...

Ви кажете, що хочете використовувати його без префіксів, ну ... ви можете використовувати його з префіксом:

$ qalc 5 ft + 3 cm
(5 * foot) + (3 * centim) = 1.554 m

а також запускати його як відтворення.


7

dc! Це частина coreutils, тому він встановлений на OS X, Ubuntu та багато іншого. Це калькулятор RPN, тому якщо вам це не подобається, це не для вас.

Дуже основні команди такі (manpage має весь синтаксис, який я не включав. Експоненціація, хтось?)

Вам потрібні лише пробіли між номерами. Вони ігноруються у всіх інших випадках.

Набравши номер, воно підштовхує його до верхньої частини стека.

+ Adds top 2 items in stack, then pushes result to stack (`2 4 +p` outputs 6)
- Subtracts top 2 items in stack, then pushes result to stack (`4 2 -p` outputs 2)
* Multiplies top 2 items in stack, then pushes result to stack (`6 5 *p` outputs 30)
/ Divides top 2 items in stack, then pushes result to stack (`54 7 /p` outputs 8)
p Print top item in stack, without destroying it
c Clear stack
r Swap top 2 items on stack
d Duplicate top item on stack
k Pops top item off stack, using it to determine precision (so 10 k would print 10 numbers after the decimal point). Default is 0, so it won't do floating point math by default.
n Pops top value off stack, then sends to stdout without a trailing newline
f Dump stack. Useful for finding what something does

Щойно помічено, це не дає відповіді на запитання (ані інших відповідей). Питання полягає в тому, як НЕ мати жодного матеріалу перед рівнянням (а не ззаду), а просто набрати, скажімо, 42 * 5термінал, і дати йому відповідь
Ще один користувач

2
Більшість відповідей не стосується. Введення 1+1в термінал майже ніколи не вийде. Тож ваша відповідь чудова
кірі

@YetAgetherUser Я думаю, що єдиний спосіб - це зламати не знайдені команди (якщо він встановлений) або зробити щось брудне в
bashrc

5

Я використовую Octave для подібних речей: http://www.gnu.org/software/octave/

Це майже клон матлаба (вибачення, якщо це надмірне спрощення), який можна використовувати в терміналі, набравши октаву. Встановіть sudo apt-get install octave

Це не зовсім те, що ви хочете, але я подумав, що додам це як альтернативу python.

Приклад використання:

~ $ octave
octave:1> 9000 - 8000
ans =  1000
octave:2> 

Запропонувати інший спосіб досягти поставленої мети - це чудово у відповіді, але ви повинні надати більше інформації про те, як ОП використовувала б Octave для задоволення заявлених потреб та чому це хороша альтернатива.
chaskes

2
+1, Octave, matlab, scilab, python - всі схожі, але октаву мені потрібно встановити, але попередньо встановлено python. тому я за замовчуванням переходжу до python. Дякую.
rɑːdʒɑ

з усього, що я спробував (і я намагався багатьох!) октава є єдиним, який повертає не 0 на синтаксичну помилку! Дякую!
Сила Водолія

5

Я дуже люблю wcalc. Це науковий калькулятор командного рядка. Їх легко знайти в програмному центрі Ubuntu або просто скористатися apt-get.

sudo apt-get install wcalc

Він приймає аргументи командного рядка, а також має режим "оболонки":

# simple operation
$ wcalc 2+2
 = 4
# Quoting is necessary to prevent shell from evaluating parenthesis
$ wcalc "(2+2)*10"                                                                                    
 = 40
$ wcalc "sqrt(25)"                                                                                    
~= 5
# in shell mode you can evaluate multiple commands repeatedly
$ wcalc
Enter an expression to evaluate, q to quit, or ? for help:
-> 12*20+1
 = 241
-> sin(90)
 = 1
-> sin(pi/2)
 = 0.0274121

І якщо хтось займається інженерією, як я, ви можете скористатися GNU Octave. Тут можна робити всілякі речі, графікувати, вирішувати одночасне рівняння. Плюс це безкоштовна альтернатива Matlab


... поєднання цього з @ minerz029 досить акуратне: розмістіть це у своїх ~ / .bash_aliases:=() { wcalc "$@" }
Frank Nocke

4

простий спосіб - викликати python.

Приклад:

>  python -c 'print 10000-9000'

Ви можете згадати щось із науковими розрахунками.
rɑːdʒɑ

1
Ви хочете щось подібне? python -c 'import math;print math.log(2)'
користувач1251007

3

Я знайшов, що я не можу довіряти expr, bc або вбудованим параметрам Shell. Отже, я використовував Perl, який зазвичай встановлюється в дистрибутиві Linux

perl -le 'printf "%.0f", eval"@ARGV"' "($VAL2-$VAL1)"

Наведений вище розрахунок буде віднімати $ VAL1 від $ VAL2 і друкувати без знаків після коми (0f)

Перевага від використання Perl є (деталі плюсів і мінусів перераховані тут )

  • Краще визначити помилку (ділення на 0 не зупинить обчислення)
  • Може надати формули у конфігураційному файлі. Не потрібно бігти, використовуючи складний регулярний вираз

але кожен раз ця команда означає будь-яку проблему в будь-якому випадку. Чи є якісь калькулятори на основі Perl, які будуть використані в терміналі?
rɑːdʒɑ

3

Ви можете додати у свій .bashrc файл наступну функцію:

function = {
  echo "$@" | bc -l
}

Зауважте, що -lпрапор дуже важливий. Без нього використання bcподарунків 5 / 2 = 2.

Як було зазначено вище, обчислення можна проводити, використовуючи =знак перед формулою.


3

Ви також можете використовувати awk, щоб зробити деякі арифметичні обчислення на терміналі,

echo 10000 9000 | awk '{print $1-$2}'
1000
echo 10000 9000 | awk '{print $1+$2}'
19000
echo 10000 9000 | awk '{print $1/$2}'
1.11111
echo 10000 9000 | awk '{print $1*$2}'
90000000

cool, awk (як октава) також повертає не 0 на синтаксичну помилку thx!
Сила Водолія

2

використовуйте команду "bc", і тоді ви можете робити розрахунок

приклад

[root@vaibhav ~]# bc

----------these lines will genrate automaicaly---------------

right 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 

---------------enter your calculation here---------------------------------------


10+2   

12

Для використання bcбез гарантійного запису пишіть у терміналbc -q

приклад

[root@vaibhav ~]# bc -q
10+2
12

bc вже пояснено і включено.
Брайам

2

Ви можете використовувати bind і bash C-aі C-eконтролювати вихід. Наприклад, виконайте це у своїй оболонці:

bind '"\C-j": "\C-aecho $(( \C-e )) \C-m"'

Тепер введіть будь-яку арифметичну операцію, наприклад 10 + 15, і натисніть Ctrl+ J:

$ echo $(( 10 + 15 )) 
25

Ви отримаєте це. Тепер, як це робиться?

  • bind ця команда змінює прив'язку вашого bash, як клавіші швидкого доступу.
  • \C-j це еквівалент bash Ctrl + J, ось яку комбінацію клавіш ми хотіли б додати до нашої команди.
  • \C-a це веде нас до початку рядка.
  • echo $((це пише echo $((на початку.
  • \C-e підводить нас до кінця рядка
  • )) закриває наші попередні дужки
  • \C-m це еквівалент ключа повернення.

Ви можете записати це у свій ~/.inputrcфайл:

"\C-j": "\C-aecho $(( \C-e )) \C-m"

Звичайно, і інші відповіді справедливі! Тільки підробили:

  • до н.е.: "\C-j": "\C-aecho " \C-e " | bc \C-m"
  • apcalc: "\C-j": "\C-acacl \C-m"
  • пітон: "\C-j": "\C-apython3 -c "print( \C-e )" \C-m"
  • будь-які інші?

Ви можете змінити Ctrl + J на ​​все, що завгодно, але пам’ятайте, намагайтеся не змінювати його на те, що вже має прив'язку;).

Ресурс:


У Ctrl + J вже є прив'язка, вона передає рядок (як Enter). Однак це насправді досить розумна відповідь;)
kiri

2

У минулому я використовував wcalcі невелику програму під назвою, eщо це майже неможливо в Google. Тепер для цього я використовую сценарій python, який використовує деякі функції, eнаприклад квадратні дужки. wcalcвсе ще приємно, оскільки він може робити довільну точність та перетворення одиниць, але я майже ніколи не використовую ці функції.

#!/usr/bin/env python3

"""
This is a very simple command line calculator.  It reads in all
arguments as a single string and runs eval() on them.  The math module
is imported so you have access to all of that.  If run with no
arguments, it allows you to input a single line expression.  In the
case of command line args, square brackets are replaced with round
parentheses, because many shells interpret round parentheses if they
are not quoted.
"""

import sys, numbers
import cmath, math

args = sys.argv[1:]

if len(args) < 1:
    expr = input()
else:
    expr = " ".join(args[:])
    expr = expr.replace("[", "(").replace("]", ")")

def log2(x):
    """Return the base-2 logarithm of x."""
    return cmath.log(x, 2)

# the smallest number such that 1+eps != 1
# (this is approximate)
epsilon = sys.float_info.epsilon

env = math.__dict__
env.update(cmath.__dict__)
env = {k:v for k,v in env.items() if not k.startswith("__")}
env["eps"] = epsilon
env["log2"] = log2
env["inf"] = float("inf")
env["nan"] = float("nan")

res = eval(expr, env)
# throw away small imaginary parts, they're probably just due to imprecision
if (isinstance(res, numbers.Number)
    and res != 0
    and abs(res.imag)/abs(res) < 10*epsilon):
    res = res.real

print(str(res).replace("(", "[").replace(")", "]"))

Ось як ним користуватися (якщо припустити, що сценарій збережено як eі десь у ньому $PATH):

$ e e**[pi*1i]
-1.0
$ e hex[10**3]
0x3e8
$ e "[0o400+3]&0xff" # need quotes because of '&'
3

приклад зробить це більш зрозумілим. Дякую.
rɑːdʒɑ

0

Є однокроковий спосіб досягти саме того, що ви хочете. Все, що вам потрібно зробити, - це встановити shellваш обліковий запис /bin/bc.


3
Чи можете ви, будь ласка, докладно? Pressume OP не знає, як змінити оболонку.
Брайам

0

Ви також можете використовувати printf вбудовану оболонку, щоб робити арифметичні обчислення на терміналі.

printf `expr $num1 + $num2`   # num1,num2 are  variables which stores numbers as values.

Приклад:

$ printf "$(expr 10000 + 9000)\n"
19000
$ printf "$(expr 10000 - 9000)\n"
1000

3
Таким чином, ви використовуєте expr (який не вбудований) для обчислення результату, printf тут зайвий
Хав'єр Лопес

0

Ви можете використовувати інтерпретатор python для розрахунку. Ось підручник про те, як це зробити .

Python 2 і python 3 встановлені в Ubuntu за замовчуванням.

$ python
Python 2.7.12 (default, Nov 19 2016, 06:48:10) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 2+2
4
>>> 3*5
15

0

Створіть калькулятор терміналів

Помістіть у файл .bashrc наступне

function calc
{
 echo "${1}"|bc -l;
}

Або запустіть його у підказці оболонки. Тепер "calc" з оболонки буде працювати наступним чином:

$ calc 3+45
   48

Усі функції з "(" або ")" повинні бути укладені в лапки.

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