Użytkowanie komputerów i podstawy systemów operacyjnych - laboratorium 05
Post

Użytkowanie komputerów i podstawy systemów operacyjnych - laboratorium 05


Skrypty Bash — część 2

Na poprzednich zajęciach poznaliśmy podstawy skryptowania w Bashu. Dziś zagłębimy się w bardziej zaawansowane aspekty, takie jak pętle, instrukcje warunkowe case oraz funkcje. Zaprezentujemy także praktyczne przykłady zastosowań.

Pętle while

Pętle while w Bashu działają podobnie jak w języku C. Wykonują blok kodu tak długo, jak warunek jest spełniony.

Składnia:

1
2
3
4
while [ warunek ]
do
    polecenia
done

Przykład:

1
2
3
4
5
6
7
8
9
#!/bin/bash

licznik=1

while [ $licznik -le 5 ]
do
    echo "Przejście pętli numer: $licznik"
    licznik=$(($licznik + 1))
done

Opis:

  • Inicjalizujemy zmienną licznik wartością 1.
  • Pętla wykonuje się, dopóki licznik jest mniejszy lub równy 5.
  • W każdym przejściu wyświetlamy komunikat i zwiększamy licznik o 1.

Wynik działania:

1
2
3
4
5
Przejście pętli numer: 1
Przejście pętli numer: 2
Przejście pętli numer: 3
Przejście pętli numer: 4
Przejście pętli numer: 5

Pętle until

Pętla until jest odwrotnością pętli while. Wykonuje się tak długo, jak warunek nie jest spełniony.

Składnia:

1
2
3
4
until [ warunek ]
do
    polecenia
done

Przykład:

1
2
3
4
5
6
7
8
9
#!/bin/bash

licznik=5

until [ $licznik -gt 10 ]
do
    echo "Licznik wynosi: $licznik"
    licznik=$(($licznik + 1))
done

Opis:

  • Zaczynamy od licznik równego 5.
  • Pętla wykonuje się, dopóki licznik nie będzie większy niż 10.
  • W każdym przejściu wyświetlamy wartość licznik i zwiększamy ją o 1.

Wynik działania:

1
2
3
4
5
6
Licznik wynosi: 5
Licznik wynosi: 6
Licznik wynosi: 7
Licznik wynosi: 8
Licznik wynosi: 9
Licznik wynosi: 10

Pętle for

Pętla for w Bashu może działać na dwa sposoby: iterując po elementach listy lub w stylu podobnym do pętli w języku C.

Iteracja po elementach listy

Składnia:

1
2
3
4
for zmienna in lista
do
    polecenia
done

Przykład:

1
2
3
4
5
6
#!/bin/bash

for plik in $(ls *.txt)
do
    echo "Przetwarzanie pliku: $plik"
done

Opis:

  • Pętla iteruje po wszystkich plikach z rozszerzeniem .txt w bieżącym katalogu.
  • W każdym przejściu wyświetla nazwę pliku.

Wynik działania: (zakładając, że w katalogu są pliki dane1.txt, dane2.txt)

1
2
Przetwarzanie pliku: dane1.txt
Przetwarzanie pliku: dane2.txt

Pętla for w stylu C

Składnia:

1
2
3
4
for (( inicjalizacja; warunek; inkrementacja ))
do
    polecenia
done

Przykład:

1
2
3
4
5
6
#!/bin/bash

for (( i=1; i<=5; i++ ))
do
    echo "Iteracja nr: $i"
done

Opis:

  • Inicjalizujemy zmienną i wartością 1.
  • Pętla wykonuje się, dopóki i jest mniejsze lub równe 5.
  • W każdym przejściu wyświetlamy numer iteracji i zwiększamy i o 1.

Wynik działania:

1
2
3
4
5
Iteracja nr: 1
Iteracja nr: 2
Iteracja nr: 3
Iteracja nr: 4
Iteracja nr: 5

Praktyczne zastosowanie pętli for

Często pętle for są używane w połączeniu z poleceniem find do przetwarzania plików w katalogach podrzędnych.

Przykład:

1
2
3
4
5
6
#!/bin/bash

for plik in $(find . -type f -name "*.log")
do
    echo "Znaleziono plik log: $plik"
done

Opis:

  • Używamy find do wyszukania wszystkich plików z rozszerzeniem .log.
  • Pętla for iteruje po znalezionych plikach i wyświetla ich nazwy.

Instrukcja case

