Question Une calculatrice en ligne de commande pour Ubuntu?


Je cherche une calculatrice qui peut faire des calculs dans le terminal lui-même sans autres préfixes et suffixes supplémentaires.

Par exemple: Si je saisis quelque chose comme 10000-9000 dans le terminal, la réponse devrait être 1000.

Encore une fois, j'ai besoin d'une calculatrice rapide dans le terminal, sans aucun caractère ajouté. Je sais que si je passe à Python, ça peut le faire mais je ne le veux pas de cette façon.


116
2017-11-18 02:37


origine


Peut être packages.ubuntu.com/saucy/apcalc ? - wakeup
Il pourrait être capable de pirater quelque chose comme ça avec une sorte de pré-crochet; mais en soi ne peut être fait que d'une manière vraiment laide et hackish. Non, je pense vraiment que ce n'est pas une bonne idée. Bash dans son ensemble est conçu comme un langage de script IO, tout ce qu’il fait à part cela est plus ou moins ad hoc et ne fonctionne pas très bien. Python d'autre part (ou même, par exemple, Haskell) est un langage de programmation moderne et polyvalent avec une grande syntaxe. Il serait donc stupide de ne pas l'utiliser. - leftaroundabout
Dans le même ordre d'idées, vous pourriez aussi faire quelque chose avec le command_not_found hook, et essayez d’alimenter la commande pour bc/calc/ peu importe si ça ressemble vaguement aux maths. Cela reste quand même un peu sale. - chronitis
Attendez, que voulez-vous dire par "passer à" python? et "sans préfixes supplémentaires"? Dites-vous que vous voulez pouvoir calculer les choses à l'invite sans exécuter de commande? - Random832
unix.stackexchange.com/questions/40786/… - Bernhard


Réponses:


Arithmétique Bash

Une autre solution possible consiste à ajouter une fonction simple pour l'arithmétique intégrée de Bash. Mettez ceci dans votre .bashrc fichier à essayer:

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

Donc maintenant, vous n'avez même pas besoin $((...)) plus juste = ce qui semble assez naturel.

Remplacement

Autre chose si vous voulez être encore plus rapide: vous pouvez le faire remplacer p avec + et x avec *. Cela fonctionnera pour cela:

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

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

Maintenant, vous n'avez même pas besoin Décalage plus la seule chose est  en face de l'arithmétique.

Sortie hexadécimale

La sortie peut être affichée à la fois en décimal et en hexadécimal, si vous le souhaitez. (Remarque: en utilisant x la substitution sera en conflit avec le 0x... syntaxe hexadécimale)

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

Exemple:

$ = 16 + 0x10
272 (0x110)

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

En utilisant bc

Si vous voulez des calculs légèrement plus avancés, vous pouvez les diriger vers bc ainsi:

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

Les fonctions fournies par bc sont comme suit (et peuvent être trouvés à partir de 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.

Il supporte aussi if, for, while et des variables comme un langage de programmation si il est préférable d'écrire dans un fichier si vous le souhaitiez.

Gardez à l'esprit qu'il remplacera p et x dans les noms de fonction / variable. Il peut être préférable de simplement supprimer les remplacements.

En utilisant gcalccmd

Vous pouvez également faire l'appel de fonction gcalccmd (de gnome-calculator) ainsi:

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

Les fonctions disponibles semblent être (prises directement à partir de le code source), == désigne des fonctions équivalentes:

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



Merci, pouvez-vous ajouter plus de soutien avec des calculs scientifiques? - Ten-Coin
@rajagenupula Voir mes modifications ci-dessus - kiri
Désolé pour cette réponse tardive mais la commande que vous avez donnée pour gcalccmd ne fonctionne pas très bien. Ça montre Error 3 probablement à cause de cet espace vide. Cependant, cette version légèrement modifiée a parfaitement fonctionné pour moi: echo -e "$calc\nquit"| gcalccmd | sed "s:^> ::g" - udiboy1209
J'ai construit un calcul scientifique en utilisant R! function = { R -q --vanilla -e "$@" | grep -E '[^>](.*)' -o -x --color=never } - Morteza Milani
Salut et merci C'est plutôt cool. BTW votre substitution pour «x» le faire échouer pour l'entrée hexadécimale, qui fonctionne normalement bien. En parlant de cela, puis-je avoir la réponse dans «hex» aussi? par exemple. = 2 + 0x20  34 (0x22) - FractalSpace


Vous pouvez faire de l'arithmétique entière simple en bash en utilisant le ((...)) syntaxe, par exemple

$ echo $((10000-9000))
1000

Il y a aussi le bc calculatrice, qui peut accepter des expressions arithmétiques sur une entrée standard

$ echo "10000-9000" | bc
1000

le bc programme peut faire de l'arithmétique à virgule flottante aussi bien

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

88
2017-11-18 02:59



C'est probablement le plus proche que vous pouvez obtenir. Pour réduire le typage supplémentaire (mais pas l'éliminer complètement), vous pouvez mettre une fonction dans votre ~ / .bashrc: calc() NL { NL echo "$@" | bc NL } où NL est une nouvelle ligne. Ensuite, vous pouvez taper calc 1234 + 768 (estampes 2002), ou toute autre formule bc peut interpréter. Vous pouvez bien sûr utiliser n'importe quel nom de fonction, je pensais juste que calc correspond bien à ce que cela fait. - Michael Kjörling
une fois que python vaut mieux que l'écho tout le temps. mon avis. - Ten-Coin
Vous pouvez également utiliser bc interactivement, sauf si vous avez besoin de l'écho pour une autre raison: lancez simplement bc et tapez votre expression. Tapez Ctrl-D sur sa propre ligne pour quitter. - Useless
Si vous preniez une expression automatique à l'aide d'un alias ou de quelque chose d'autre, ce serait génial. - Ten-Coin
Pas besoin de echo: bc <<< "2*2" - Bernhard


