Multiplication sur le terminal de ligne de commande


115

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:



45

Pour des mathématiques plus avancées et précises, envisagez d'utiliser bc (1).

echo "3 * 2.19" | bc -l 
6.57

19

Méthodes internes

Bash prend en charge l'expansion arithmétique avec $(( expression )). Par exemple:

$ echo $(( 5 * 5 ))
25

Méthodes externes

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

15

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.


1
dcfonctionne avec des flotteurs. Essayez echo '4 k 50 7 / p' | dc. La sortie est 7.1428. La kcommande définit la précision.
Suspendu jusqu'à nouvel ordre.

@Dennis Dans deux implémentations différentes de dc, je vois des opérations float fonctionner sans affecter via 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?
William Pursell

Je ne l'ai que dcrarement 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 manpage FreeBSD (1993) mentionne que la valeur par défaut est zéro, mais les anciennes manpages BSD ne le font pas.
Suspendu jusqu'à nouvel ordre.

Au fait (pour les futurs lecteurs), mon exemple aurait dû montrer des opérandes non entiers au lieu d'un résultat non entier afin de contrer avec précision l'assertion. N'ayez crainte, echo '4 k 50.5 7 / p' | dcfonctionne (sortie :) 7.2142.
Suspendu jusqu'à nouvel ordre.

8

Une simple fonction shell (pas besoin de sed) devrait faire l'affaire pour interpréter '5X5'

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

6

J'utilise cette fonction qui utilise bcet 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

4

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 xen *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).

J'aime votre idée d'utiliser un «x» pour la multiplication. Vous pouvez également utiliser des crochets au lieu de parenthèses pour éviter d'avoir à citer. trpeut être utilisé pour faire un mappage de caractères pour plusieurs caractères.
Suspendu jusqu'à nouvel ordre.

3

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.