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 zmiennejresult
. - Wyświetlamy wynik.
Wynik działania:
1
Wynik dodawania: 15
Zadania
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.
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 doDocuments/copied
.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 poleceniaread
. Plikbaza.txt
powinien zawierać 4 kolumny: Imię, Nazwisko, Płeć, Wiek.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 plikpolaczone.txt
. Wykorzystaj pętlęfor
oraz poleceniefind
.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.