Vous pouvez utiliser calc. N’est pas installé par défaut, mais vous pouvez l’installer rapidement à l’aide de la commande suivante:

sudo apt-get install apcalc

Après avoir installé, vous pouvez faire n'importe quel calcul que vous souhaitez:

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

Pour plus d'informations, consultez son man-page


87
2017-11-18 09:16



Merci d'avoir répondu, je vois que la réponse a sa propre signification. J'aime un peu plus sur tous ces calculs de fonctions trigonométriques. tout manuel ou page sur ce qu'il peut faire de plus peut améliorer votre réponse. :) - Ten-Coin
@rajagenupula man calc et calc help dit tout. - Radu Rădeanu
Mon intension est que si quelqu'un le regarde, il doit être clair et rapide. Je vous remercie. - Ten-Coin
En fait, vous utilisez calc help builtin pour voir une liste des fonctions supportées comme sin() - Penghe Geng
Donne plus de décimales, donc il est mieux adapté à mes besoins que l'arithmétique de bash intégrée. Merci. - Mrmfldmn


Malheureusement, il n'y a pas de moyen "plus simple" de le faire. L'interface interactive Python sur la ligne de commande est la mieux adaptée à ce dont vous avez besoin, car contrairement apcalc\, python est inclus dans Ubuntu. Je ne sais pas si bc est encore inclus, cependant, python est le favori pour ce genre de choses.

Vous pouvez simplement lancer l'interactif python interface sur la ligne de commande, puis faire des maths de cette façon. Vous pouvez l'utiliser comme votre calculatrice.

Pour ce faire, ouvrez le terminal, tapez python, alors frappez le Entrer bouton.

Ensuite, dans l'invite Python qui apparaît, vous pouvez taper vos calculs. Par exemple, 10000 - 9000. La sortie de la ligne suivante est le résultat.


Si vous voulez dire quelque chose, il suffit de charger le terminal et de le faire ...

10000 $ - 9000
1000
$

... alors non il n'y a aucun moyen de le faire en juste le terminal sans rien d'autre, car Bash ne gère pas les arguments numériques comme ça.


30
2017-11-18 02:40



J'ai mentionné que je ne veux pas passer en python - Ten-Coin
@rajagenupula mis à jour, a également inclus les trucs que j'ai mentionnés dans le chat. - Thomas Ward♦
bc n'est plus inclus? - Random832
En aparté, ipython est un peu plus utile que le shell Python standard lorsqu'il s'agit de faire des calculs, etc. - Naftuli Kay
bc est inclus par défaut (au moins dans 16.04) - TJ Ellis


Je vous conseille de créer une fonction simple pour les calculs Python de base. Quelque chose comme ça dans votre .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

