2009-07-06 19 views
66

Mam zmienne i chcę znaleźć wartość jednego podzielone przez inne. Jakie polecenia powinienem użyć, aby to zrobić?Jak dokonać podziału w konsoli systemu Linux?

+1

Czy to naprawdę związane z programowaniem? [http://stackoverflow.com/faq] –

+3

Sprawdź ten artykuł: [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 może być używany do programowania ... także, ten link do faq nie działa – chomp

Odpowiedz

5

Zakładam, że przez konsoli Linux masz na myśli Bash.

Jeśli zmiennymi są X i Y, zwracamy to, o co prosisz.

+1

Nie potrzebujesz $ 's dla zmiennych – Draemon

62

W powłoki bash, otaczają wyrażeń arytmetycznych z $((...))

$ echo $((7/3)) 
2 

Chociaż myślę, że są ograniczone do liczb całkowitych.

+10

Tak, bash jest ograniczony do liczby całkowitej. – mkb

2

Przykład podziału całkowitej za pomocą bash do dzielenia $ a przez $ b:

echo $((a/b)) 
8

W bash, jeśli nie trzeba dziesiętnych w swojej dywizji, można zrobić:

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

I wciąż wolą używać dc, który jest kalkulator RPN, więc szybki sesji podzielić 67 przez 18 z 4 cyfr precyzja będzie wyglądać

>dc 
4k 
67 
18/p 
3.7222 
q 
> 

Oczywiście, o wiele bardziej dostępny: człowiek dc

+4

Kilka wskazówek, aby ewentualnie zapisać podróż do 'man': RPN = Reverse Polish Notation; w skrócie: najpierw wpisujesz operandy, potem operator. Koniec 'p' jest potrzebny do wyprowadzenia wyniku. Nieinteraktywna wersja powyższego obliczenia to: 'dc -e '4k 67 18/p''. Zastrzeżenie: brak ustawienia precyzji (przy '' numPlaces} k') przyjmuje wartość 0, tzn. Podział całkowity. – mklement0

16

Lepszym sposobem jest użycie "BC", kalkulator dowolnej precyzji.

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

ex:

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

gdzie "skala = 5" jest dokładność.

man bc 

zawiera kilka przykładów użycia.

+1

Cool; jedna rzecz do zapamiętania: nie ustawiając 'scale' domyślnie na dzielenie całkowite - chyba że podasz' -l', jako @raytrace zauważa poniżej, co najwyżej daje 20 miejsc dziesiętnych domyślnie, ale także ładuje bibliotekę z dodatkowymi funkcjami. – mklement0

36
echo 5/2 | bc -l 

2,50000000000000000000

to '-l' w opcji 'bc' pozwala pływających wyników

+3

Cool; z '-l', dostajesz domyślnie 20 miejsc dziesiętnych * i * ładuje się bibliotekę matematyczną, która definiuje dodatkowe funkcje, takie jak sinus; aby jawnie określić liczbę miejsc dziesiętnych, należy poprzedzić wyrażenie za pomocą 'scale = {numPlaces};' (też), jak pokazano w odpowiedzi @ user1504475. Innymi słowy: '-l' jest wygodną alternatywą dla określenia' scale = 20; ', ale wiąże się z kosztem wydajności związanym z ładowaniem biblioteki - wpływ na rzeczywistość wydaje się być jednak pomijalny. – mklement0

2

coś jeszcze można zrobić przy użyciu raytrace za odpowiedź. Możesz użyć stdout innego wywołania powłoki, używając backticks, aby wykonać pewne obliczenia. Na przykład chciałem poznać rozmiar pliku 100 najlepszych wierszy z kilku plików. Oryginalny rozmiar z wc -c jest w bajtach, chcę wiedzieć kilobajty. Oto co zrobiłem:

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

Można użyć awk który jest narzędziem/język przeznaczony do ekstrakcji danych

przykład dla 1,2/3.4

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

Należy spróbować użyć:

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

można również użyć perl -e

perl -e 'print 67/8' 
-1

miałem również ten sam problem. Łatwo jest dzielić liczby całkowite, ale liczby dziesiętne nie są takie proste. jeśli masz 2 cyfry, takie jak 3,14 i 2,35 i podziel numery, następnie kod będzie Podział = echo 3.14/2.35 | bc echo "$ Division" Cytaty są różne. Nie mylić, znajduje się tuż pod klawiszem esc na klawiaturze. JEDYNĄ RÓŻNICĄ JEST | bc, a także tutaj echo działa jako operator dla obliczeń arytmetycznych zamiast drukowania. Dodałem więc echo "$ Division" do drukowania wartości. Daj mi znać, czy to działa dla Ciebie. Dziękuję Ci.

+0

Cytaty tutaj nie są wyświetlane, więc po prostu wstaw cytaty ('') after = i after bc. – SHIBLI

+0

To nie są cytaty. Są to ostre akcenty. Nie wyświetlają się, ponieważ StackOverflow używa ich do podświetlania fragmentów kodu "jakiś kod tutaj" został właśnie zawinięty w ostre akcenty. –

Powiązane problemy