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 ;;
  • 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 kluczowe break.

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 :)