Laboratorium Bash – Zadania praktyczne

Poniżej znajduje się 10 zadań laboratoryjnych z zakresu programowania w powłoce Bash. Każde zadanie jest zaprojektowane tak, aby zajmowało około 25-30 minut do wykonania. Zadania obejmują różne tematy poznane na wykładzie, od podstaw tworzenia skryptów, przez pracę ze zmiennymi, instrukcje warunkowe i pętle, aż po zaawansowane przetwarzanie tekstu i zarządzanie procesami.

Zadanie 1: Kalkulator ocen semestralnych

Cel: Napisz skrypt, który obliczy średnią ocen studenta z semestru i określi, czy student zdał egzamin (średnia >= 3.0).
Scenariusz: Jesteś administratorem systemu na uczelni. Prowadzący poprosił Cię o stworzenie prostego narzędzia do wprowadzania ocen cząstkowych i automatycznego obliczania średniej. Skrypt ma działać interaktywnie - użytkownik wprowadza kolejne oceny, a gdy zakończy wpisywanie, wpisuje słowo "koniec". Skrypt następnie oblicza średnią arytmetyczną ze wszystkich wprowadzonych ocen i wyświetla ją z dokładnością do dwóch miejsc po przecinku. Na końcu skrypt wyświetla komunikat informujący czy student zdał egzamin (średnia >= 3.0) czy nie zdał (średnia < 3.0).
Wskazówki do wykonania:

Zadanie 2: Monitor dostępności serwerów

Cel: Stwórz skrypt, który sprawdzi dostępność listy serwerów i wygeneruje raport w pliku.
Scenariusz: Pracujesz w dziale IT. Twoim zadaniem jest codzienne sprawdzanie czy kluczowe serwery w firmie są dostępne. Napisz skrypt, który dla zadanej listy serwerów (np. web01, db01, mail01, backup01) wykonuje próbę ping i zapisuje wynik do pliku raportu z datą i godziną. Skrypt powinien sprawdzać każdy serwer z listy, zapisywać czy odpowiedział czy nie, oraz ile ms wynosił czas odpowiedzi. Na końcu plik raportu powinien zawierać podsumowanie: ilu serwerów odpowiedziało a ilu nie odpowiedziało. Uruchom skrypt i sprawdź wynik w pliku raportu.
Wskazówki do wykonania:

Zadanie 3: Parser pliku logów

Cel: Napisz skrypt, który przeanalizuje plik logów i wyświetli statystyki błędów.
Scenariusz: Jesteś administratorem systemu. Po awarii musisz przeanalizować plik logów, aby znaleźć przyczynę problemu. Napisz skrypt, który odczyta plik logów (jeśli plik nie istnieje, skrypt najpierw tworzy przykładowy plik logów z losowymi wpisami), wyszuka linie zawierające słowo "ERROR", a następnie wyświetli statystyki: ile razy wystąpił każdy typ błędu, data i godzina pierwszego i ostatniego wystąpienia błędu oraz najczęściej występujący typ błędu z informacją, ile razy wystąpił. Skrypt powinien też wyświetlić listę wszystkich unikalnych typów błędów znalezionych w logach.
Wskazówki do wykonania:

Zadanie 4: Automatyczny backup plików

Cel: Stwórz skrypt do tworzenia kopii zapasowych wybranych plików z mechanizmem wersji.
Scenariusz: Jesteś administratorem systemu i musisz zapewnić bezpieczeństwo danych. Napisz skrypt, który tworzy archiwum spakowane (tar.gz) z podanych plików lub katalogów, dodając do nazwy pliku archiwum datę i godzinę w formacie RRRR-MM-DD_GG-MM-SS. Skrypt powinien obsługiwać dwa tryby pracy: tryb backup (utworzenie archiwum) i tryb restore (odtworzenie plików z archiwum). W trybie backup skrypt przyjmuje jako argumenty katalog źródłowy i katalog docelowy (domyślnie /tmp/backup). W trybie restore skrypt przyjmuje jako argument ścieżkę do pliku archiwum i katalog docelowy. Skrypt powinien wyświetlać komunikaty postępu i na końcu informować o sukcesie lub błędzie operacji. Uruchom skrypt w obu trybach i sprawdź wyniki.
Wskazówki do wykonania:

Zadanie 5: Generator haseł

Cel: Napisz skrypt generujący bezpieczne hasła losowe.
Scenariusz: Twoja firma potrzebuje narzędzia do generowania bezpiecznych haseł dla nowych pracowników. Napisz skrypt, który generuje hasło o podanej długości (domyślnie 16 znaków jeśli nie podano argumentu) zawierające wielkie litery (A-Z), małe litery (a-z), cyfry (0-9) i znaki specjalne. Skrypt powinien przyjmować jeden opcjonalny argument określający długość hasła. Po wygenerowaniu hasła skrypt powinien zweryfikować czy hasło zawiera przynajmniej jedną wielką literę, jedną małą literę, jedną cyfrę i jeden znak specjalny - jeśli któryś z tych warunków nie jest spełniony, skrypt generuje hasło ponownie. Hasło powinno być wyświetlane na ekranie w czytelnym formacie. Uruchom skrypt kilka razy z różnymi długościami i sprawdź wyniki.
Wskazówki do wykonania:

Zadanie 6: Menedżer procesów

