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:
- Na początku skryptu zadeklaruj pustą tablicę do przechowywania ocen, np.
OCENY=()
- Użyj pętli
while true do tworzenia nieskończonej pętli wczytywania ocen
- Wewnątrz pętli użyj polecenia
read -p "Podaj ocenę (lub wpisz 'koniec'): " OCENA do wczytywania oceny od użytkownika
- Na początku pętli sprawdź czy użytkownik wpisał "koniec" za pomocą instrukcji
if [[ "$OCENA" == "koniec" ]] i jeśli tak, przerwij pętlę poleceniem break
- Przed dodaniem oceny do tablicy sprawdź czy wpisana wartość jest liczbą od 2 do 6 za pomocą wyrażenia
[[ "$OCENA" =~ ^[2-6]$ ]]
- Dodaj ocenę do tablicy za pomocą
OCENY+=("$OCENA")
- Po zakończeniu pętli oblicz sumę wszystkich ocen używając pętli
for ocena in "${OCENY[@]}" i akumulatora suma=$((suma + ocena))
- Oblicz średnią dzieląc sumę przez liczbę elementów tablicy, używając
bc do obliczeń zmiennoprzecinkowych: bc <<< "scale=2; $suma / ${#OCENY[@]}"
- Zastosuj instrukcję
if z porównaniem używając bc: if echo "$średnia >= 3.0" | bc -l -eq 1; then
- Wyświetl komunikat wynikowy w zależności od tego czy średnia jest większa czy mniejsza niż 3.0
- Na końcu wyświetl informację o liczbie wprowadzonych ocen i ich wartościach
- Przetestuj skrypt z różnymi danymi wejściowymi, a także z przypadkami, gdy użytkownik wpisze nieprawidłowe dane
- Dodaj obsługę błędów - gdy użytkownik wpisze coś innego niż liczba lub "koniec", wyświetl komunikat ostrzegawczy
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:
- Zdefiniuj listę serwerów w tablicy, np.
SERWERY=("web01" "db01" "mail01" "backup01")
- Zdefiniuj zmienną z ścieżką do pliku raportu, np.
RAPORT="/tmp/raport_serwery.txt"
- Na początku pliku raportu zapisz nagłówek z datą używając
echo "=== Raport z $(date) ===" > "$RAPORT"
- Użyj pętli
for serwer in "${SERWERY[@]}" do iteracji po serwerach
- Wewnątrz pętli użyj polecenia
ping -c 1 -W 2 "$serwer" > /dev/null 2>&1 do sprawdzenia dostępności
- Sprawdź kod wyjścia polecenia ping za pomocą
$? i zapisz wynik do zmiennej: if ping...; then status="OK"; else status="NIE ODPOWIADA"; fi
- Jeśli serwer odpowiedział, wyodrębnij czas odpowiedzi używając
sed lub awk na wyniku ping
- Zapisz wynik dla każdego serwera do pliku używając
echo "Serwer $serwer: $status (czas: $czas ms)" >> "$RAPORT"
- Zliczaj serwery, które odpowiedziały i te, które nie odpowiedziały za pomocą osobnych liczników
- Na końcu pętli dopisz do pliku raportu podsumowanie z liczbą serwerów online i offline
- Użyj podstawienia polecenia
$(date "+%Y-%m-%d %H:%M:%S") do pobrania sformatowanej daty
- Opcjonalnie: wyświetl komunikat na ekranie po zakończeniu sprawdzania wszystkich serwerów
- Po uruchomieniu skryptu sprawdź zawartość pliku raportu poleceniem
cat "$RAPORT"
- Przetestuj skrypt używając zarówno istniejących jak i nieistniejących nazw serwerów
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:
- Na początku sprawdź czy plik logów istnieje, a jeśli nie - utwórz przykładowy plik z danymi testowymi
- Zadeklaruj tablicę asocjacyjną przed pętlą:
declare -A ZLICZANIE_BLEDOW
- Przykładowy plik logów powinien zawierać linie w formacie:
[2024-01-15 14:23:45] ERROR DatabaseConnection: Failed to connect to database
- Użyj pętli
while IFS= read -r linia do czytania pliku linia po linii
- Wewnątrz pętli sprawdź czy linia zawiera słowo "ERROR" używając
if [[ "$linia" == *ERROR* ]]
- Jeśli linia zawiera ERROR, użyj
awk lub sed do wyciągnięcia typu błędu (tekst po słowie ERROR i przed dwukropkiem)
- Zwiększaj licznik dla każdego typu błędu:
ZLICZANIE_BLEDOW["$typ_błędu"]=$((ZLICZANIE_BLEDOW["$typ_błędu"] + 1))
- Zapisz datę pierwszego i ostatniego błędu dla każdego typu osobno
- Po zakończeniu czytania pliku wyświetl podsumowanie: dla każdego typu błędu ile razy wystąpił
- Znajdź typ błędu który wystąpił najczęściej iterując po tablicy asocjacyjnej
- Użyj polecenia
sort do posortowania wyników od najczęstszego do najrzadszego
- Na końcu wyświetl komunikat informujący ile łącznie błędów znaleziono w logach
- Przetestuj skrypt na własnym przykładowym pliku logów z różnymi typami błędów
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:
- Użyj argumentów wywołania (
$1, $2, $3) do określenia trybu i parametrów
- Na początku sprawdź liczbę argumentów:
if [[ $# -lt 2 ]] i wyświetl sposób użycia
- Pierwszy argument to tryb: "backup" lub "restore"
- W trybie backup: drugi argument to ścieżka do pliku/katalogu źródłowego, trzeci to katalog docelowy
- W trybie restore: drugi argument to ścieżka do archiwum, trzeci to katalog docelowy
- Zastosuj walidację czy plik/katalog źródłowy istnieje:
if [[ -e "$ZRODLO" ]]
- Zdefiniuj stałą (katalog na backup) za pomocą
readonly KATALOG_BACKUP="/tmp/backup"
- Generuj nazwę pliku z datą używając
$(date "+%Y-%m-%d_%H-%M-%S")
- Użyj polecenia
tar -czf "$PLIK_BACKUP" -C "$(dirname "$ZRODLO")" "$(basename "$ZRODLO")" do utworzenia archiwum
- W trybie restore użyj polecenia
tar -xzf "$ARCHIWUM" -C "$KATALOG_DOCELOWY" do rozpakowania
- Sprawdzaj kody wyjścia poleceń za pomocą
$? po każdej operacji tar
- Jeśli operacja się nie powiedzie, wyświetl komunikat błędu i zakończ z kodem wyjścia 1
- Na końcu wyświetl ścieżkę do utworzonego archiwum lub komunikat sukcesu
- Przetestuj działanie w obu trybach - utwórz backup i następnie przywróć pliki
- Opcjonalnie: lista wszystkich archiwów w katalogu backup za pomocą
ls -la
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:
- Przyjmij długość hasła jako argument (
$1), a jeśli nie podano, użyj domyślnej wartości 16
- Sprawdź czy podany argument jest liczbą i czy jest większy od 4:
if [[ ! "$1" =~ ^[0-9]+$ ]] || [[ $1 -lt 4 ]]
- Zdefiniuj zmienne z zestawami znaków:
WIELKIE="A-Z", MALE="a-z", CYF="0-9", SPEC="!@#$%^&*()_+-=[]{}|;:,.<>?"
- Użyj pętli do generowania hasła spełniającego wszystkie wymagania:
while true; do ... done
- Wewnątrz pętli użyj polecenia
tr -dc "$WIELKE$MALE$CYF$SPEC" < /dev/urandom do losowego wyboru znaków
- Ogranicz długość wyniku używając
head -c $DLUGOSC
- Po wygenerowaniu hasła sprawdź czy zawiera wszystkie wymagane typy znaków
- Sprawdź czy jest wielka litera:
if echo "$HASLO" | grep -q '[A-Z]'; then
- Sprawdź czy jest mała litera:
if echo "$HASLO" | grep -q '[a-z]'; then
- Sprawdź czy jest cyfra:
if echo "$HASLO" | grep -q '[0-9]'; then
- Sprawdź czy jest znak specjalny:
if echo "$HASLO" | grep -q '[!@#$%^&*()_+-=[]{}|;:,.<>?]'; then
- Jeśli wszystkie warunki spełnione, wyjdź z pętli za pomocą
break
- Wyświetl wygenerowane hasło i jego długość:
echo "Wygenerowane hasło: $HASLO (długość: ${#HASLO})"
- Opcjonalnie: dodaj opcję wyświetlania siły hasła (słabe/średnie/mocne)
- Przetestuj skrypt z różnymi długościami: 8, 12, 16, 24, 32 znaki
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:
- Użyj argumentów wywołania do określenia akcji:
list, find, kill
- Dla akcji list użyj polecenia
ps -u "$USER" do wyświetlenia procesów
- Filtruj wynik
ps aux aby pokazać tylko procesy aktualnego użytkownika: ps -u "$USER"
- Dla akcji find: drugi argument to nazwa procesu do wyszukania
- Użyj polecenia
pgrep -f "$NAZWA" do wyszukiwania procesów po nazwie
- Alternatywnie użyj
ps aux | grep "$NAZWA" | grep -v grep
- Dla akcji kill: drugi argument to PID procesu, opcjonalnie trzeci to typ sygnału
- Sprawdź czy skrypt jest uruchomiony jako root - porównaj
$EUID z wartością 0
- Jeśli nie root, nie pozwalaj na zabijanie procesów innych użytkowników
- Zabezpiecz przed zabiciem krytycznych procesów: sprawdź czy PID to 1, 2, 3, lub niski numer
- Użyj polecenia
kill -TERM $PID dla SIGTERM (domyślnie)
- Użyj polecenia
kill -9 $PID dla SIGKILL (gdy podano opcję -9)
- Po zabiciu procesu sprawdź czy faktycznie został zakończony:
ps -p $PID
- Wyświetl komunikaty informujące o postępie i wynikach operacji
- Przetestuj każdą akcję osobno: list, find (np. "bash"), i kill (utwórz testowy proces)
- Opcjonalnie: dodaj akcję info do wyświetlania szczegółów procesu
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:
- Użyj instrukcji
case do wyboru typu konwersji na podstawie pierwszego argumentu
- Przyjmij argumenty w formacie:
$1 (typ), $2 (wartość), $3 (z), $4 (do)
- Sprawdź liczbę argumentów:
if [[ $# -ne 4 ]] i wyświetl sposób użycia
- Sprawdź czy wartość jest liczbą:
if [[ ! "$2" =~ ^-?[0-9]+.?[0-9]*$ ]]
- Przy konwersji długości użyj wzorów: 1 metr = 3.28084 stóp, 1 cal = 2.54 cm
- Przy konwersji temperatury użyj wzorów: F = C * 9/5 + 32, K = C + 273.15
- Przy konwersji wagi użyj wzorów: 1 kg = 2.20462 funta, 1 g = 0.035274 uncji
- Użyj
bc do obliczeń zmiennoprzecinkowych z precyzją: scale=4
- Zaokrąglij wynik do 2 miejsc po przecinku używając
printf "%.2f"
- Pojedyncze przypadki (np. ten sam cel i źródło) obsłuż oddzielnie wyświetlając wartość bez zmian
- Nieobsługiwane kombinacje jednostek obsłuż wyświetlając komunikat błędu
- Wyświetl wynik w formacie:
WYNNIK: 100 cm = 39.37 cali
- Przetestuj różne konwersje: 100 m na stopy, 0°C na F, 1 kg na funty
- Przetestuj też konwersje odwrotne: stopy na metry, F na C, funty na kg
- Dodaj obsługę jednostek imperialnych (mile, jardy) i metrycznych (kilometry)
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:
- Stwórz plik biblioteki (logger.sh) z funkcjami
- W bibliotece zdefiniuj zmienną dla ścieżki pliku logu:
LOG_FILE="/tmp/app.log"
- Zdefiniuj funkcję log_info:
log_info() { echo "[$(date)] [INFO] $1" >> "$LOG_FILE"; }
- Zdefiniuj funkcję log_warning:
log_warning() { echo "[$(date)] [WARNING] $1" >> "$LOG_FILE"; }
- Zdefiniuj funkcję log_error:
log_error() { echo "[$(date)] [ERROR] $1" >> "$LOG_FILE"; }
- Użyj formatu daty:
$(date "+%Y-%m-%d %H:%M:%S")
- Zdefiniuj funkcję do odczytywania logów:
log_read() { cat "$LOG_FILE"; }
- Zdefiniuj funkcję do czyszczenia logów:
log_clear() { > "$LOG_FILE"; }
- W głównym skrypcie użyj
source logger.sh do załadowania funkcji
- Dodaj zmienną do włączania/wyłączania logowania:
DEBUG=true
- W funkcjach sprawdź czy DEBUG jest true przed zapisem
- Wywołaj każdą funkcję logującą z przykładowymi komunikatami
- Dodaj opcję wyboru pliku logu jako argumentu funkcji
- Po uruchomieniu głównego skryptu sprawdź zawartość pliku logu:
cat "$LOG_FILE"
- Przetestuj funkcję log_read do wyświetlania logów z poziomu głównego skryptu
- Opcjonalnie: dodaj kolorowanie komunikatów w zależności od poziomu
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:
- Przyjmij argumenty: katalog, tryb transformacji, opcjonalne argumenty
- Sprawdź liczbę argumentów i wyświetl sposób użycia gdy argumenty nieprawidłowe
- Pierwszy argument to katalog - sprawdź czy istnieje i jest katalogiem
- Drugi argument to tryb transformacji: lowercase, uppercase, prefix, replace
- Obsłuż tryb lowercase: użyj
tr '[:upper:]' '[:lower:]' do zmiany wielkości liter
- Obsłuż tryb uppercase: użyj
tr '[:lower:]' '[:upper:]' do zmiany wielkości liter
- Obsłuż tryb prefix: dodaj podany prefix na początku nazwy pliku
- Obsłuż tryb replace: użyj
sed do zamiany tekstu w nazwie pliku
- Iteruj po plikach w katalogu używając
for plik in "$KATALOG"/*
- Pomiń katalogi używając
if [[ -f "$plik" ]]
- Dla każdego pliku obierz nową nazwę zgodnie z trybem transformacji
- Sprawdź czy plik o nowej nazwie już istnieje:
if [[ -e "$NOWA_NAZWA" ]]
- Jeśli plik istnieje, dodaj sufiks lub pomiń - wyświetl ostrzeżenie
- Jeśli podano opcję --preview jako ostatni argument, tylko wyświetl podgląd zmian
- Bez opcji --preview użyj polecenia
mv "$plik" "$NOWA_NAZWA" do zmiany nazwy
- Użyj
set -u do wykrywania niezainicjowanych zmiennych
- Po zakończeniu wyświetl podsumowanie: ile plików zmieniono, ile pominięto
- Przetestuj z różnymi trybami i opcjami na przykładowych plikach
- Utwórz najpierw testowe pliki w katalogu do testów
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:
- Na początku sprawdź czy skrypt jest uruchomiony jako root:
if [[ "$EUID" -ne 0 ]]
- Jeśli nie root, wyświetl ostrzeżenie ale kontynuuj działanie
- Zdefiniuj listę pakietów do instalacji w tablicy:
PAKIETY=("git" "curl" "wget" "mc" "htop")
- Użyj pętli
for pakiet in "${PAKIETY[@]}" do iteracji po pakietach
- Sprawdź czy pakiet jest już zainstalowany: sprawdź dystrybucję i użyj odpowiedniego polecenia (np.
dpkg -l "$pakiet" | grep ^ii dla Debian/Ubuntu, albo rpm -q "$pakiet" dla RHEL/CentOS)
- Jeśli pakiet jest zainstalowany, pomiń i zwiększ licznik pominiętych
- Jeśli pakiet nie jest zainstalowany i jest root, zainstaluj:
apt-get install -y "$pakiet"
- Po instalacji każdego pakietu sprawdź kod wyjścia i zwiększ licznik zainstalowanych
- Po zakończeniu pętli wyświetl podsumowanie instalacji
- Dla konfiguracji aliasów sprawdź czy plik ~/.bashrc istnieje, a jeśli nie - utwórz go
- Dodaj aliasy na końcu pliku ~/.bashrc używając
echo "alias ll='ls -la'" >> ~/.bashrc
- Dodaj aliasy:
la='ls -a', grep='grep --color=auto', update='sudo apt-get update && sudo apt-get upgrade -y'
- Nie duplikuj aliasów - sprawdź czy alias już istnieje przed dodaniem
- Użyj polecenia
source ~/.bashrc do przeładowania aliasów
- Na końcu wyświetl podsumowanie: które pakiety zainstalowano, które pominięto, które aliasy dodano
- Wyświetl komunikat zachęcający do zalogowania się ponownie lub źródłowego załadowania ~/.bashrc
- Przetestuj na maszynie wirtualnej lub w kontenerze Docker
- Sprawdź zainstalowane pakiety poleceniem
dpkg -l | grep -E 'git|curl|wget|mc|htop'
- Sprawdź aliasy poleceniem
alias