14 Skrypty - wstęp do programowania w powłoce Bash

14.5 Operacje arytmetyczne i warunki logiczne

Powłoka bash pozwala na wykonywanie prostych operacji arytmetycznych na liczbach całkowitych za pomocą instrukcji let.
Przykład:
$ let suma=2+2
$ echo $suma
4
$ let liczba=$suma*2
$ echo $liczba
8
Składnia polecenia let pozwala na używanie zmiennych liczbowych bez konieczności poprzedzania ich znakiem $.
$ let liczba=suma*suma+3
$ let suma++
Dostępne operatory oraz priorytet ich wykonywania są takie same jak w języku C. Dodatkowo, dostępny jest operator ** realizujący potęgowanie.
$ let x=2**10
$ echo $x
1024
Równoważne użyciu polecenia let jest zastosowanie (( wyrażenie )).
Przykłady:
$ a=$((1+2))
$ a=$(($a*$a))
$ a=$((a+1))
$ ((a++))

Proste operacje arytmetyczne można także wykonywać za pomocą instrukcji expr. Obliczenia o precyzji zmiennopozycyjnej (dla liczb rzeczywistych) można wykonywać za pomocą kalkulatorów bc lub dc.

Wyrażenia warunkowe realizowane są za pomocą polecenia [ wyrażenie ] lub polecenie test. Wartością zwracaną polecenia jest kod (status programu) 0 w przypadku gdy wyrażenie jest prawdziwe lub 1 gdy wyrażenie jest fałszywe.
Uwaga: wyrażenie [ jest poleceniem, dlatego wszystkie argumenty muszą byc oddzielone spacją.
Porównywanie napisów odbywa się za pomocą argumentów ==, !=, < i >.
$ [ $SHELL == /bin/bash ] && echo Uzywasz powloki Bash
$ test $USER != root && echo Nie jestes administratorem
Porównując liczby całkowite należy skorzystać z operatorów -eq ((ang. equal) - równe), -ne ((ang. not equal) - nie równe), -lt ((ang. less then) - mniejsze niż), -gt ((ang. greater than) - większe niż), -le ((ang. less equal) - mniejsze równe) i -ge ((ang. greater equal) - większe równe).
$ [ $RANDOM -lt 16384 ] && echo Reszka || echo Orzel
$ test $(cat /etc/passwd | wc -l) -gt 100 && echo Uzytkownikow jest wiecej niz 100
Wyrażenie warunkowe może tez sprawdzać atrybuty plików:

-e plik plik istnieje
-f plik plik istnieje i jest zwykłym plikiem
-d plik plik istnieje i jest katalogiem
-r plik użytkownik posiada prawo do czytania pliku
-w plik użytkownik posiada prawo do zmiany zawartości pliku
-x plik użytkownik posiada prawo do wykonywania pliku
-o plik użytkownik jest właścicielem pliku

$ [ -e /etc/passwd ] && echo Plik /etc/passwd istnieje
$ test -d /etc/passwd && echo Plik /etc/passwd jest katalogiem
Dostępne mamy też operatory && (AND), || (OR) oraz zaprzeczenie ! (NOT) pozwalające łączyć wyrażenia warunkowe w bardziej złożone warunki.
W takim przypadku złożone wyrażenie logiczne należy umieścić w dodatkowych nawiasach [].
$ [[ $(($RANDOM%2)) -eq 1 && ! $USER == root ]] && echo Warunek jest spelniony
$ test ! -w /etc/passwd || $USER != root && echo Nie masz uprawnien do modyfikcaji /etc/passwd lub nie jestes root-em.
Wyrażenia warunkowe znajdują zastosowanie wraz z instrukcją if oraz pętlą while oraz until.