Každá kalkulačka příkazového řádku pro Ubuntu?

117

Hledám kalkulačku, která dokáže provádět výpočty v samotném terminálu bez dalších předpon a přípon.

Například: Pokud jsem do terminálu zadal něco jako 10000-9000, odpověď by měla vypadat jako 1000.

Opět říkám: Potřebuji jen rychlou kalkulačku v terminálu, aniž by byly přidány další znaky. Vím, že pokud přecházím na Python, může to udělat, ale nechci to tak.

    
dané rɑːdʒɑ 18.11.2013 03:37

23 odpovědi

73

Bash Aritmetika

Dalším možným řešením je přidat jednoduchou funkci pro vestavěnou aritmetiku Bash. Vložte toto do souboru.bashrc a vyzkoušejte:

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

Takže teď už nepotřebujete$((...)), jen=, což se zdá dost přirozené.

Nahrazení

Další věc, pokud chcete být ještě rychlejší: můžete nahraditp s+ ax s*. To bude fungovat takto:

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

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

Nyní již vůbec nepotřebujete Shift , jediná věc je před aritmetikou.

Hexadecimální výstup

Výstup může být zobrazen v desítkové nebo hexadecimální podobě, pokud je to požadováno. ( Poznámka : použití substitucex bude v konfliktu s syntaktem0x... hex)

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

Příklad:

$ = 16 + 0x10
272 (0x110)

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

Používáníbc

Chcete-li o trochu pokročilejší výpočty, můžete jej dobc takto:

=() {
    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)

