Skrypty powłoki Bash #8 - Odpowiedzią jest 42
Intro
Dzień dobry, dzień dobry.
Dzisiaj przejdziemy do świata z nielubianego, przez większość uczniów i studentów. Czyli do świata matematyki buuu.
Zapraszam. :)
Po cholerę mi matematyka?
Nie będę się rozwodził nad tym, jak znajomość matematyki może usprawnić różne algorytmy.
Uznajmy po prostu arbitralnie, że jest przydatna.
A to, co przydatne wypada znać :)
No dobra, to jak się za to zabrać?
W BASHU mamy kilka operacji matematycznych:
- id++ id– postinkrementacja and postdekrementacja zmiennej
- ++id –id preinkrementacja and predekrementacja zmiennej
-
-
- dodawanie, odejmowanie
-
-
- / % mnożenie, dzielenie, modulo (reszta z dzielenia)
- ** potęgowanie
- « » lewe i prawe przesunięcie bitowe (inaczej pomnożenie lub podzielenie przez 2)
- ~ negacja bitowa
- & bitowy AND
- ^ bitowy XOR
-
bitowy OR
Niestety mamy tu mały zgrzyt, ponieważ wykonanie działania np. 2+2
zwróci nam:
To może w cudzysłowie?
To jak tu robić obliczenia?
Teoretycznie jest 5 sposobów, by wykonać obliczenia, ale opowiem tylko o 4, ponieważ 5 jest podobna do jednej z przedstawianych, ale nie jest zgodna z POSIX, a złych nawyków wam przekazywać nie chcę :)
4 Ścieżki.
Droga POSIX
$((2+2))
Droga BASH’a
let var=2+2
Droga shella
expr 2 + 2
Droga C
echo 2+2 | bc
A co te wyniki takie dziwne?
Dochodzimy tutaj do największej tajemnicy matematyki w BASH’u oraz całym shellu.
Smutna prawda jest taka, że shell może operować wyłącznie na liczbach całkowitych, jak widać na wcześniejszych obrazkach.
No dobrze… a co jeśli naprawdę potrzebujemy wyniku z wartością po przecinku, bo np. piszemy skrypt, który będzie okalał jakąś aplikację i będzie nakładał ograniczenia, bo chcemy podzielić moc po równo?
Tutaj mamy do dyspozycji program bc
a dokładniej bc -l
. Program wtedy korzysta z biblioteki matematycznej, która domyślnie zwraca liczbę zmiennoprzecinkową.
I tak działanie 5/3
będzie miało wynik:
Jak widać, jesteśmy uratowani i w tej kwestii :)
Epilog
Podstawy matematyki warto znać oraz to jak wykonać obliczenia w zadanym środowisku.
Ja się dziś z Wami żegnam. Zachęcam do zabawy z matematyką nie tylko w bash’u, ale także na papierze :)
Życzę miłego dnia/nocy i smacznej kawusi/herbatki.