Instrukcja case w Bashu jest odpowiednikiem instrukcji switch z języka C. Pozwala na wykonanie różnych bloków kodu w zależności od wartości zmiennej.

Składnia:

1
2
3
4
5
6
7
8
9
10
11
case $zmienna in
    wzorzec1)
        polecenia
        ;;
    wzorzec2|wzorzec3)
        polecenia
        ;;
    *)
        polecenia domyślne
        ;;
esac

Przykład:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/bash

echo "Podaj ocenę (1-5):"
read ocena

case $ocena in
    5)
        echo "Świetnie! Ocena celująca."
        ;;
    4)
        echo "Bardzo dobrze!"
        ;;
    3)
        echo "Dobrze."
        ;;
    2)
        echo "Dostatecznie."
        ;;
    1)
        echo "Niestety, ocena niedostateczna."
        ;;
    *)
        echo "Nieznana ocena."
        ;;
esac

Opis:

  • Skrypt prosi użytkownika o podanie oceny.
  • W zależności od podanej wartości, wyświetla odpowiedni komunikat.
  • Wzorzec * obsługuje wszystkie inne przypadki (wartości nieznane).

Funkcje

Funkcje w Bashu pozwalają na zorganizowanie kodu w moduły, które można wielokrotnie wywoływać.

Definicja funkcji:

1
2
3
nazwa_funkcji() {
    polecenia
}

Wywołanie funkcji:

1
nazwa_funkcji

Przekazywanie argumentów do funkcji

Argumenty są przekazywane do funkcji tak samo jak do skryptu, za pomocą $1, $2, itp.

Przykład:

1
2
3
4
5
6
7
8
#!/bin/bash

powitaj() {
    echo "Witaj, $1!"
}

powitaj "Adam"
powitaj "Ewa"

Opis:

  • Definiujemy funkcję powitaj, która przyjmuje jeden argument.
  • Funkcja wyświetla komunikat powitalny z podanym imieniem.
  • Wywołujemy funkcję dwukrotnie z różnymi argumentami.

Wynik działania:

1
2
Witaj, Adam!
Witaj, Ewa!

Zwracanie wartości z funkcji

Funkcje w Bashu mogą zwracać wartości za pomocą komendy return lub przez echo i wykorzystanie wywołania substytucji poleceń.

Przykład z echo:

1
2
3
4
5
6
7
8
9
#!/bin/bash

suma() {
    wynik=$(($1 + $2))
    echo $wynik
}

result=$(suma 5 10)
echo "Wynik dodawania: $result"

Opis:

  • Funkcja suma dodaje dwa argumenty i wyświetla wynik.
  • Wykorzystujemy substytucję poleceń $( ) do przypisania wyniku do zmiennej result.
  • Wyświetlamy wynik.

Wynik działania:

1
Wynik dodawania: 15

Zadania

  1. Sumowanie argumentów:

    Napisz skrypt, który sprawdzi, czy przekazano do niego przynajmniej 5 argumentów numerycznych. Jeśli tak, to zsumuje je wszystkie i wyświetli wynik na terminalu. W przeciwnym razie wyświetli komunikat o braku wystarczającej liczby argumentów.

  2. Kopiowanie plików:

    Napisz skrypt, który kopiuje do katalogu Documents/copied pliki podane jako argumenty. Jeśli podany zostanie tylko jeden argument, skrypt powinien skopiować wszystkie pliki o podanym rozszerzeniu z katalogów podrzędnych do Documents/copied.

  3. Tworzenie bazy danych:

    Napisz skrypt, który dodaje do pliku baza.txt wartości podane jako argumenty lub wprowadzone przez użytkownika przy użyciu polecenia read. Plik baza.txt powinien zawierać 4 kolumny: Imię, Nazwisko, Płeć, Wiek.

  4. Operacje na plikach tekstowych:

    Napisz skrypt, który wyszukuje wszystkie pliki z rozszerzeniem .txt w bieżącym katalogu i jego podkatalogach, a następnie łączy ich zawartość w jeden plik polaczone.txt. Wykorzystaj pętlę for oraz polecenie find.

  5. Kalkulator z menu:

    Napisz skrypt, który wyświetla menu z opcjami: dodawanie, odejmowanie, mnożenie, dzielenie. Użytkownik wybiera operację, podaje dwie liczby, a skrypt wykonuje wybraną operację i wyświetla wynik. Wykorzystaj instrukcję case do obsługi wyboru użytkownika.