Cel: Stwórz skrypt do zarządzania procesami - wyświetlanie, wyszukiwanie i zabijanie procesów.
Scenariusz: Jako administrator systemu musisz mieć narzędzie do zarządzania procesami na serwerze. Napisz skrypt, który potrafi wykonywać trzy akcje: (1) list – wyświetlić wszystkie procesy uruchomione przez aktualnego użytkownika w czytelnym formacie, (2) find – wyszukać proces po nazwie i wyświetlić jego PID, użytkownika i czas działania, (3) kill – zakończyć proces o podanym PID używając sygnału SIGTERM (domyślnie) lub SIGKILL (gdy podano opcję -9). Skrypt powinien sprawdzać uprawnienia – zabijanie procesów innych użytkowników powinno być możliwe tylko dla root. Skrypt powinien też chronić przed przypadkowym zabiciem krytycznych procesów (PID 1, procesy systemowe). Uruchom skrypt w każdym trybie i sprawdź wyniki.
Wskazówki do wykonania:

Zadanie 7: Konwerter jednostek

Cel: Napisz skrypt do konwersji jednostek (długości, temperatury, wagi).
Scenariusz: Pracujesz w dziale logistyki i potrzebujesz narzędzia do szybkiej konwersji jednostek. Napisz skrypt, który obsługuje konwersje jednostek długości (metry <-> stopy, cale <-> centymetry), temperatury (Celsiusz <-> Fahrenheit, Celsiusz <-> Kelvin, Fahrenheit <-> Kelvin) oraz wagi (kilogramy <-> funty, gramy <-> uncje). Skrypt przyjmuje cztery argumenty: typ jednostki (długość/temperatura/waga), wartość do przeliczenia, jednostka źródłowa i jednostka docelowa. Skrypt powinien walidować argumenty i wyświetlać błąd gdy podano nieprawidłowe dane. Wynik konwersji powinien być wyświetlony w czytelnym formacie z informacją, co i jak przeliczono. Uruchom skrypt dla każdego typu konwersji i sprawdź wyniki.
Wskazówki do wykonania:

Zadanie 8: System logowania

Cel: Stwórz własny system logowania z funkcjami do zapisywania i odczytywania logów.
Scenariusz: Chcesz stworzyć uniwersalny moduł logowania, który może być używany przez inne skrypty. Napisz dwa pliki: plik biblioteki (logger.sh) zawierający funkcje logujące oraz plik główny (test_logger.sh) demonstrujący działanie biblioteki. Biblioteka powinna zawierać trzy funkcje: log_info (informacje), log_warning (ostrzeżenia), log_error (błędy), które zapisują komunikaty do pliku logu z datą, poziomem ważności i wiadomością. Format wpisu logu: [2024-01-15 14:30:45] [INFO] Komunikat informacyjny. Biblioteka powinna też zawierać funkcję do odczytywania logów i funkcję do ich czyszczenia. Główny skrypt ładuje bibliotekę poleceniem source i demonstruje działanie każdej funkcji logującej. Uruchom główny skrypt i sprawdź zawartość pliku logu.
Wskazówki do wykonania:

Zadanie 9: Masowa zmiana nazw plików

Cel: Napisz skrypt do masowej zmiany nazw plików według określonego wzorca.
Scenariusz: Masz katalog z setkami plików o nieokreślonej strukturze nazw (np. IMG_001.jpg, Photo 002.png, DSC1234.jpeg, file 123.txt). Musisz je uporządkować: zmienić wielkość liter na małe, dodać prefix, usunąć spacje z nazw lub zamienić określony wzorzec w nazwie na inny. Napisz skrypt, który przyjmuje cztery argumenty: katalog z plikami, tryb transformacji (lowercase/uppercase/prefix/replace), prefix (opcjonalny) lub tekst do zamiany i tekst na który zamienić (opcjonalny). Skrypt powinien wyświetlać podgląd (dry-run) bez faktycznej zmiany nazw gdy podano opcję --preview, lub faktycznie zmieniać nazwy bez tej opcji. Skrypt powinien też sprawdzać czy plik o nowej nazwie już istnieje i nie nadpisywać istniejących plików. Uruchom skrypt w trybie podglądu i następnie faktycznie zmień nazwy plików.
Wskazówki do wykonania:

Zadanie 10: Automatyczny instalator oprogramowania

Cel: Stwórz skrypt do automatycznej instalacji i konfiguracji wybranych pakietów oprogramowania.
Scenariusz: Dostajesz nowy serwer i musisz skonfigurować na nim środowisko pracy. Napisz skrypt, który zainstaluje i skonfiguruje podstawowe narzędzia. Skrypt powinien zainstalować pakiety: git, curl, wget, mc (Midnight Commander), htop. Skrypt powinien też skonfigurować podstawowe aliasy w pliku ~/.bashrc (np. ll='ls -la', la='ls -a', grep='grep --color=auto'). Dodatkowo skrypt powinien utworzyć alias do szybkiego aktualizowania systemu (alias update='sudo apt-get update && sudo apt-get upgrade -y'). Skrypt powinien sprawdzać czy jest uruchomiony jako root - jeśli nie, wyświetlić komunikat i kontynuować bez instalacji pakietów systemowych (ale z konfiguracją aliasów). Na końcu skrypt wyświetla podsumowanie: które pakiety zostały zainstalowane, które już były zainstalowane i które aliasy zostały dodane. Uruchom skrypt i sprawdź wyniki.
Wskazówki do wykonania:

Przykładowe rozwiązania

Skrypty BASH