Funkce poskytované pomocíbc jsou následující (a mohou být nalezeny zman 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.

Podporuje takéif,for,while a proměnné jako programovací jazyk, i když je lepší zapsat do souboru, pokud chcete.

Mějte na paměti, že bude nahrazovatp ax v názvech funkcí / proměnných. Možná by bylo lepší prostě odstranit náhradníky.

Používánígcalccmd

Můžete také volat funkcigcalccmd (zgnome-calculator) takhle:

=() {
    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

Zdá se, že dostupné funkce (pořízené přímo z zdrojového kódu ), == označuje ekvivalentní funkce:

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()
    
odpověděl kiri 19.11.2013 10:33
89

Můžete použít jednoduchou celočíselnou aritmetiku nativní v bash pomocí syntaxe((...)), např.

$ echo $((10000-9000))
1000

K dispozici je také kalkulačkabc, která může akceptovat aritmetické výrazy na standardním vstupu

$ echo "10000-9000" | bc
1000

Programbc může také provádět aritmetiku s plovoucí částí

$ echo "scale = 3; 0.1-0.09" | bc
.01
    
odpověděl steeldriver 18.11.2013 03:59
88

Můžete použít calc . Ve výchozím nastavení není nainstalována, ale můžete ji rychle nainstalovat pomocí následujícího příkazu:

sudo apt-get install apcalc

Po instalaci můžete provést libovolný výpočet:

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

Další informace naleznete v man-page

    
odpověděl Radu Rădeanu 18.11.2013 10:16
30

Bohužel, neexistuje žádný "snadnější" způsob, jak to udělat. Interaktivní rozhraní Pythonu na příkazovém řádku je nejvhodnější pro to, co potřebujete, protože na rozdíl odapcalc \,python je zahrnuto v Ubuntu. Nejsem si jistý, jestli jebc stále zahrnuto, nicméně python je oblíbeným favoritem pro tyto věci.

Stačí spustit interaktivní příkazpython na příkazovém řádku a pak to udělat matematickým způsobem. Můžete jej použít jako kalkulačku.

Chcete-li to provést, otevřete terminál, zadejtepython a potom stiskněte tlačítko Enter .

Potom se v příkazu Python, který se zobrazí, můžete zadat svou matematiku. Například10000 - 9000. Výsledek dalšího řádku je výsledkem.

Pokud máte na mysli něco, kde stačí načíst terminál a můžete to udělat ...

$ 10000 - 9000
1000
$

... pak neexistuje žádný způsob, jak to udělat v jen terminálu bez jakéhokoli jiného, ​​protože Bash nerobí takové argumenty.

    
odpověděl Thomas Ward 18.11.2013 03:40
23

Doporučuji vám vytvořit jednoduchou funkci pro základní výpočty Pythonu. Něco takového ve vašem.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

Chcete-li provést pokročilejší matematiku, můžete použít následující, který importuje všechny funkce modulumath. (pro více informací viz zde )

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

(Poznámka: Protože Python je programovací jazyk, některé věci se mohou zdát zvláštní, např.** pro síly a% pro modulo)

Alternativně můžete vytvořit skript Pythonucalc,

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

umístěte jej do adresáře zahrnutého v proměnnéPATH a nastavte její spustitelný příznak tak, abyste získali stejný příkazcalc, jak je uvedeno výše (není třeba vytvářet funkci Bash pro spuštění skriptu Python).

Chcete-li metodu v čistém Bashu, použijte odpověď od steeldriveru. Tato odpověď je prospěšná pouze tehdy, když potřebujete pokročilejší funkce (tj. Zmath), protože Python je relativně pomalý ve srovnání s Bash.

Nejsem si jist, jestli to přeruší vaše "přepnutí na Python to může udělat, a nechci to tak." ale nemusíte zadávat interaktivní výzvu a výsledek je dostupný v Bashu, takže se tato odpověď zdá být platná (alespoň pro mě).

    
odpověděl kiri 18.11.2013 09:45
21

Použijte balíčekgcalccmd zgnome-calculator (> = 13.04) nebogcalctool (<13.04). Myslím, že balíček je ve výchozím nastavení nainstalován

% gcalccmd
> 2+3
5
> 3/2
1.5
> 3*2
6
> 2-3
−1
> 
    
odpověděl Flint 18.11.2013 04:12
10

Zde je rychlý shellový skript:

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

Uložte to jako "c", pak jej vložte někde ve vaší cestě (například / bin) a označte jej spustitelným.

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

Od této chvíle můžete provádět výpočty v terminálu takto:

$ c 10000-9000
1000
    
odpověděl user530873 18.11.2013 06:19
8

Zde je změna příslušné části/etc/bash.bashrc (na Ubuntu 10.04), která upraví obslužný programcommand_not_found pro spuštění vyhodnocovače výrazů shellu, pokud první znak neznámého příkazu je číslo nebo- nebo+.

Tímto způsobem budete moci provádět jakoukoli aritmetiku shellu; viz Odkaz pro seznam aritmetických operátorů.

Všimněte si, že pokud výraz, který chcete vyhodnotit, obsahuje*, budete muset uvést* s\ nebo uvozovkami, protože shell provede rozšíření názvu souboru předtím, než rozhodne, který příkaz má běžet. Totéž platí pro jiné operátory, jako je>>.

Umístit to do vašeho~/.bashrc, zadejte příkaz. ~/.bashrc a vyzkoušejte to.

# 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 [[  == [0-9+-]* ]]; then
           echo $(( $@ ))
        elif [ -x /usr/lib/command-not-found ]; then
           /usr/bin/python /usr/lib/command-not-found -- 
           return $?
        elif [ -x /usr/share/command-not-found ]; then
           /usr/bin/python /usr/share/command-not-found -- 
           return $?
        else
           return 127
        fi
    }
fi

Vzorový výstup: (píšucta, překlep, jen abych otestoval, že se náš nový command_not_found handler stále pokusí hledat neznámé příkazy).

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
    
odpověděl Mark Plotnick 18.11.2013 18:05
8

Další řešení, které jsem zde nezmiňoval, je Qalculate (qalc) .

sudo apt-get install qalc

pro verzi CLI,

sudo apt-get install qalculate-gtk

pro GUI.

Má spoustu funkcí, jako například:

  • Podpora pro jednotky : např. 20 m / s * 12 h = 864 kilom
  • zabudované konstanty jako napříkladpi,e,c,avogadro
  • mnoho vestavěných funkcí : např. % ko_kde%,sin(pi) = 0,gamma(4) = 6,5! = 120
  • konverze jednotek, například:
  

log(1024, 2) = 10
% ko_kde%
> 120 in
120 * inch = 120 in

  • symbolický výpočet , např. > convert cm
  • integrace, např. % ko_kde%,120 in = 304.8 centim
  • vestavěná nápověda, např. % ko_kde%,(x + y)^2 = x^2 + 2xy + y^2
  • Dokončení příkazu
  • vše je přeloženo, např. můj systém je v holandštině, takže mohu napsat jakintegrate 3*x^2 = x^3 adiff sin(x), pi.
  • a další ...

Říkáte, že jej chcete používat bez předpon, takže ... můžete jej používat s předponou:

help convert

a spustit jej jako repl.

    
odpověděl JW. 26.11.2013 11:46
7

dc! Je to součást coreutilů, takže je nainstalován na OS X, Ubuntu a téměř všechno ostatní. Jedná se o kalkulačku RPN, takže pokud se vám to nelíbí, není to pro vás.

Velmi základní příkazy jsou následující (manpage má všechny syntaxe, které jsem nezahrnul. Exponentiation, anyone?)

Potřebujete pouze mezery mezi čísly. Jsou ignorovány ve všech ostatních případech.

Napíšete číslo na horní část zásobníku.

+ 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
    
odpověděl Yet Another User 18.11.2013 21:07
5

Používám Octave pro takové věci: Odkaz

Je to doopravdy matlabový klon (omlouváme-li se, že je to zjednodušení), které lze použít v terminálu zadáním oktávy. Nainstalujte sudo apt-get install octave

Není to úplně to, co chcete, ale myslela jsem si, že ji přidám jako alternativu k pythonu.

Příklad použití:

~ $ octave
octave:1> 9000 - 8000
ans =  1000
octave:2> 
    
odpověděl Andy T 18.11.2013 15:39
5

Líbí se mi hodně. Je to vědecká kalkulačka příkazového řádku. Snadno se nacházíte v softwarovém centru Ubuntu nebo stačí použít apt-get.

sudo apt-get install wcalc

Přijme argumenty příkazového řádku, stejně jako režim "shell":

# 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

A pokud je někdo v technice, jako já, můžete využít GNU Octave. Může dělat nejrůznější věci, grafovat, řešit současnou rovnici. Navíc je to volná alternativa k Matlabu

    
odpověděl Sergiy Kolodyazhnyy 22.09.2014 11:58
4

Jednoduchým způsobem je volání pythonu.

Příklad:

>  python -c 'print 10000-9000'
    
odpověděl user2327875 20.11.2013 14:35
3

Na co jsem zjistil, že nemohu důvěřovat expr, bc nebo vestavěným možnostem Shell. Proto jsem použil Perl, který by byl normálně instalován v linux distro's

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

Výše ​​uvedený výpočet odečte $ VAL1 z $ VAL2 a tiskne bez desetinných míst (0f)

Využijte výhody používání Perlu (podrobnosti o Výhody uvedené v tomto článku )

  • Lepší zachycení chyby (rozdělit na 0 nebude výpočet zastavit)
  • Může poskytovat vzorce v konfiguračním souboru. Není třeba unikat pomocí komplexního regexu
odpověděl diaryfolio 18.11.2013 11:14
3

Do souboru .bashrc můžete přidat následující funkci:

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

Všimněte si, že flag-l je velmi důležitý. Bez něj použijebc5 / 2 = 2.

Jak bylo výše zmíněno, výpočty lze provést pomocí značky= před vzorem.

    
odpověděl vdm 19.11.2013 14:51
3

Můžete také použít awk k provedení některých aritmetických výpočtů na terminálu,

echo 10000 9000 | awk '{print -}'
1000
echo 10000 9000 | awk '{print +}'
19000
echo 10000 9000 | awk '{print /}'
1.11111
echo 10000 9000 | awk '{print *}'
90000000
    
odpověděl Avinash Raj 05.01.2014 19:41
2

použijte příkaz "bc" a pak u proveďte výpočet

Příklad

[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

Chcete-li použítbc bez záruky, napište do terminálubc -q

Příklad

[root@vaibhav ~]# bc -q
10+2
12
    
odpověděl Vaibhav Jain 19.11.2013 08:18
2

K ovládání výstupu můžete použít příkazy bind a bash C-a a C-e . Spusťte to například ve vašem shellu:

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

Zadejte libovolnou aritmetickou operaci jako 10 + 15 a stiskněte Ctrl + J :

$ echo $(( 10 + 15 )) 
25

Získáte to. Tak, jak se to dělá?

  • bind tento příkaz změní vazbu vaší bash, jako klávesové zkratky.
  • \C-j Toto je bash ekvivalentní Ctrl + J, což je kombinace kláves, kterou bychom chtěli přidat do našeho příkazu.
  • \C-a nás přivede na začátek řádku.
  • echo $(( píšeecho $(( na začátku.
  • \C-e nás přivede na konec řádku
  • )) zavře naše předchozí závorky
  • \C-m toto je ekvivalentní k vrácenému klíči.

Můžete to napsat do vašeho souboru~/.inputrc:

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

Samozřejmě jsou i ostatní odpovědi platné! Stačí trochu vyladit:

  • bc:"\C-j": "\C-aecho " \C-e " | bc \C-m"
  • apcalc:"\C-j": "\C-acacl \C-m"
  • Python:"\C-j": "\C-apython3 -c "print( \C-e )" \C-m"
  • ostatní

Můžete změnit Ctrl + J na cokoli chcete, ale nezapomeňte, zkuste jej nezměnit za něco, co již má vazbu;).

Zdroj:

odpověděl Braiam 20.11.2013 01:55
2

V minulosti jsem použil wcalc a malý program s názveme, který je do značné míry nemožný google for. Nyní používám python script, který používá některé funkcee jako hranaté závorky. wcalc je stále pěkné, protože může provádět libovolnou přesnost a konverzi jednotek, ale skoro nikdy tyto funkce nevyužívám.

#!/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(")", "]"))

Zde je návod, jak jej použít (za předpokladu, že skript byl uložen jakoe a dal někde v$PATH):

$ e e**[pi*1i]
-1.0
$ e hex[10**3]
0x3e8
$ e "[0o400+3]&0xff" # need quotes because of '&'
3
    
odpověděl jpkotta 18.11.2013 17:20
0

Existuje jednostupňová cesta k dosažení přesně toho, co chcete. Vše, co musíte udělat, je nastavitshell pro váš účet na/bin/bc.

    
odpověděl bizzyunderscore 21.11.2013 02:29
0

Můžete použít taképrintf shell builtin pro provádění aritmetických výpočtů na terminálu.

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

Příklad:

$ printf "$(expr 10000 + 9000)\n"
19000
$ printf "$(expr 10000 - 9000)\n"
1000
    
odpověděl Avinash Raj 16.04.2014 15:26
0

Pro výpočet můžete použít překladač pythonu. Zde je návod jak postupovat .

Python 2 a python 3 jsou ve výchozím nastavení nainstalovány v 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
    
odpověděl noone 27.08.2017 12:08
0

Vytvořte kalkulačku terminálu

Vložte následující do souboru .bashrc

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

Nebo ji spusťte na příkazovém řádku. Nyní   "calc" ze shellu bude fungovat následovně:

$ calc 3+45
   48

Všechny funkce s písmenem "(" nebo ")" musí být přiloženy   v uvozovkách.

    
odpověděl Vishnu N K 31.01.2014 18:17