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?
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.
Pour des calculs plus avancés et plus précis, envisagez d’utiliser bc (1).
echo "3 * 2.19" | bc -l
6.57
Bash supporte expansion arithmétique avec $(( expression ))
. Par exemple:
$ echo $(( 5 * 5 ))
25
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
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.
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
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
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).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