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 w BASH
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.
1 2 3 |
if [ warunek1 ] ; then polecenie1 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.
1 2 3 4 5 |
if [ warunek1 ] ; then polecenie1 else polecenie2 fi |
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.
1 2 3 4 5 6 7 8 9 10 11 |
if [ warunek1 ] ; then polecenie1 elif [ warunek2 ] ; then polecenie2 elif [ warunek3 ] polecenie3 elif [ warunek n] polecenien else polecenien+1 fi |
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ą.
1 2 3 4 |
#!/bin/bash if [ -e /root/Bash/if1.sh ] ; then echo "Plik if1.sh istnieje" fi |
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.
1 2 3 4 5 6 |
#!/bin/bash if [ -e /root/Bash/if1.sh ] ; then echo "Plik if1.sh istnieje" else echo "Plik if1.sh nie istnieje" fi |
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ć.
1 2 3 4 5 6 7 8 9 10 |
#!/bin/bash if [ -e /root/Bash/if.sh ] ; then echo "Plik if.sh istnieje w /root/Bash/" elif [ -e /usr/bin/if.sh] ; then echo "Plik if.sh istnieje w /usr/bin/" elif [ -e /tmp/if.sh ] ; then echo "Plik if.sh istnieje w /tmp/" else echo "Ups, if.sh nie został znaleziony" fi |
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.
- 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
- 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.
Dziękuję Ci, za poświęcony czas na przeczytanie tego artykułu. Jeśli był on dla Ciebie przydatny, to gorąco zachęcam Cię do zapisania się na mój newsletter, jeżeli jeszcze Cię tam nie ma. Proszę Cię także o “polubienie” mojego bloga na Facebooku oraz kanału na YouTube – pomoże mi to dotrzeć do nowych odbiorców. Raz w tygodniu (niedziela punkt 17.00) otrzymasz powiadomienia o nowych artykułach / projektach zanim staną się publiczne. Możesz również pozostawić całkowicie anonimowy pomysł na wpis/nagranie.
Link do formularza tutaj: https://beitadmin.pl/pomysly
Pozostaw również komentarz lub napisz do mnie wiadomość odpisuję na każdą, jeżeli Masz jakieś pytania:).