web-dev-qa-db-fra.com

Multiplication sur le terminal en ligne de commande

J'utilise un terminal série pour contribuer à notre expérience de laboratoire. J'ai trouvé cela en utilisant

$ echo "5X5"

renvoie simplement une chaîne de "5X5". Existe-t-il une commande pour exécuter une opération de multiplication?

105
bouncingHippo

Oui, vous pouvez utiliser le développement arithmétique intégré de bash $(( )) pour faire quelques calculs simples.

$ echo "$((5 * 5))"
25

Consultez la section Arithmétique du shell du Manuel de référence de Bash pour obtenir une liste complète des opérateurs.

Par souci d’exhaustivité, comme d’autres l'ont fait remarquer, si vous avez besoin d'une précision arbitraire, bc ou dc serait mieux.

192
KurzedMetal

Pour des calculs plus avancés et plus précis, envisagez d’utiliser bc (1).

echo "3 * 2.19" | bc -l 
6.57
43
tvm

Méthodes internes

Bash supporte expansion arithmétique avec $(( expression )). Par exemple:

$ echo $(( 5 * 5 ))
25

Méthodes externes

Un certain nombre d’utilitaires fournissent une arithmétique, notamment bc et expr .

$ echo '5 * 5' | /usr/bin/bc
25

$ /usr/bin/expr 5 \* 5
25
16
Todd A. Jacobs

La solution classique est:

 expr 5 \* 5

Une autre option intéressante est:

 echo 5 5\*p | dc

Ces deux solutions ne fonctionneront qu'avec des opérandes entiers.

11
William Pursell

Une simple fonction Shell (pas besoin de sed) devrait faire l’interprétation de "5X5"

$ function calc { bc -l <<< ${@//[xX]/*}; };
$ calc 5X5
25
$ calc 5x5
25
$ calc '5*5'
25
7
Moreaki

J'utilise cette fonction qui utilise bc et supporte donc les calculs en virgule flottante:

c () { 
    local a
    (( $# > 0 )) && a="$@" || read -r -p "calc: " a
    bc -l <<< "$a"
}

Exemple:

$ c '5*5'
25
$ c 5/5
1.00000000000000000000
$ c 3.4/7.9
.43037974683544303797

L'expansion arithmétique de Bash ne supporte pas les float (contrairement à Korn Shell et zsh).

Exemple:

$ ksh -c 'echo "$((3.0 / 4))"'
0.75
5
Dennis Williamson

J'ai un script simple que j'utilise pour cela:

me@mycomputer:~$ cat /usr/local/bin/c

#!/bin/sh

echo "$*" | sed 's/x/\*/g' | bc -l

Il change x en * car * est un caractère spécial dans le shell. Utilisez-le comme suit:

  • c 5x5
  • c 5-4.2 + 1
  • c '(5 + 5) * 30' (vous devez toujours utiliser des guillemets si l'expression contient des parenthèses).
3
jnylen

Si vous aimez python et avez une option pour installer un paquet, vous pouvez utiliser cet tilitaire que j'ai créé.

# install pythonp
python -m pip install pythonp

pythonp "5*5"
25

pythonp "1 / (1+math.exp(0.5))"
0.3775406687981454

# define a custom function and pass it to another higher-order function
pythonp "n=10;functools.reduce(lambda x,y:x*y, range(1,n+1))"     
3628800
2
bombs