#Skrypty bash – pętle i case
Dostępne są trzy pętle:
Przykłady użycia pętli znajdują się w skryptach: Tworzenie plików zawierających dzisiejszą datę 1, Tworzenie plików zawierających dzisiejszą datę 2.
Proszę zwrócić uwagę na działania słowa kluczowego shift
, które usuwa pierwszy argument wywołania.
Konstrukcja case
jest rodzajem konstrukcji warunkowej, która pozwala wykonać określone działania w zależności od tego jaki wzorzec powłoki (składnia wzorców taka sama jak przy nazwach plików) spełnia dane słowo. Przykład użycia instrukcji case znajduje się w skryptcie: Proste menu do nawigacji po katalogach
##Zadania
Wszystkie skrypty powinny sprawdzać poprawność argumentów, jeśli argumentami mają być istniejące pliki lub katalogi.
Zgadywanie liczb II
Rozszerzyć poprzednią grę w zgadywanie liczb o możliwość wielu prób odgadnięcia:
Skrypt wybiera losową liczbę. Następnie skrypt prosi użytkownika o podanie liczby i odczytuje rozwiązanie. Gdy liczba jest większa od szukanej, wypisywana jest informacja o tym fakcie i pytanie jest ponawiane, gdy liczba jest mniejsza – podobnie wypisana jest informacja i pytanie zostaje powtórzone. Gdy użytkownik odgadł liczbę program wypisuje komunikat z gratulacjami i kończy działanie.
Maksimum
Napisać skrypt, który przyjmuje dowolną liczbę parametrów. Parametry powinny być liczbami całkowitymi (nie trzeba tego sprawdzać). Skrypt wypisuje maksimum z podanych liczb.
Nagłówki plików
Napisać skrypt, który przyjmuje n+1 argumentów. Pierwszy argument to plik wyjściowy, pozostałe – pliki wejściowe. Dla każdego pliku wejściowego w pliku wyjściowym zostają umieszczone następujących 5 linii:
W momencie wywołania skrypt ma sprawdzić, czy plik wyjściowy NIE istnieje, a wszystkie pliki wejściowe istnieją.
Podpowiedź: datę modyfikacji można uzyskać odpowiednim wywołaniem programu stat
.
Linia wywołania procesów
Napisać skrypt, który przyjmuje parametry – dwie liczby całkowite a i b, a<b. Skrypt wypisuje linię poleceń (cmdline) wszystkich procesów o PID z przedziału [a,b] (domkniętego)
Aby wygenerować sekwencję liczb (np. do użycia z pętlą for) można użyć programu seq
Informacje o procesach można znaleźć w systemie plików proc w katalogu /proc.
Linie rozpoczynające się daną literą
Napisać skrypt, który przyjmuje n+1+m parametrów. Pierwsze n parametrów do pojedyncze litery (małe lub wielkie, należy rozróżniać wielkość liter), następnie następuje parametr o wartości --
(podwójny minus), następne m
parametrów to nazwy plików.
Skrypt wypisuje wszystkie linie zaczynające się na dowolną z podanych liter ze wszystkich plików.
Uwaga: można użyć pętli tylko do odczytania argumentów z literami. Znalezienie linii musi się odbyć jednym wywołaniem grep, nie wolno wywoływać grepa w pętli.
Skrypt musi weryfikować poprawność argumentów linii poleceń i poprawnie obsługiwać pliki ze spacjami w nazwie.
Podpowiedzi:grep
przyjmuje dowolnie dużo plików jako argumenty wywołania,shift
ma wpływ na zawartość $*
i $@
,$*
i $@
mają trochę inne działanie i tylko jeden jest tu poprawny.Transformacja plików
Skrypt przyjmuje dowolną liczbę ścieżek do plików jako argumenty. Dla każdego pliku z rozszerzeniem .txt wykonywana jest następująca akcja:
Tworzony jest plik z rozszerzeniem
Uwaga 1: do zamiany jednego zakresu bajtów na inny można użyć programu tr. W szczególności wywołanie tr a-z A-Z zamienia litery z zakresu a-z na listery z zakresu A-Z. Domyślnie wejściem jest stdin a wyjściem stdout.
Uwaga 2: O ile ten skrypt nie wykonuje pożytecznej pracy, można go wykorzystać jako bazę to tworzenia np. miniatur plików graficznych, czy konwersji plików między formatami.
Zakazane słowa a.k.a. cenzura
Skrypt przyjmuje n+1 agrumentów. Pierwszy argument to ścieżka to pliku zawierającego listę zakazanych słów (można założyć, że słowa są oddzielone spacjami). Kolejne n argumentów to ścieżki do plików do sprawdzenia.
Dla każdego pliku zostaje wykonane sprawdzenie, czy zawiera on jakiekolwiek z zakazanych słów, jeśli tak, wypisywany jest komunikat “Plik
Przed zakończeniem (ale po wypisaniu komunikatów dla każdego z plików) skrypt wypisuje nazwy wszystkich plików, które były w porządku.
Podpowiedź 1: Użyć zmiennych pomocniczych
Podpowiedź 2: Można użyć zagnieżdżonych pętli lub zbudować wyrażenie regularne sprawdzające wszystkie słowa na raz (operator |)
Podpowiedź 3: grep posiada opcję -v
Podpowiedź 4: Aby dopisać coś do zmiennej można użyć konstrukcji
VAR="$VAR nowa treść"
Liczba i rozmiar plików w katalogach
Skrypt przyjmuje dowolną liczbę katalogów jako argumenty. W każdym katalogu tworzony jest plik status.txt. Plik zawiera trzy linie:
Podpowiedź: find potrafi filtrować pliki po typie.