MC, 19:53 niedziela, 27.01.2013 r.
Ilustracja do artykułu: Linux bash - Wykonywanie operacji arytmetycznych (liczby całkowite i rzeczywiste)

Linux bash - Wykonywanie operacji arytmetycznych (liczby całkowite i rzeczywiste)

Kilka słów na temat wykonywania obliczeń w skryptach Bash.

Jak wykonać najprostsze operacje arytmetyczne?

Przy okazji niemal każdego artykułu na temat Basha wspominam, że jest on pełen zaułków, w których często nie łatwo się odnaleźć. Podobnie ma się sprawa dotycząca wykonywania obliczeń matematycznych w skryptach. Przede wszystkich do operacji arytmetycznych przeznaczona jest osobna składnia:
$((<operacje arytmetyczne>))
Widzimy zatem, że obliczeń dokonujemy w podwójnym nawiasie. Zerknijmy na prosty przykład:
$ echo 2+2
2+2
$ echo $((2+2))
4

Spróbujmy jednak wykonać operację dzielenia, bo ta pokaże nam bardzo ważną własność obliczeń w Bashu:

$ echo $((10/5))
2
$ echo $((10/6))
1
Drugi output wskazuje na fakt, że Bash operuje wyłącznie liczbami całkowitymi! Mało tego, wynik nie zostaje zaokrąglony, a jedynie podawana jest jego cześć całkowita (cecha).
Są to najbardziej istotne i najczęściej spotykane informacje jakie należy posiadać na temat obliczeń w Bashu. Spróbujmy jednak zmusić skrypty do pracy z liczbami rzeczywistymi.

Jak wykonywać obliczenia na liczbach rzeczywistych?

Bash sam z siebie potrafi pracować tylko na liczbach całkowitych, natomiast ma również możliwość wykonywania programów zewnętrznych i z tego skorzystamy przy tak postawionym problemie. Po prostu, chcąc wykonać operacje arytmetyczne na liczbach ułamkowych, wywołamy kalkulator działający w wierszu poleceń, na przykład bc. Spójrzmy więc na sposób przekazywania do niego formuł matematycznych:
$ echo $(echo "2+2" | bc -l)
4
$ echo $(echo "10/6" | bc -l)
1.66666666666666666666

Jak widzimy, łączymy strumień wyjściowy polecenia echo i wejściowy naszego kalkulatora. Tym sposobem obchodzimy wrodzoną niemożność Basha i spokojnie możemy wykonywać obliczenia na liczbach ułamkowych.

Komentarze (4)

Imię:
Treść:
Administrator 2018-01-05 07:45:17
@Raf, cieszę się, że problem rozwiązany. Pozdrawiam.
Raf 2018-01-04 10:51:08
Przepraszam, już działa. Po prostu źle to zrozumiałem.
Administrator 2017-12-11 12:54:38
@Raf, co dokładnie nie działa? Pokazałem dwa podejścia, z którym więc jest problem?
Raf 2017-12-11 08:34:35
To nie działa. Próbowałem na Debianie ;___;