Narzędzia systemowe i skrypty Uniksa

Zad.1. (2 punkty - na zajęciach)
Wykorzystaj date do wyświetlania różnych komunikatów powitalnych w zależności czy aktualnie jest dzień roboczy czy świąteczny (dla uproszczenia: dzień tygodnia czy weekend).

Uwaga: Porównywanie napisów wyświetlanych przez program date (i inne programy) jest zależne od języka i lokalizacji.

Sprawdź możliwość ustawienia zmiennych lokalizacji LC_* (np. LC_ALL=C) i ich wpływ na postać komunikatu. Która/które z nich sterują postacią wyświetlanej daty? Ustawiając tę zmienną w skrypcie na wartość C (lub POSIX), wymuszamy lokalizację kanoniczną, co ułatwia sprawdzanie wartości daty, i uniezależnia działanie skryptu od lokalizacji (będzie on poprawnie sprawdzał warunek również np. w Japonii).

Zad.2. (2 punkty - na zajęciach)
Napisz skrypt o nazwie policz.sh, który policzy i wyświetli liczbę plików w katalogu bieżącym. WSKAZÓWKA: opcja -1 do programu ls powoduje wyświetlanie po jednym pliku w linijce, a program wc można wywołać z opcją -l powodującą policzenie tylko liczby linijek.

Następnie zmodyfikuj ten skrypt aby rozpoznawał on argument opcjonalny -a, podobnie jak program ls. To znaczy, z argumentem -a skrypt obliczy liczbę wszystkich plików w katalogu bieżącym, włącznie z plikami ,,ukrytymi'' (o nazwach zaczynających się od kropki), a bez -a pominie te pliki.

Zad.3. (2 punkty - na zajęciach, lub 1 punkt - w domu)
Wykorzystując instrukcję pętli for napisz skrypt, który dla dowolnej liczby argumentów pozycyjnych wyświetli informacje o każdym z nich traktowanym jako nazwa pliku. Jeśli dany argument określa istniejący plik, to powinien się pojawić komunikat "plik istnieje", i analogicznie, jeśli nie istnieje plik o podanej nazwie. W przypadku gdyby podany argument określał katalog, należy wyświetlić "katalog", ale jeśli jest to katalog pusty (nie zawiera żadnych plików, ani podkatalogów, z wyjątkiem . i ..), to należy wyświetlić "katalog pusty".

Uwaga: sprawdź czy Twój skrypt będzie działał poprawnie również dla plików o nazwach zawierających spacje albo inne znaki specjalne. Utwórz taki plik na przykład poleceniem touch "jeden dwa trzy"

Zad.4. (3 punkty - na zajęciach, lub 2 punkty - w domu)
Ćwiczenia z programem find: napisz skrypt znajdujący programem find wszystkie pliki z podanego katalogu, o podanym rozszerzeniu (końcówce w nazwie), które były modyfikowane w ciągu ostatnich N dni i tworzący z nich archiwum tar o zadanej nazwie. Mamy tu cztery parametry: nazwa katalogu, rozszerzenie nazwy plików, liczbę N i nazwę archiwum. Parametry będą przekazane do skryptu jako argumenty pozycyjne, to znaczy skrypt zawsze będzie wywołany z czterema parametrami w podanej kolejności.

Uwaga: spróbuj tak napisać skrypt, aby uwzględniał tylko pliki, do których użytkownik go wywołujący ma dostęp przynajmniej typu read, to znaczy by nie generował błędów dla plików niedostępnych, tylko pomijał te pliki.

Zad.5. (3 punkty - na zajęciach, lub 2 punkty - w domu)
W tym ćwiczeniu chcemy wykorzystać instrukcję pętli logicznej while sterowanej strumieniem danych. To znaczy, chcemy czytać strumień danych wiersz po wierszu, wykonując jakieś operacje, i zatrzymać wykonywanie tego skryptu po napotkaniu końca strumienia danych. Ten schemat można zapisać tak:

while read x y z
do
 ... # dowolne operacje na danych wczytanych z kolejnych wierszy pliku do zmiennych x y z
done < plik

Jako przykład zastosowania takiego schematu napisz skrypt do wysyłania emaila o ustalonej treści do wszystkich adresów zapisanych w kolejnych wierszach w pliku.

Znajdź program klienta poczty elektronicznej pozwalającego wysyłać maile z wiersza poleceń w trybie nieinterakcyjnym (np. mail/mailx, pine/alpine, mutt, itp). Przeczytaj jego opis i opracuj wyrażenie shella pozwalającego automatycznie wysłać maila o jakiejś ustalonej treści. Następnie użyj tego wyrażenia w pętli do wysyłania maila automatycznie do kolejnych adresów.

Uwaga: emaile muszą być rozesłane indywidualnie do wszystkich adresatów. Niedopuszczalne jest wysłanie jednego emaila do listy zawierającej wszystkie adresy.