Skrypty bash – pętle i case

#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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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:
  6. 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 .txt.uppercase, który zawiera zawartość pliku tekstowego po zamianie małych liter na wielkie.

    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.

Trudniejsze zadania

  1. 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 zawiera zakazane słowa” W przeciwnym przypadku “Plik jest w porządku”

    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ść"
  2. 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:

    • Bieżącą datę i godzinę
    • Liczbę zwykłych plików w katalogu
    • Sumaryczny rozmiar zwykłych plików w katalogu

    Podpowiedź: find potrafi filtrować pliki po typie.