Skip to main content Link Menu Expand (external link) Document Search Copy Copied
SOP Lab 2

Bash bardziej złożony

Tego już nie było na UKOS. Chyba


Warunki

Działanie if-ów w bashu jest oczywiście identyczne, jak w każdym języku programowania. Mimo identycznego działania, składnia basha jest dość charakterystyczna.

if [ statement ]
then
    do_something
else
    do_something_else
fi

Wyrażenie postawione w nawiasie kwadratowym (pamiętajcie o spacjach!) to tak naprawdę polecenie test. Nie będę tu wklejał całego manuala, więc zachęcam do przejrzenia, szczególnie, że dziś się przyda.

Polecenie test -e ../Documents/print.c dokona sprawdzenia, czy istnieje plik o podanej ścieżce. Wykonanie go nie da nam jednak absolutnie żadnej informacji zwrotnej na terminalu. Dzieje się tak, ponieważ polecenie nie zwraca nic na stdout. Możemy jednak sprawdzić jego wynik używając specjalnej zmiennej, tzw “wbudowanej” - $?. Zwróci ona exit status ostatniego wykonanego polecania, bardzo przydaje się przy weryfikacji, czy wszystko w skrypcie idzie tak jak powinno. Instrukcja exit 123 w skrypcie zakończy go z kodem 123.

Pętle

W bashu mamy kilka rodzajów pętli, a niektóre z nich mają też kilka możliwych zachowań, dlatego ważne, aby się z nimi zapoznać.

For

for zmienna in 1 2 3 4
do
    echo $zmienna
done

For wykonujący się na secie danych, czyli dla pętla wykonująca się dla każdego elementu. Takim setem danych może być również wynik jakiegoś polecenia, np. jeśli chcielibyśmy wykonać jakieś działanie dla każdego pliku kończącego się na “.cpp”:

for zmienna in `ls *.cpp`
do
    echo $zmienna
done

Niezależnie od tego, znany każdemu for również się wykona:

for ((i=0;i<10;i++))
do
    echo $i
done

While

Pętla while jest bardzo prosta

while [ statement ]
do
    echo whatever
done

Praca z tekstem

Grepa wszyscy bez wątpienia pamiętają z UKOS i regexami posługiwać się potrafią z zamkniętymi oczami, ale na wszelki wypadek przypomnę. Polecenie grep wyszuka nam w podanym do niego tekście wszystkie wystąpienia podanego do polecenia patternu.

grep 'Lidl' zakupy.txt

Znajdzie wszystkie wystąpienia słowa “Lidl”. Ale wyrażenia regularne określają pewien pattern - przecież na liście zakupów mógł pojawić się lidl zamiast Lidla. Dlatego grep pozwala na zastępowanie pewnych znaków (lub ciągów) symbolami oraz na określanie, w jakiej ilości występują.

  • . – pojedynczy znak
  • ? – poprzedni znak pojawia się 0 lub 1 raz
  • * - poprzedni znak pojawia się 0 lub więcej razy
  • + - poprzedni znak pojawia się 1 lub więcej razy
  • {n} – poprzedni znak pojawia się n lub więcej razy
  • {n,m} – poprzedni znak pojawia się od n do m razy
  • [abc] – znak jest jednym z wymienionych w nawiasie
  • [^abc] – znak nie jest jednym z wymienionych w nawiasie
  • () – pozwala na grupowanie znaków
  • | - operacja logiczna OR
  • ^ - początek linii
  • $ - koniec linii (za koniec przyjmujemy tutaj znacznik LF, windowsowe CRLF może nie zostać wykryte)

Ale praca z tekstem w bashu to nie tylko wyszukiwanie tekstu, to również jego edycja. Do tego skorzystamy z polecenia sed. Jest ono absolutnie przepotężne, ale w gruncie rzeczy najczęściej jego użycie sprowadzać się będzie do wyszukiwania tekstu i zastępowania go innym:

sed 's/UKOS/SOP/' przedmioty.txt

Takie polecenie zamieni wszystkie wystąpienia słowa “UKOS” na “SOP” w pliku przedmioty.txt. Doprowadzenie seda do działania, przynajmniej w moim przypadku, właściwie zawsze wymaga konsultacji z dokumentacją i wujkiem google, także również do tego zachęcam.


Zadania do laboratorium

  1. Napisz wyrażenia regularne, które sprawdzą:
    1. Czy podany tekst jest adresem e-mail
    2. Czy podany tekst jest prawidłowym imieniem (zaczyna się od wielkiej litery i zawiera tylko litery)
    3. Czy podany teks jest prawidłowym polskim kodem pocztowym (69-420)
  2. Napisz skrypt, który sprawdzi, czy podano do niego dokładnie jeden argument (przypomnę o $#, $@) oraz czy jest to plik, a następnie wyszuka w tym pliku wszystkie wystąpienia ciągu “s[5cyfr]”
  3. NA DODATKOWY PUNKT Napisz skrypt, który wspomoże biednego wykładowcę w sprawdzaniu kolokwiów. W katalogu znajdują się 32 pliki cpp, nazywające się zgodnie ze wzorem - [nrindeksu]_z1.cpp. Zadanie, które będzie sprawdzane poległo na wczytaniu od użytkownika liczby <25 i wydrukowaniu jej silni. Biedny wykładowca chciałby aby:
    • Wyświetlony na górze ekranu został nr indeksu studenta bez rozszerzenia oraz numeru zadania
    • Poniżej wyniki wywołania sprawdzanego zadania na wartościach 5, 10 i 30
    • Skrypt umożliwił mu wpisanie liczby punktów za zadanie i umieszczenie jej wraz z SAMYM nr indeksu w pliku tekstowym lub wyświetlenie kodu zadania w razie wątpliwości
    • Po wpisaniu oceny powinien przejść automatycznie do następnego studenta.