2013-02-22 10 views
24

Mam skrypt kopii zapasowej na moim serwerze, który wykonuje zadania kopii zapasowych cron, i przesyła mi podsumowanie kopii zapasowych plików, w tym rozmiar nowego pliku kopii zapasowej. W ramach skryptu chciałbym podzielić końcowy rozmiar pliku na (1024^3), aby uzyskać rozmiar pliku w GB, od rozmiaru pliku w bajtach.Punkt zmiennoprzecinkowy powoduje podział całkowity Bash

Ponieważ bash nie ma obliczeń zmiennoprzecinkowych, próbuję użyć potoków do bc, aby uzyskać wynik, jednak jestem zbity z powodu podstawowych przykładów.

Starałem się uzyskać wartość liczby Pi do skali, jednak

chociaż następujących prac:

~ #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 

Non wersja interaktywna nie działa:

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

To działa:

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

Ale potrzebuję użyć zmiennych. Więc robi to pomoże, że następujące nie działa:

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

Ja oczywiście brakuje czegoś w składni za pomocą zmiennych w bashu, a przydałby z niektórych „wskaźników” na co ja źle.

Jak powiedział DigitalRoss, mogę użyć następujących:

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

Jednak nie mogę używać skomplikowanych wyrażeń takich jak:

#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 `(' 

Czy ktoś może dać mi pracę poprawnej składni dla uzyskania pływających wyników punktowych z skomplikowane wyrażenia arytmetyczne?

+0

Jest możliwe nauczanie basha, np. Liczba całkowita z wynikami zmiennoprzecinkowymi: Zobacz: http://stackoverflow.com/a/24431665/3776858 – Cyrus

Odpowiedz

31

Wystarczy cudzysłów (") wyrażenie:

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

Następnie bash będzie rozszerzać $ zmienne i ignorować wszystko inne i bc zobaczy wyrażenia z nawiasami:

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

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

Awesome. Nigdy nie myślałem o używaniu podwójnych cudzysłowów do rozszerzania zmiennych. Dziękuję Ci! – Droidzone

+0

Mhhh? podwójne cudzysłowy nie rozszerzają zmiennych, ale pozwalają na to. –

+0

Słodko, przerzuciłbym się na pytona, gdybym się na to natknął. – Gurubaran

7

Uwaga że twój echo $((22/7)) | bc -l faktycznie sprawia, że ​​bash obliczyć 22/7, a następnie wysłać wynik do bc. Wyjście całkowite nie jest zatem wynikiem bc, ale po prostu dane wejściowe podane do bc.

Spróbuj echo $((22/7)) bez podłączania go do bc, a zobaczysz.

Powiązane problemy