J'utilise un terminal série pour fournir une entrée dans notre expérience de laboratoire. J'ai trouvé qu'en utilisant
$ echo "5X5"
renvoie simplement une chaîne de "5X5"
. Existe-t-il une commande pour exécuter une opération de multiplication?
J'utilise un terminal série pour fournir une entrée dans notre expérience de laboratoire. J'ai trouvé qu'en utilisant
$ echo "5X5"
renvoie simplement une chaîne de "5X5"
. Existe-t-il une commande pour exécuter une opération de multiplication?
Réponses:
Oui, vous pouvez utiliser l'extension arithmétique intégrée de bash$(( ))
pour faire des calculs simples
$ echo "$((5 * 5))"
25
Consultez la section Arithmétique du shell dans le manuel de référence de Bash pour une liste complète des opérateurs.
Par souci d'exhaustivité, comme d'autres l'ont souligné, si vous avez besoin d'une précision arbitraire, bc
ou ce dc
serait mieux.
Bash prend en charge l'expansion arithmétique avec $(( expression ))
. Par exemple:
$ echo $(( 5 * 5 ))
25
Un certain nombre d'utilitaires fournissent l'arithmétique, y compris 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.
k
. Je me souviens certainement que la précision par défaut était de 0 (troncature en entier). Est-ce que je me souviens mal ou est-ce simplement que les nouvelles implémentations ont changé de comportement?
dc
rarement utilisé au fil des ans puisque je suis plus algébrique et moins RPN donc je ne m'en souviens pas. Sur un système GNU que j'utilise, la valeur par défaut est 0. Une ancienne man
page FreeBSD (1993) mentionne que la valeur par défaut est zéro, mais les anciennes man
pages BSD ne le font pas.
echo '4 k 50.5 7 / p' | dc
fonctionne (sortie :) 7.2142
.
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 prend pas en charge les flottants (mais Korn Shell et zsh le font).
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).tr
peut être utilisé pour faire un mappage de caractères pour plusieurs caractères.
Si vous aimez python et avez la possibilité d'installer un package, vous pouvez utiliser cet utilitaire 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
dc
fonctionne avec des flotteurs. Essayezecho '4 k 50 7 / p' | dc
. La sortie est7.1428
. Lak
commande définit la précision.