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.