2009-07-06 15 views
66

Devo variabili e voglio trovare il valore di uno diviso per l'altro. Quali comandi dovrei usare per fare questo?Come divido nella console Linux?

+1

Si tratta di una vera e propria programmazione? [http://stackoverflow.com/faq] –

+3

Controlla questo articolo: [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 può essere utilizzato per la programmazione ... inoltre, il collegamento a faq non funziona – chomp

risposta

5

Presumo che da console Linux intendi Bash.

Se X e Y sono le variabili, $(($X/$Y)) restituisce quello che chiedi.

+1

Non sono necessari gli $ per le variabili – Draemon

62

Nella shell bash, circondano espressioni aritmetiche con $((...))

$ echo $((7/3)) 
2 

Anche se credo che si sono limitati a numeri interi.

+10

Sì, bash è limitato alla matematica intera. – mkb

2

Esempio di divisione intera usando bash per dividere $ a di $ b:

echo $((a/b)) 
8

In bash, se non hai bisogno di decimali nella vostra divisione, si può fare:

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

io preferisco ancora utilizzando dc, che è un calcolatore RPN, sessione in modo veloce da dividere 67 da 18 con 4 cifre precisione sarebbe simile

>dc 
4k 
67 
18/p 
3.7222 
q 
> 

Ovviamente, molto più disponibile: uomo dc

+4

Alcuni suggerimenti per salvare un viaggio in 'man': RPN = Reverse Polish Notation; in breve: si entra prima per gli operandi, poi per l'operatore. Per emettere il risultato è necessario un 'p' che termina. La versione non interattiva del calcolo di cui sopra è: 'dc -e '4k 67 18/p''. Avvertenza: non impostando la precisione (con '{numPlaces} k'), il valore predefinito è 0, cioè divisione in interi. – mklement0

16

Modo migliore è quello di utilizzare "bc", un calcolatore di precisione arbitraria.

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

es:

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

dove "scale = 5" è la precisione.

man bc 

fornito con diversi esempi di utilizzo.

+1

Fresco; una cosa da notare: non impostando i valori di default 'scale' su divisione intero, a meno che non si specifichi' -l', come note @raytrace di seguito, che apparentemente fornisce 20 cifre decimali per impostazione predefinita, ma carica anche una libreria con funzioni aggiuntive. – mklement0

36
echo 5/2 | bc -l 

2,50000000000000000000

questa opzione '-l' a 'bc' permette galleggiante risultati

+3

Fresco; con '-l', si ottengono 20 posizioni decimali di default * e * viene caricata una libreria matematica che definisce funzioni aggiuntive come il seno; per specificare esplicitamente il numero di posizioni decimali, anteporre l'espressione con 'scale = {numPlaces};' (anche), come dimostrato nella risposta di @ user1504475. In altre parole: '-l' è una comoda alternativa alla specifica di' scale = 20; ', ma ha un costo di prestazioni dovuto al caricamento della libreria - l'impatto nel mondo reale sembra tuttavia trascurabile. – mklement0

2

Qualcos'altro si potrebbe fare usando la risposta di raytracing. Potresti usare lo stdout di un'altra chiamata di shell usando i backtick per fare alcuni calcoli. Ad esempio, volevo sapere la dimensione del file delle prime 100 righe da un paio di file. La dimensione originale da wc -c è in byte, voglio sapere kilobyte. Ecco quello che ho fatto:

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

È possibile utilizzare awk che è un programma di utilità/linguaggio progettato per l'estrazione dei dati

esempio per 1.2/3.4

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

Si dovrebbe cercare di utilizzare:

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

è anche possibile utilizzare perl -e

perl -e 'print 67/8' 
-1

Ho anche avuto lo stesso problema. È facile dividere i numeri interi ma i numeri decimali non sono così facili. se hai 2 numeri come 3.14 e 2.35 e dividi i numeri allora, il codice sarà Divisione = echo 3.14/2.35 | bc echo "$ Division" le virgolette sono diverse. Non essere confuso, si trova proprio sotto il pulsante esc sulla tastiera. L'UNICA DIFFERENZA È IL | bc e anche qui echo funziona come operatore per i calcoli aritmetici al posto della stampa. Quindi, ho aggiunto echo "$ Division" per stampare il valore. Fammi sapere se funziona per te. Grazie.

+0

Le virgolette non sono mostrate qui, Quindi, basta mettere le virgolette ('') dopo = e dopo bc. – SHIBLI

+0

Questi non sono citazioni. Sono accenti acuti. Non vengono mostrati perché StackOverflow li usa per evidenziare frammenti di codice "alcuni codici qui" sono stati appena avvolti negli accenti acuti. –

Problemi correlati