Si vous voulez faire des mathématiques plus avancées, vous pouvez utiliser la suivante qui importe tous les math fonctions du module. (voir ici pour plus d'informations)

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

(Remarque: Python étant un langage de programmation, certaines choses peuvent sembler étranges, par exemple ** pour les pouvoirs de et % pour modulo)

Sinon, vous pouvez créer un script Python calc,

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

placez-le dans un répertoire inclus dans le PATH variable et définir son drapeau exécutable pour obtenir le même calc commande comme ci-dessus (pas besoin de créer une fonction Bash pour exécuter un script Python).

Si vous voulez une méthode en pure Bash, utilisez la réponse de steeldriver. Cette réponse n'est vraiment bénéfique que si vous avez besoin des fonctions les plus avancées math), car Python est relativement lent par rapport à Bash.


Je ne suis pas sûr que cela brise votre "passage en python, il peut le faire et je ne le veux pas de cette manière". Notez que vous n'avez pas besoin d'entrer dans l'invite interactive et que le résultat est accessible dans Bash, cette réponse semble donc valide (du moins pour moi).


23
2017-11-18 08:45



chaque fois que tous ceux qui ont à le faire ne sont pas si faciles et flexibles. Je vous remercie. des améliorations que vous pouvez rendre plus simples et plus claires? J'adorerais ça. - Ten-Coin
@rajagenupula Vous pouvez mettre cela dans une fonction dans votre .bashrc (peut-être avec un nom plus court: c, ? ou +?) ainsi vous l'aurez chaque terminal que vous ouvrez. - kiri
Attention: avec Python 3, cela fonctionne très bien, mais si vous voulez utiliser Python 2, vous devrez modifier l'extrait de code pour: python2 -c "from __future__ import division; from math import *; print($*)" sinon, il fera toujours la division entière, par ex. pour calc 5/2 vous auriez 2 au lieu de 2.5. Voir ici pour référence: stackoverflow.com/a/183870/202504 - jmiserez
La solution Python peut en fait être meilleure que apcalc en ce sens que vous pouvez importer des bibliothèques supplémentaires et prendre en charge le littéral pi et e. Je pense que mettre un script séparé est plus flexible et portable. Voici une idée simple: gist.github.com/jasongeng/279eb396c01e74beb9ef - Penghe Geng


Utilisez le gcalccmd de gnome-calculator (> = 13.04) ou gcalctool (<13.04) paquet. Je pense que le paquet est installé par défaut

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

21
2017-11-18 03:12



Le meilleur jusqu'à présent .. Pas besoin de faire autre chose et aussi installé par défaut. man gcalccmd dit: une calculatrice de console. Simplement, c'est exactement ce que veut OP .. :) - Saurav Kumar
C'est cool, similaire à bc, python, ocatve calculateurs. Je vous remercie. - Ten-Coin
Comme gcalccmd est assez difficile à taper, il est conseillé d’y ajouter un alias dans ./bash_aliases comme alias calc='gcalccmd' ou si vous voulez faire des calculs ponctuels (avec une réponse instantanée), vous pouvez ajouter alias calc='gnome-calculator -s' - utilisation de ce dernier: calc 2000/1300 ou calc 2+3. Dans ce cas, il n'y a pas besoin de quitter la calculatrice - cela vous donne simplement une réponse et vous n'avez pas besoin de taper quit. - Rafal


Voici un script shell rapide pour cela:

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

Enregistrez-le sous "c", puis placez-le quelque part dans votre chemin (par exemple / bin), puis marquez-le comme exécutable.

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

A partir de maintenant, vous pouvez exécuter des calculs dans le terminal comme ceci:

$ c 10000-9000
1000

10
2017-11-18 05:19



Vous êtes superbe, en ajoutant une seule lettre avant que le calcul ne signifie que c'est vraiment une bonne idée. c'est super pour si j'ai besoin de 2 à 3 calculs. Je peux aller pour le python ou un autre plus longtemps mais plus court je choisis ceci. Merci pour la visite. - Ten-Coin
Je vous conseille d'utiliser echo "$@" | bc au lieu de cela, vous pouvez mettre des espaces dans les calculs plus naturellement - kiri
Que diriez-vous d'utiliser = au lieu de c pour le nom de cette commande? Bash vous permet en fait de l'utiliser comme nom d'une fonction. - Kaz
Vous pouvez mettre des programmes dans ~/bin (votre répertoire personnel bin) et s’assurer que /home/yourname/bin est dans votre PATH. - Kaz
@ minerz029 Belle réflexion. J'ai édité ma réponse en conséquence. - user530873