Vraag Elke opdrachtregelcalculator voor Ubuntu?


Ik ben op zoek naar een rekenmachine die berekeningen in de terminal zelf kan uitvoeren zonder andere extra voorvoegsels en achtervoegsels.

Bijvoorbeeld: als ik in de terminal iets als 10000-9000 typte, zou het antwoord er uit moeten komen als 1000.

Nogmaals, ik zeg alleen dat ik een snelle calculator nodig heb in de terminal, zonder dat er tekens aan worden toegevoegd. Ik weet dat als ik overschak naar Python, het dat kan doen, maar ik wil het niet op zo'n manier.


116
2017-11-18 02:37


oorsprong


Kan zijn packages.ubuntu.com/saucy/apcalc ? - wakeup
Het macht mogelijk om zoiets te hacken met een soort pre-hook; maar dat op zichzelf kan alleen op een lelijke en hackachtige manier worden gedaan. Nee, ik denk echt dat het geen goed idee is. Bash als geheel is bedoeld als een eenvoudige IO-scriptingtaal, alles wat het apart doet is min of meer ad hoc en werkt niet echt goed. Python aan de andere kant (of zelfs bijvoorbeeld Haskell) is een moderne, universele programmeertaal met een geweldige syntaxis. Dus het zou dom zijn om het niet te gebruiken. - leftaroundabout
In dezelfde geest kunt u ook iets doen met de command_not_found haak en probeer het commando te voeren bc/calc/ wat het ook is als het er vaag uitziet als wiskunde. Toch voelt het nog steeds een beetje vies. - chronitis
Wacht, wat bedoel je precies met "overschakelen naar" python? en "zonder extra voorvoegsels"? Wil je zeggen dat je dingen op de vraag wilt kunnen berekenen? zonder een commando uit te voeren? - Random832
unix.stackexchange.com/questions/40786/... - Bernhard


antwoorden:


Bash Rekenen

Een andere mogelijke oplossing is om een ​​eenvoudige functie toe te voegen voor Bash's ingebouwde rekenkunde. Zet dit in uw .bashrc bestand om te proberen:

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

Dus nu heb je het niet eens nodig $((...)) meer, gewoon = wat natuurlijk genoeg lijkt.

Vervanging

Nog iets als je nog sneller wilt zijn: je kunt het laten vervangen p met + en x met *. Dit zal werken voor dat:

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

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

Nu heb je het niet eens nodig Verschuiving meer, het enige is  voor de rekenkunde.

Hexadecimale uitvoer

Uitvoer kan worden weergegeven in zowel decimale als hexadecimale waarden, indien gewenst. (Notitie: gebruik makend van x vervanging zal conflicteren met de 0x... hex-syntaxis)

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

Voorbeeld:

$ = 16 + 0x10
272 (0x110)

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

Gebruik makend van bc

Als u iets geavanceerdere berekeningen wilt, kunt u dit doorsturen naar bc zoals zo:

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

De functies geleverd door bc zijn als volgt (en zijn te vinden vanaf 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.

Het ondersteunt ook if, for, while en variabelen zoals een programmeertaal, hoewel het misschien beter is om naar een bestand te schrijven als je dat wilde.

Houd er rekening mee dat dit in de plaats zal komen p en x in functie / variabelenamen. Het is misschien beter om alleen de vervangingen te verwijderen.

Gebruik makend van gcalccmd

U kunt ook de functie bellen gcalccmd (van gnome-calculator) zoals zo:

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

De beschikbare functies lijken (direct overgenomen) de broncode) == geeft equivalente functies aan:

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

72
2017-11-19 09:33



Bedankt, kun je meer ondersteuning toevoegen met wetenschappelijke berekeningen? - Ten-Coin
@rajagenupula Zie mijn bewerkingen hierboven - kiri
Sorry voor dit late antwoord, maar het bevel dat je hebt gegeven gcalccmd werkt niet zo goed. Het laat zien Error 3 waarschijnlijk vanwege die verdwaalde witruimte. Dit enigszins aangepaste exemplaar werkte echter perfect voor mij: echo -e "$calc\nquit"| gcalccmd | sed "s:^> ::g" - udiboy1209
Ik heb een wetenschappelijke berekening gemaakt met R! function = { R -q --vanilla -e "$@" | grep -E '[^>](.*)' -o -x --color=never } - Morteza Milani
Hallo, en bedankt. Dat is best wel cool. Door je substitutie voor 'x' wordt de hex-input mislukt, wat anders prima werkt. Nu we het erover hebben, kan ik ook het antwoord in 'hex' hebben? bv. = 2 + 0x20  34 (0x22) - FractalSpace


U kunt eenvoudige integer rekenkunde native in bash doen met behulp van de ((...)) syntaxis, b.v.

$ echo $((10000-9000))
1000

Er is ook de bc rekenmachine, die rekenkundige uitdrukkingen op standaardinvoer kan accepteren

$ echo "10000-9000" | bc
1000

De bc programma kan ook drijvende-kommaberekeningen uitvoeren

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

