2013-02-22 3 views
24

Ho uno script di backup sul mio server che esegue processi cron di backup e mi invia un riepilogo dei file di cui è stato eseguito il backup, inclusa la dimensione del nuovo file di backup. Come parte dello script, mi piacerebbe dividere la dimensione finale del file di (1024^3) per ottenere la dimensione del file in GB, dalla dimensione del file in byte.Il punto in virgola mobile risulta nella divisione intera Bash

Poiché bash non ha il calcolo in virgola mobile, sto provando a usare pipe to bc per ottenere il risultato, tuttavia mi sto facendo notare su esempi di base.

Ho cercato di ottenere il valore di Pi a una scala, tuttavia,

anche se i seguenti lavori:

~ #bc -l 
bc 1.06.95 
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc. 
This is free software with ABSOLUTELY NO WARRANTY. 
For details type `warranty'. 
4/3 
1.33333333333333333333 
22/7 
3.14285714285714285714 
q 
0 
quit 

Una versione non interattiva non funziona:

#echo $((22/7)) | bc 
3 

Funziona:

#echo '22/7' | bc -l 
3.14285714285714285714 

Ma ho bisogno di usare le variabili. Così non aiuta che il seguente non funziona:

#a=22 ; b=7 
#echo $((a/b)) | bc -l 
3 

Sono ovviamente manca qualcosa nella sintassi per l'utilizzo di variabili in Bash, e potrebbe utilizzare con alcuni 'indicatori' su quello che ho capito male.

Come ha detto DigitalRoss, posso utilizzare il seguente:

#echo $a/$b | bc -l 
3.14285714285714285714 

Tuttavia non posso usare espressioni complesse come:

#echo $a/(($b-34)) | bc -l 
-bash: syntax error near unexpected token `(' 
#echo $a/((b-34)) | bc -l 
-bash: syntax error near unexpected token `(' 
#echo $a/((b-34)) | bc -l 
-bash: syntax error near unexpected token `(' 

Qualcuno può darmi una sintassi corretta di lavoro per ottenere risultati in virgola mobile con complicate espressioni aritmetiche?

+0

È possibile insegnare bash ad es. divisione intera con risultati in virgola mobile: vedere: http://stackoverflow.com/a/24431665/3776858 – Cyrus

risposta

31

Basta fare doppio citazione (") l'espressione:

echo "$a/($b - 34)" | bc -l 

Poi bash si espanderà le variabili $ e ignorare tutto il resto e bc vedrà un'espressione con parentesi:

$ a=22 
$ b=7 
$ echo "$a/($b - 34)" 
22/(7 - 34) 

$ echo "$a/($b - 34)" | bc -l 
-.81481481481481481481 
+0

Impressionante. Non ho mai pensato di usare le virgolette per espandere le variabili. Grazie! – Droidzone

+0

Mhhh? le virgolette doppie non espandono le variabili ma lo permettono. –

+0

dolce, sarei passato a pitone se avessi inciampato su questo. – Gurubaran

7

Si prega di notare che il tuo echo $((22/7)) | bc -l effettui effettivamente il calcolo bash 22/7 e poi invii il risultato a bc. L'output intero non è quindi il risultato di bc, ma semplicemente l'input dato a bc.

Prova echo $((22/7)) senza collegarlo a bc e vedrai.