Un calculateur en ligne de commande pour Ubuntu?

118

Je recherche une calculatrice pouvant effectuer des calculs dans le terminal lui-même sans autre préfixe ni suffixe supplémentaire.

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

Une fois encore, je dis qu'il me faut simplement une calculatrice rapide dans le terminal, sans aucun caractère ajouté. Je sais que si je passe en Python, il peut le faire, mais je ne le veux pas de cette façon.

    
posée rɑːdʒɑ 18.11.2013 - 03:37
la source

23 réponses

74

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 fichier .bashrc pour essayer:

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

Alors maintenant, vous n'avez même plus besoin de $((...)) , seulement de = , ce qui semble assez naturel.

Remplacement

Autre chose si vous voulez être encore plus rapide: vous pouvez le remplacer par p par + et x par * . 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 plus besoin de Shift , la seule chose à faire est devant l'arithmétique.

Sortie hexadécimale

La sortie peut être affichée en décimal et en hexadécimal, si vous le souhaitez. ( Remarque : l'utilisation de x de substitution sera en conflit avec la syntaxe 0x... hex)

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

Exemple:

$ = 16 + 0x10
272 (0x110)

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

Utilisation de bc

Si vous souhaitez des calculs légèrement plus avancés, vous pouvez le diriger vers bc comme suit:

=() {
    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 les suivantes (et peuvent être trouvées à 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 prend également en charge if , for , while et les variables comme un langage de programmation, même s’il est préférable d’écrire dans un fichier si vous le souhaitez.

N'oubliez pas qu'il remplacera p et x dans les noms de fonction / variable. Il peut être préférable d’enlever les remplacements.

Utilisation de gcalccmd

Vous pouvez également définir l'appel de fonction gcalccmd (à partir de gnome-calculator ) comme suit:

=() {
    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 (tirées directement de le code source ), == indique 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()
    
réponse donnée kiri 19.11.2013 - 10:33
la source
91

Vous pouvez utiliser l'arithmétique simple des nombres entiers de manière native dans bash en utilisant la syntaxe ((...)) , par exemple.

$ echo $((10000-9000))
1000

Il y a aussi la calculatrice bc , qui peut accepter des expressions arithmétiques sur l'entrée standard

$ echo "10000-9000" | bc
1000

Le programme bc peut également faire de l'arithmétique en virgule flottante

$ echo "scale = 3; 0.1-0.09" | bc
.01
    
réponse donnée steeldriver 18.11.2013 - 03:59
la source
89

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

Une fois l’installation terminée, vous pouvez effectuer les calculs de votre choix:

$ 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 sa page de manuel

.     
réponse donnée Radu Rădeanu 18.11.2013 - 10:16
la source
30

Malheureusement, il n’existe pas de moyen "plus simple" de procéder. L'interface python interactive sur la ligne de commande est la mieux adaptée à vos besoins, car contrairement à apcalc \, python est inclus dans Ubuntu. Je ne sais pas si bc est toujours inclus, cependant, python est le favori pour ce genre de choses.

Vous pouvez simplement exécuter l'interface interactive python sur la ligne de commande, puis faire les calculs de cette manière. Vous pouvez l'utiliser comme calculatrice.

Pour cela, vous ouvrez le terminal, tapez python , puis cliquez sur le bouton Entrée .

Ensuite, dans l'invite de commande python qui s'affiche, vous pouvez taper vos calculs. Par exemple, 10000 - 9000 . La ligne suivante est le résultat.

Si vous voulez dire, par contre, quelque chose où vous venez de charger le terminal et pouvez le faire ...

$ 10000 - 9000
1000
$

... alors il n'y a aucun moyen de faire cela dans seulement le terminal sans rien d'autre, car Bash ne gère pas les arguments numériques comme celui-ci.

    
réponse donnée Thomas Ward 18.11.2013 - 03:40
la source
23

Je vous conseillerais 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 souhaitez faire des calculs plus avancés, vous pouvez utiliser le suivant qui importe toutes les fonctions du module math . (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 paraître étranges, par exemple ** pour les puissances de et % pour le modulo)

Vous pouvez également 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 la variable PATH et définissez son indicateur exécutable pour obtenir la même commande calc que ci-dessus (inutile de créer une fonction Bash pour exécuter un script Python).

Si vous voulez une méthode en pur Bash, utilisez la réponse de steeldriver. Cette réponse n’est vraiment utile que si vous avez besoin des fonctions plus avancées (à savoir de math ), car Python est relativement lent par rapport à Bash.

Je ne suis pas sûr que cela rompe votre "passage en python, mais vous ne pouvez pas le faire de la sorte". remarque, mais vous n'avez pas besoin d'entrer l'invite interactive et le résultat est accessible dans Bash, donc cette réponse semble valide (du moins pour moi).

    
réponse donnée kiri 18.11.2013 - 09:45
la source
21

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

% gcalccmd
> 2+3
5
> 3/2
1.5
> 3*2
6
> 2-3
−1
> 
    
réponse donnée Flint 18.11.2013 - 04:12
la source
10

Voici un script shell rapide pour cela:

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

Enregistrez ceci sous "c", puis placez-le quelque part dans votre chemin (tel que / 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 de la manière suivante:

$ c 10000-9000
1000
    
réponse donnée user530873 18.11.2013 - 06:19
la source
8

Voici une modification de la partie appropriée de /etc/bash.bashrc (sous Ubuntu 10.04) qui modifiera le gestionnaire command_not_found afin d'exécuter l'évaluateur d'expression du shell si le premier caractère de la commande unknown est un nombre ou - ou + .

Vous pourrez faire n'importe quelle arithmétique de coque de cette façon; voir le lien pour obtenir une liste des opérateurs arithmétiques.

Notez que si l'expression que vous souhaitez évaluer contient un * , vous devrez citer le * avec \ ou entre guillemets, car le shell développera le fichier avant de décider de la commande à exécuter. Même chose pour d’autres opérateurs comme >> .

Mettez ceci dans votre ~/.bashrc , puis tapez . ~/.bashrc et essayez-le.

# 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

Exemple de sortie: (je tape cta , une faute de frappe, juste pour vérifier que notre nouveau gestionnaire command_not_found essayera toujours de rechercher des commandes inconnues).

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éponse donnée Mark Plotnick 18.11.2013 - 18:05
la source
8

Une autre solution que je n'ai pas vue mentionnée ici est la Qalculate (qalc) . / p>

sudo apt-get install qalc

pour la version CLI,

sudo apt-get install qalculate-gtk

pour l'interface graphique.

Il comporte de nombreuses fonctionnalités telles que:

  • prise en charge des unités : par exemple, 20 m / s * 12 h = 864 kilom
  • constantes intégrées telles que pi , e , c , avogadro
  • de nombreuses fonctions intégrées : par exemple. sin(pi) = 0 , gamma(4) = 6 , 5! = 120 , log(1024, 2) = 10
  • conversion d'unités, par exemple:

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

  • calcul symbolique , par exemple. (x + y)^2 = x^2 + 2xy + y^2
  • intégration, par exemple integrate 3*x^2 = x^3 , diff sin(x), pi
  • aide intégrée, par exemple help convert , help integrate
  • complétion des commandes
  • tout est traduit, par exemple mon système est en néerlandais, je peux donc écrire à la fois factorial(5) et faculteit(5) .
  • et plus encore

Vous dites que vous voulez l'utiliser sans préfixes, eh bien ... vous pouvez l'utiliser avec un préfixe:

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

ainsi que de l'exécuter en tant que réplique.

    
réponse donnée JW. 26.11.2013 - 11:46
la source
7

dc ! Cela fait partie de coreutils, il est donc installé sur OS X, Ubuntu et à peu près TOUT le reste. C'est une calculatrice RPN, donc si vous n'aimez pas ceux-ci, ce n'est pas pour vous.

Les commandes

Très basiques sont les suivantes (la page de manuel a toute la syntaxe que je n'ai pas incluse. Exponentiation, ça vous tente?)

Vous avez seulement besoin d'espaces entre les nombres. Ils sont ignorés dans tous les autres cas.

Taper un nombre le pousse en haut de la pile.

+ 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
    
réponse donnée Yet Another User 18.11.2013 - 21:07
la source
5

J'utilise Octave pour ce genre de chose: link

C’est à peu près un clone matlab (excuses s’il s’agit d’une simplification excessive) qui peut être utilisé dans le terminal en tapant octave. Installez sudo apt-get install octave

Ce n’est pas tout à fait ce que vous voulez, mais je pensais que je l’ajouterais comme alternative au python.

Exemple d'utilisation:

~ $ octave
octave:1> 9000 - 8000
ans =  1000
octave:2> 
    
réponse donnée Andy T 18.11.2013 - 15:39
la source
5

J'aime beaucoup wcalc. C'est une calculatrice scientifique en ligne de commande. Facile à trouver dans le Centre logiciel Ubuntu, ou utilisez simplement apt-get.

sudo apt-get install wcalc

Il accepte les arguments de ligne de commande ainsi que le mode "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

Et si quelqu'un est en ingénierie, comme moi, vous pouvez utiliser GNU Octave. Il peut faire toutes sortes de choses, créer des graphiques, résoudre des équations simultanées. De plus, c'est une alternative gratuite à Matlab

    
réponse donnée Sergiy Kolodyazhnyy 22.09.2014 - 11:58
la source
4

moyen simple est d'appeler python.

Exemple:

>  python -c 'print 10000-9000'
    
réponse donnée user2327875 20.11.2013 - 14:35
la source
3

Ce que j’ai trouvé, c’est que je ne peux pas faire confiance aux options expr, bc ou Shell intégrées. J'ai donc utilisé Perl qui serait normalement installé dans la distribution * linux

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

Le calcul ci-dessus soustrait $ VAL1 de $ VAL2 et imprimera sans décimale (0f)

Les avantages de l’utilisation de Perl sont les suivants (informations détaillées sur les avantages & inconvénients répertoriés ici . )

  • Meilleure capture d'erreur (diviser par 0 n'arrêtera pas le calcul)
  • Peut fournir des formules dans un fichier de configuration. Pas besoin d'échapper à l'aide de regex complexes
réponse donnée diaryfolio 18.11.2013 - 11:14
la source
3

Vous pouvez ajouter la fonction suivante à votre fichier .bashrc:

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

Notez que -l flag est très important. Sans cela, l'utilisation de bc donne 5 / 2 = 2 .

Comme cela a été mentionné ci-dessus, les calculs peuvent être effectués en utilisant le signe = devant la formule.

    
réponse donnée vdm 19.11.2013 - 14:51
la source
3

Vous pouvez également utiliser awk pour effectuer des calculs arithmétiques sur un terminal,

.
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
    
réponse donnée Avinash Raj 05.01.2014 - 19:41
la source
2

utilisez la commande "bc" puis vous pourrez faire un calcul

exemple

[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

Pour utiliser bc sans la note de garantie, écrivez dans le terminal bc -q

exemple

[root@vaibhav ~]# bc -q
10+2
12
    
réponse donnée Vaibhav Jain 19.11.2013 - 08:18
la source
2

Vous pouvez utiliser bind et bash C-a et C-e pour contrôler la sortie. Par exemple, exécutez ceci dans votre shell:

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

Tapez maintenant n'importe quelle opération arithmétique telle que 10 + 15 et appuyez sur Ctrl + J :

$ echo $(( 10 + 15 )) 
25

Vous obtiendrez ceci. Maintenant, comment fait-on?

  • bind cette commande modifie la liaison de votre bash, comme des touches de raccourci.
  • \C-j c'est l'équivalent bash de Ctrl + J, c'est la combinaison de touches que nous aimerions ajouter à notre commande.
  • \C-a cela nous amène au début de la ligne.
  • echo $(( ceci écrit echo $(( au début.
  • \C-e nous amène au bout de la ligne
  • )) ferme notre parenthèse précédente
  • \C-m c'est l'équivalent de retourner la clé.

Vous pouvez l'écrire dans votre fichier ~/.inputrc :

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

Bien sûr, les autres réponses sont également valables! Juste un peu modifié:

  • 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"
  • d'autres?

Vous pouvez changer Ctrl + J comme bon vous semble, mais rappelez-vous, essayez de ne pas le changer pour quelque chose qui a déjà une liaison;).

Ressource:

réponse donnée Braiam 20.11.2013 - 01:55
la source
2

Dans le passé, j’utilisais wcalc et un petit programme appelé e qui était pratiquement impossible à google pour. Pour ce faire, j’utilise maintenant un script python, qui utilise certaines fonctionnalités de e comme les crochets. wcalc est toujours intéressant car il peut effectuer des conversions de précision et des unités arbitraires, mais je n’utilise presque jamais ces fonctionnalités.

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

Voici comment l'utiliser (en supposant que le script a été enregistré sous e et placé quelque part dans $PATH ):

$ e e**[pi*1i]
-1.0
$ e hex[10**3]
0x3e8
$ e "[0o400+3]&0xff" # need quotes because of '&'
3
    
réponse donnée jpkotta 18.11.2013 - 17:20
la source
0

Il existe un moyen en une étape d’accomplir exactement ce que vous voulez. Il vous suffit de définir le shell de votre compte sur /bin/bc .

    
réponse donnée bizzyunderscore 21.11.2013 - 02:29
la source
0

Vous pouvez également utiliser printf shell intégré pour effectuer des calculs arithmétiques sur un terminal.

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

Exemple:

$ printf "$(expr 10000 + 9000)\n"
19000
$ printf "$(expr 10000 - 9000)\n"
1000
    
réponse donnée Avinash Raj 16.04.2014 - 15:26
la source
0

Vous pouvez utiliser l'interpréteur python pour le calcul. Voici un tutoriel sur la procédure à suivre .

Python 2 et Python 3 sont installés dans Ubuntu par défaut.

$ 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
    
réponse donnée noone 27.08.2017 - 12:08
la source
0

Créer une calculatrice de terminal

Mettez les informations suivantes dans votre fichier .bashrc

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

Ou exécutez-le à l'invite du shell. À présent   "calc" à partir de la coque fonctionnera comme suit:

$ calc 3+45
   48

Toutes les fonctions avec "(" ou ")" doivent être jointes   entre guillemets.

    
réponse donnée Vishnu N K 31.01.2014 - 18:17
la source

Lire d'autres questions sur les étiquettes