Nieodzowną częścią każdego języka programowania czy jak w tym przypadku skryptowego są instrukcje warunkowe. Pozwalają na wykonanie konkretnych akcji w zależności od warunku.

Instrukcja if/else/elif

Najprostszą wersją tej instrukcji jest ta zawierająca tylko instrukcje if, czyli tak naprawdę sprawdza połowę warunku, ponieważ otrzymasz odpowiedź tylko dla jednej spełnionej opcji, bez alternatywy.

Szablon użycia jest prosty. Warunek umieszcza się w nawiasach [], pamiętaj tylko o spacji wewnątrz nawiasów, pomiędzy „;” oraz słowem kluczowym then. Instrukcje if kończy się przy pomocy fi.

Bardziej rozbudowaną wersją jest dodanie else, dzięki czemu sprawdzisz od razu dwa warunki, jeden wprost drugi automatycznie, jeżeli pierwszy nie zostanie spełniony.

Najbardziej rozbudowaną opcją jest dodanie również elif, dzięki czemu możesz sprawdzić wiele różnych warunków. Jeżeli żaden nie będzie spełniał oczekiwań, w klauzuli else, możesz wskazać np. obsługę wyjątku z informacją dla użytkownika o problemie.

Do czego można użyć if?

Na początek możesz sprawdzić czy dany plik istnieje, oczywiście warto jeszcze dodać dodatkowe parametry, które w tym pomogą (teraz -e, na końcu tego wpisu będzie ich cała lista). Sprawdź czy istnieje plik if1.sh. Nazwij plik skryptu jako if.sh, zmień również jego ścieżkę na własną.

Jednak po wykonaniu tego skryptu nic się nie dzieje, dlaczego? Sprawa jest prosta, skrypt sprawdza czy istnieje plik if1.sh, jednak sam skrypt nazywa się if.sh, więc warunek o istnieniu pliku jest fałszywy, a informacja o tym, że if1.sh nie istnieje nie została obsłużona (jeszcze). Jeżeli w skrypcie zmienisz nazwę z if1.sh na if.sh i go ponownie uruchomisz, w odpowiedzi otrzymasz komunikat: Plik if.sh istnieje.

Else pomoże

Dobrze wiedzieć, jeżeli pliku nie ma i tutaj przyda się else. Dzięki rozbudowaniu skryptu o sprawdzenie drugiego warunku (jeżeli są tylko dwie możliwe opcje), otrzymasz w jednym miejscu informacje, które mogą przydać się w rozbudowie skryptu.

Po wykonaniu takiego skryptu masz pewność, że wszystko działa jak powinno, tzn. wszystkie możliwości są przetestowane i w zależności od okoliczności jedna z nich zostanie wyświetlone jako informacja dla ciebie lub użytkownika.

Elif ostatnia deska ratunku

Dobrze, ale co jeżeli potrzebne jest przetestowanie kilku warunków? Tutaj pojawia się z odsieczą Elif. Załóżmy, że potrzebujesz sprawdzić gdzie znajduje się plik, wiesz, że może być w trzech różnych lokalizacjach o ile wcześniejsze kroki zostały poprawnie wykonane i ten plik się tam pojawił. Jest też opcja, że plik z jakiegoś powodu się nie pojawił, co również warto odnotować.

Oczywiście w moim przypadku pojawi się komunikat nr.1 czyli, że plik istnieje w /root/Bash. Jednak wystarczy, że we wszystkich warunkach zmienisz nazwę pliku skryptu na taki, który nie istnieje i skrypt pokaże informacje z else o tym, że plik nie został znaleziony.

Łączenie wykonywania warunków

Bash zapewnia możliwość łączenia kilku warunków. Możliwe są dwa podejścia.

  1. AND (&&) – łączy kilka warunków, jednak wartość True, czyli poprawne wypełnienie warunku (jako całości) możliwe jest tylko wtedy, gdy wszystkie warunki cząstkowe zostały spełnione. warunek1 && warunek2 && … && warunekn
  2. OR (||) – takie łączenie warunków powoduje, że wartość True uzyskasz gdy przynajmniej jeden z warunków cząstkowych będzie spełniony, dlatego trzeba być ostrożnym. warunek1 || warunek2 || … || warunekn

Przełączniki do sprawdzenia warunków.

Poniżej lista chyba wszystkich możliwych przełączników, które możesz wykorzystać przy pisaniu skryptów. Pomyśl ile czasu w pracy z plikami dzięki temu jesteś w stanie zaoszczędzić.

-e plik – prawda, jeśli plik istnieje
-d plik – prawda, jeśli plik istnieje i jest katalogiem
-f plik – prawda, jeśli plik istnieje i jest zwykłym plikiem
-L plik – prawda, jeśli plik istnieje i jest dowiązaniem symbolicznym
-r plik – prawda, jeśli plik istnieje i można go czytać
-w plik – prawda, jeśli plik istnieje i można do niego pisać
-x plik – prawda, jeśli plik istnieje i można go wykonywać
-s plik – prawda, jeśli plik istnieje i ma rozmiar większy od zera
-g plik – prawda, jeśli plik istnieje i ma ustawiony bit set-group-id
-u plik – prawda, jeśli plik istnieje i ma ustawiony bit set-user-id
-b plik – prawda, jeśli plik istnieje i jest urządzeniem blokowym
-c plik – prawda, jeśli plik istnieje i jest urządzeniem znakowym

plik1 -nt plik2 – prawda, jeśli plik1 jest nowszy (zgodnie z datą modyfikacji) niż plik2
plik1 -ot plik2 – prawda, jeśli plik1 jest starszy niż plik2
plik1 -ef plik2 – prawda, jeśli plik1 i plik2 mają te same numery urządzenia i i-węzła

-z ciąg – prawda, jeśli ciąg długość równą zero
-n ciąg – prawda, jeśli ciąg długość większą od zera
ciąg1 = ciąg2 – prawda, jeżeli ciągi są jednakowe
ciąg1 != ciąg2 – prawda, jeżeli ciągi są różne
! wyrażenie – prawda, jeżeli wyrażenie jest fałszywe

wyrażenie -a wyrażenie -prawda, jeśli oba wyrażenia są prawdziwe
wyrażenie -o wyrażenie – prawda, jeżeli przynajmniej jedno z wyrażeń jest prawdziwe

argument1 -eq argument2 – prawda, jeśli argument1 jest równy argumentowi2
argument1 -ne argument2 – prawda, jeśli argument1 jest różny od argumentu2
argument1 -gt argument2 – prawda, jeśli argument1 jest większy od argumentu2
argument1 -ge argument2 – prawda, jeśli argument1 jest większy lub równy argumentu2
argument1 -lt argument2 – prawda, jeśli argument1 jest mniejszy od argumentu2
argument1 -le argument2 – prawda, jeśli argument1 jest mniejszy lub równy argumentowi2

Podsumowanie

Jak widzisz instrukcje warunkowe dają duże możliwości, jednak nie są one optymalne w użyciu, zbyt dużo pisania, a grunt to optymalizacja czasu i ilości linijek kodu. Dlatego w kolejnym wpisie przedstawię instrukcję CASE.

Dodaj komentarz

Twój adres email nie zostanie opublikowany.

Droga Administratora IT.