Skrypty powłoki Bash #10 - Stawiam warunek
Intro
Dzień dobry, dzień dobry. Dziś zajmiemy się “kontrolą przepływu”, czyli instrukcjami warunkowymi.
Zapraszam.
Ster prawo na burt
Procesy decyzyjne w skryptach, są wykonywane przez instrukcje warunkowe takie jak tu obecne if
lub case
Są to konstrukcje blokowe i tak np. deklaracja zwykłego if
wygląda następująco:
konstrukcja if
if [ <warunek> ]; then
polecenie
fi
Rozpoczynamy od słowa kluczowego if
następnie wewnątrz nawiasów kwadratowych [ ]
podajemy warunek, potem słowo then
(zależnie czy w tej samej linii,
czy w następnej stosuje się znak ;
poprzedzający słowo). Dalej podajemy nasze komendy i kończymy “odwróconym słowem kluczowym” czyli fi
.
## Nie zwykły szczur lądowy.
Instrukcja warunkowa ma więcej niż jedną postać. Można wyróżnić dodatkowe dwie formy instrukcji if
.
Konstrukcja if -> else -> fi
:
if [ <warunek> ]; then
polecenie
else
polecenie
fi
Konstrukcja if -> elif -> else -> fi
:
if [ <warunek> ]; then
polecenie
elif [ <inny warunek> ]; then
polecenie
else
polecenie
fi
Konstrukcje te posiadają dodatkowe dwa słowa kluczowe, które mogą zostać wykorzystane w obrębie bloku.
Te słowa to else
oraz elif
.
else
odpowiada za działanie, gdy warunek jest sprzeczny.
Natomiast elif
odpowiada za sprawdzenie kolejnego warunku, gdy poprzedni okazał się, być sprzeczny.
Kapitanie jak te ryby podzielić?
Możesz czasami potrzebować, by wykonań kilka różnych działań, zależnie od wyniku powiedzmy, że np. zależnie od wersji gcc. W tym celu wykorzystamy instrukcję:
case
case <zmienna> in
<warunek 1> ) polecenie ;;
<warunek 2> ) polecenie ;;
<warunek 3> ) polecenie ;;
*) polecenie ;;
esac
Konstrukcja wygląda następująco:
- słowo kluczowe
case
- zmienna na którą będą działać warunki.
- słowo
in
- blok decyzyjny
- każdy element zaczynamy od warunku zakończonego
)
- następne jest polecenie/działanie
- kończymy znakami
;;
- każdy element zaczynamy od warunku zakończonego
- Blok decyzyjny, może być również wyposażony w warunek domyślny
*)
- Kończymy “odwróconym słowem kluczowym”.
Dla ciekawskich powiem, że notacja
;;
jest spowodowana tym, że pojedyńcze;
jest separatorem komend i mogłoby wywołać błędy s niektórych powłokach, jak i pozwoliłoby na sprawdzanie kolejnych warunków. Dlatego też zapis;;
jest wymagany i w tym przypadku działa jak słowo kluczowebreak
.
Negocjujmy. Jakie stawiacie warunki?
Zapewne z niepokojem czekasz, na to, jakie warunki mógłbyś złożyć, ale nie widzisz nigdzie narzędzi do tego, czyli operatorów.
Say no more :)
Operatory
Równości
== (równość) [ $A == $B]
!= (nie równość) [ $A != $B]
Relacyjne
Te operatory są głownie dla liczb
-eq (równe) [ $c -eq $d ]
-ne (nie równe) [ $c -ne $d ]
-gt (większe niż) [ $c -gt $d ]
-It (mniejsze niż) [ $c -lt $d ]
-ge (większe równe) [ $c -ge $d ]
-le (mniejsze równe) [ $c -le $d ]
Logiczne
! (NOT/NIE) [ ! false ]
-o (OR/LUB) [ $c -lt 20 -o $d -gt 100 ]
-a (AND/I) [ $c -lt 20 -a $d -gt 100 ]
Łańcuchowe
Te operatory są głównie dla łańcuchów znaków (tekstu)
= (porównanie) [ $s = $w]
!= (rozróżnienie) [ $s != $w ]
-z (czy długość jest 0) [ -z $s ]
-n (czy długość nie jest 0) [ -n $s]
str (czy nie jest pusty) [ $s ]
Testu plików
-b plik (czy jest specjalny blokowy) [ -b $plik ]
-c plik (czy jest specjalny znakowy) [ -c $plik ]
-d plik (czy jest katalogiem) [ -d $plik ]
-f plik (czy jest zwykły) [ -f $plik ]
-g plik (czy jest ustawiony GID) [ -g $plik ]
-k plik (czy jest ustawiony "sicky bit") [ -k $plik ]
-p plik (czy jest "nazwanym potokiem") [ -p $plik ]
-t plik (czy jest otwarty deskryptor pliku) [ -t $plik ]
-u plik (czy jest ustawiony UID) [ -u $plik ]
-r plik (czy jest odczytywanlny 4r) [ -r $plik ]
-w plik (czy jest zapisywalny 2w) [ -w $plik ]
-x plik (czy jest wykonywalny lx ) [ -x $plik ]
-s plik (czy wielkość większa od 0) [ -s $plik ]
-e plik (czy istnieje) [ -e $plik ]
Epilog
Mam nadzieję, że przekazane informacje, będą dla was przydatne w waszej codziennej pracy, na studiach czy, do zabawy.
Życzę miłego dnia i smacznej kawusi :)