88
2017-11-18 02:59



Dit is waarschijnlijk het dichtst in de buurt. Om het extra typen te verminderen (maar niet volledig te elimineren) kun je een functie in je ~ / .bashrc plaatsen: calc() NL { NL echo "$@" | bc NL } waar NL een nieuwe regel is. Dan kunt u typen calc 1234 + 768 (prints 2002), of een andere formule die bc kan interpreteren. Je kunt natuurlijk elke functienaam gebruiken, dat dacht ik alleen calc past mooi bij wat dit doet. - Michael Kjörling
zodra python beter is dan echo de hele tijd. mijn mening. - Ten-Coin
Je kunt ook bc interactief gebruiken, tenzij je de echo om een ​​andere reden nodig hebt: voer gewoon bc uit en typ je expressie. Type Ctrl-D op zijn eigen regel om te verlaten. - Useless
als je een automatische expressie maakt met de hulp van alias of iets anders dan zou dat geweldig zijn. - Ten-Coin
Niet nodig echo: bc <<< "2*2" - Bernhard


Je kunt gebruiken calc. Is niet standaard geïnstalleerd, maar u kunt het snel installeren met behulp van de volgende opdracht:

sudo apt-get install apcalc

Nadat u het hebt geïnstalleerd, kunt u elke berekening uitvoeren die u wenst:

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

Bekijk de informatie voor meer informatie man-page


87
2017-11-18 09:16



Bedankt voor het beantwoorden, ik zie dat het antwoord zijn eigen betekenis heeft. Ik hou meer van al die trigonometrische functies. elke handleiding of sompagina over wat meer kan doen, kan je veel antwoorden geven. :) - Ten-Coin
@rajagenupula man calc en calc help zegt alles. - Radu Rădeanu
Mijn bedoeling is dat als iemand ernaar kijkt het duidelijk en snel moet zijn. dank je. - Ten-Coin
Eigenlijk gebruik je calc help builtin om een ​​lijst met ondersteunde functies zoals sin() - Penghe Geng
Geeft meer decimalen, dus het is beter geschikt voor mijn doeleinden dan de ingebouwde bash-rekenkunde. Bedankt. - Mrmfldmn


Helaas is er geen "gemakkelijkere" manier om dit te doen. De interactieve python-interface op de opdrachtregel is het meest geschikt voor wat u nodig hebt, omdat dit niet het geval is apcalc\, python is ingesloten in Ubuntu. Ik weet niet zeker of bc is echter nog opgenomen, echter, python is de favoriete favoriet voor dit soort dingen.

Je kunt gewoon het interactieve uitvoeren python interface op de opdrachtregel en wis op die manier. Je kunt dat als je rekenmachine gebruiken.

Om dat te doen, opent u de terminal, typt u python, dan op de invoeren knop.

Vervolgens, in de python-prompt die verschijnt, kunt u uw wiskunde typen. Bijvoorbeeld, 10000 - 9000. De volgende regeluitvoer is het resultaat.


Als je echter bedoelt dat je gewoon de terminal laadt en dit kunt doen ...

$ 10000 - 9000
1000
$

... dan is er geen manier om dit te doen net de terminal zonder iets anders, omdat Bash dergelijke numerieke argumenten niet verwerkt.


30
2017-11-18 02:40



Ik heb wel gezegd dat ik niet naar python wil overschakelen - Ten-Coin
@rajagenupula geüpdatet, inclusief de dingen die ik in de chat heb genoemd. - Thomas Ward♦
bc is niet meer inbegrepen? - Random832
Als terzijde, ipythonis vrij veel nuttiger dan de standaard Python-shell als het gaat om het doen van berekeningen en dergelijke. - Naftuli Kay
BC wordt standaard meegeleverd (ten minste in 16.04) - TJ Ellis


Ik zou je aanraden om een ​​eenvoudige functie te maken voor eenvoudige Python-berekeningen. Iets dergelijks in jouw .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

Als u meer geavanceerde wiskunde wilt doen, kunt u de volgende gebruiken die alle math module functies. (zien hier voor meer informatie)

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

(Opmerking: omdat Python een programmeertaal is, kunnen sommige dingen vreemd lijken, bijvoorbeeld ** voor bevoegdheden van en % voor modulo)

Je kunt ook een Python-script maken calc,

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

plaats het in een map opgenomen in de PATH variabele en stel de uitvoerbare vlag in om hetzelfde te krijgen calc commando zoals hierboven (het is niet nodig om een ​​Bash-functie te maken om een ​​Python-script uit te voeren).

Als je een methode in pure Bash wilt, gebruik dan het antwoord van steeldriver. Dit antwoord is alleen echt nuttig als u de meer geavanceerde functies (d.w.z. math), omdat Python relatief traag is vergeleken met Bash.


Ik weet niet zeker of dit je "overstap naar python verbreekt en dat kan ik niet". Let op, maar je hoeft de interactieve prompt niet in te voeren en het resultaat is toegankelijk in Bash, dus dit antwoord lijkt geldig (voor mij tenminste).


