2009-07-06 7 views
66

J'ai des variables et je veux trouver la valeur d'un divisé par l'autre. Quelles commandes devrais-je utiliser pour faire ceci?Comment est-ce que je divise dans la console Linux?

+1

Est-ce vraiment lié à la programmation? [http://stackoverflow.com/faq] –

+3

Cochez cette case: [http://www.basicallytech.com/blog/index.php?/archives/23-command-line-calculations-using-bc.html] (http://www.basicallytech.com/blog/index.php?/archives/23-command-line-calculations-using-bc.html) – freitass

+1

@ frank-v Bash peut être utilisé pour la programmation ... aussi, ce lien vers faq ne fonctionne pas – chomp

Répondre

5

Je suppose que par console Linux vous voulez dire Bash. Si X et Y sont vos variables, $(($X/$Y)) renvoie ce que vous demandez.

+1

Vous n'avez pas besoin de $ pour les variables – Draemon

62

Dans le shell bash, entourent les expressions arithmétiques avec $((...))

$ echo $((7/3)) 
2 

Bien que je pense que vous êtes limité à des nombres entiers.

+10

Oui, bash est limité à maths entiers. – mkb

2

Exemple de la division entière en utilisant bash pour diviser un par $ b:

echo $((a/b)) 
8

En bash, si vous n'avez pas besoin de décimales dans votre division, vous pouvez le faire:

>echo $((5+6)) 
11 
>echo $((10/2)) 
5 
>echo $((10/3)) 
3 
11

Je préfère encore utiliser dc, qui est une calculatrice RPN, si la session rapide pour diviser 67 par 18 avec 4 chiffres de précision ressemblerait

>dc 
4k 
67 
18/p 
3.7222 
q 
> 

De toute évidence, beaucoup plus disponible: homme dc

+4

Quelques indications pour éventuellement enregistrer un voyage dans 'man': RPN = Reverse Polish Notation; en un mot: vous entrez les opérandes d'abord, puis l'opérateur. Un 'p' final est nécessaire pour sortir le résultat. La version non interactive du calcul ci-dessus est: 'dc -e '4k 67 18/p''. Avertissement: ne pas définir la précision (avec '{numPlaces} k') par défaut à 0, c'est-à-dire une division entière. – mklement0

16

Une meilleure façon est d'utiliser "bc", un calculateur de précision arbitraire.

variable=$(echo "OPTIONS; OPERATIONS" | bc) 

ex:

my_var=$(echo "scale=5; $temp_var/100 + $temp_var2" | bc) 

où "échelle = 5" est la précision.

man bc 

est livré avec plusieurs exemples d'utilisation.

+1

Cool; une chose à noter: ne pas mettre 'scale' par défaut à division entière - sauf si vous spécifiez' -l', comme @raytrace notes ci-dessous, ce qui vous donne apparemment 20 décimales par défaut, mais charge également une bibliothèque avec des fonctions supplémentaires. – mklement0

36
echo 5/2 | bc -l 

2,50000000000000000000

cette option '-l' en 'bc' permet des résultats flottants

+3

Cool; avec '-l', vous obtenez 20 positions décimales par défaut * et * une bibliothèque mathématique est chargée qui définit des fonctions supplémentaires telles que sine; Pour spécifier explicitement le nombre de décimales, ajoutez l'équation à l'aide de 'scale = {numPlaces};' (trop), comme indiqué dans la réponse de @ user1504475. En d'autres termes: '-l' est une alternative pratique à la spécification de' scale = 20; ', mais cela a un coût de performance dû au chargement de la bibliothèque - l'impact réel semble cependant négligeable. – mklement0

2

autre chose que vous pourriez faire en utilisant la réponse de Raytrace. Vous pouvez utiliser la sortie stdout d'un autre appel shell en utilisant des backticks pour ensuite faire quelques calculs. Par exemple, je voulais connaître la taille du fichier des 100 premières lignes à partir de quelques fichiers. La taille originale de wc -c est en octets, je veux savoir kilo-octets. Voici ce que je l'ai fait:

echo `cat * | head -n 100 | wc -c`/1024 | bc -l 
11

Vous pouvez utiliser awk qui est un utilitaire/langage conçu pour l'extraction de données

par exemple pour 1,2/3.4

>echo 1.2 3.4 | awk '{ print $2/$1 }' 
0.352941 
1

Vous devriez essayer d'utiliser:

echo "scale=4;$variablename/3"|bc 
1

vous pouvez également utiliser perl -e

perl -e 'print 67/8' 
-1

J'ai eu le même problème. Il est facile de diviser des nombres entiers mais les nombres décimaux ne sont pas si faciles. si vous avez 2 chiffres comme 3.14 et 2.35 et diviser les nombres puis, le code sera Division = echo 3.14/2.35 | bc echo "$ Division" les citations sont différentes. Ne soyez pas confus, il est situé juste sous le bouton Echap de votre clavier. LA SEULE DIFFÉRENCE EST LE | bc et aussi ici echo fonctionne comme un opérateur pour les calculs arithmétiques au lieu de l'impression. Donc, j'avais ajouté echo "$ Division" pour l'impression de la valeur. Dites-moi si cela marche pour vous. Je vous remercie.

+0

Les guillemets ne sont pas montrés ici, Donc, il suffit de mettre les guillemets ('') après = et après bc. – SHIBLI

+0

Ce ne sont pas des citations. Ce sont des accents aigus. Ils ne s'affichent pas parce que StackOverflow les utilise pour mettre en évidence des extraits de code «du code ici» était juste enveloppé dans les accents aigus. –