23
2017-11-18 08:45



telkens als dat alles betekent, betekent dat niet zo veel gemakkelijk en flexibel. Dank je. eventuele verbeteringen die u kunt maken om er eenvoudiger en overzichtelijker uit te zien? Ik zou dat geweldig vinden. - Ten-Coin
@rajagenupula Je kunt dat in een functie in je .bashrc plaatsen (misschien met een kortere naam: c, ? of +?) zodat je elke terminal die je opent, hebt. - kiri
Pas op: met Python 3 werkt dit prima, maar als je Python 2 wilt gebruiken, moet je het fragment bewerken naar: python2 -c "from __future__ import division; from math import *; print($*)" anders zal het altijd een gehele deling doen, b.v. voor calc 5/2 je zou krijgen 2 in plaats van 2.5. Zie hier voor referentie: stackoverflow.com/a/183870/202504 - jmiserez
De Python-oplossing is mogelijk beter dan apcalc, omdat u extra bibliotheken kunt importeren en deze letterlijk ondersteunen pi en e. Ik voel dat dit een apart script is dat flexibeler en draagbaarder is. Hier is een simpele kern van: gist.github.com/jasongeng/279eb396c01e74beb9ef - Penghe Geng


Gebruik de gcalccmd van gnome-calculator (> = 13.04) of gcalctool (<13.04) pakket. Ik denk dat het pakket standaard is geïnstalleerd

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

21
2017-11-18 03:12



De beste tot nu toe .. Geen behoefte om extra dingen te doen en ook standaard te installeren .. man gcalccmd zegt: een console calculator. Eenvoudig, het is precies wat OP wil .. :) - Saurav Kumar
Dat is cool, vergelijkbaar met bc, python, ocatve calculators. Dank je. - Ten-Coin
Omdat gcalccmd vrij moeilijk te typen is, is het een goed idee om er alias in toe te voegen ./bash_aliases graag willen alias calc='gcalccmd' of als u eenmalige berekeningen wilt maken (met direct antwoord), kunt u toevoegen alias calc='gnome-calculator -s' - gebruik van de laatste: calc 2000/1300 of calc 2+3. In dat geval is het niet nodig om de rekenmachine te verlaten - het geeft u gewoon een antwoord en u hoeft niet te typen quit. - Rafal


Hier is een snel shellscript:

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

Sla dit op als "c", plaats het dan ergens op je pad (zoals / bin), en markeer het uitvoerbaar.

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

Vanaf nu kunt u berekeningen in de terminal als volgt uitvoeren:

$ c 10000-9000
1000

10
2017-11-18 05:19



Je bent fantastisch, het toevoegen van slechts één brief voordat de berekening betekent dat is echt cool idee. dit is super voor als ik 2 tot 3 berekeningen moet maken. Ik kan voor Python of een ander langer gaan maar korter kies ik dit. Bedankt voor het langskomen. - Ten-Coin
Ik zou je adviseren om te gebruiken echo "$@" | bc in plaats daarvan kunt u spaties natuurlijker inruimen - kiri
Hoe zit het met het gebruik = in plaats van c voor de naam van deze opdracht? Met Bash kun je dit eigenlijk gebruiken als de naam van een functie. - Kaz
Je kunt programma's in plaatsen ~/bin (uw home-directory's bin) en zorg ervoor dat /home/yourname/bin is in jouw PATH. - Kaz
@ minerz029 Leuk denkwerk. Ik heb mijn antwoord dienovereenkomstig aangepast. - user530873


Hier is een wijziging van het juiste deel van /etc/bash.bashrc (op Ubuntu 10.04) die de command_not_found handler om de expressie-evaluator van de shell uit te voeren als het eerste teken van de onbekende opdracht een getal of is - of +.

Op deze manier kun je elke shell-rekenkundige bewerking uitvoeren; zien http://www.gnu.org/software/bash/manual/bashref.html#Shell-Arithmetic voor een lijst met rekenkundige operatoren.

Merk op dat als de uitdrukking die u wilt evalueren bevat een *, je zult het moeten citeren * met \ of aanhalingstekens, omdat de shell bestandsnaam-uitbreiding zal uitvoeren voordat wordt besloten welke opdracht moet worden uitgevoerd. Hetzelfde geldt voor andere operatoren >>.

Zet dit in uw ~/.bashrc, typ dan . ~/.bashrc en probeer het uit.

# 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

Voorbeelduitvoer: (ik ben aan het typen cta, een typfout, alleen om te testen of onze nieuwe command_not_found handler nog steeds zal proberen onbekende opdrachten te zoeken).

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

8
2017-11-18 17:05



is er een manier waarop we meer ondersteuning voor berekeningen kunnen toevoegen? - Ten-Coin
Je kunt de regel nemen die zegt echo $(( $@ )) en verander het in plaats daarvan, voer een van de meer geavanceerde rekenprogramma's uit die andere antwoordapparaten hebben genoemd en neem hun argumenten op de opdrachtregel. - Mark Plotnick