Poniższe ćwiczenia proszę uruchomić i przetestować przynajmniej na
Solarisie i Linuksie, i w raporcie proszę podać gdzie zostały
przetestowane.
W przypadku operacji na nazwach plików warto sprawdzić działanie na
plikach o podejrzanych nazwach, np. takich zawierających spacje.
-
(a) Napisz skrypt, który dla pliku zadanego jako argument wywołania
sprawdzi, czy istnieje jego stara wersja, czyli plik o tej samej
nazwie, z dodanym znakiem tyldy (~), i jeśli tak, to zmieni
końcówkę jego nazwy na .old (np. plik.txt~ na plik.old).
Użyj basename do uzyskiwania podstawowej nazwy pliku i test do
sprawdzania, czy istnieje dany plik. Załóż, że końcówka nazwy pliku
(rozszerzenie) to .txt wtedy dla plików z innymi końcówkami operacja
zamieni tylko tyldę na .old.
(b) Zmodyfikuj napisany skrypt tak, aby wykonywał tę samą operację w
pętli, dla wszystkich argumentów wywołania. Dodatkowo skrypt powinien
wyświetlić komunikat, gdy nie istnieje plik o zadanej nazwie
(podstawowy, bez ~), natomiast pomijać ewentualnie zadane pliki,
których nazwa kończy się na ~ (wskazówka: użyj expr do porównania).
Napisz pętlę w dwóch wariantach: z instrukcją for oraz z instrukcją
while i shift. Która wersja wydaje Ci się lepsza?
-
(a) Napisz skrypt wybierz, który w pętli, dla wszystkich argumentów
wywołania, odpyta użytkownika o każdy argument, i dla argumentów
zaakceptowanych przez użytkownika (odpowiedź T lub Y), wyświetli dany
argument na wyjściu, natomiast dla argumentów odrzuconych przez
użytkownika, nic nie wyśle na wyjście.
Odpowiedzi użytkownika można czytać poleceniami read lub line. Uważaj
by skrypt komunikował się z użytkownikiem poza strumieniami
stdin/stdout, aby umożliwić działanie skryptu w potoku poleceń, jak w
przykładzie zawartym w PDF-ie z wykładu. Aby to osiągnąć polecenia
echo, read, i line muszą mieć skierowania z/do /dev/tty.
Alternatywnie można przekierować stdin/stdout na stderr.
(b) Zmodyfikuj skrypt wybierz, aby zamiast z listy argumentów pobierał
listę elementów z wejścia (po jednym elemencie z wiersza). Pętla
powinna być sterowana wynikiem działania plecenia read, które zgłasza
błąd po napotkaniu EOF.
Sprawdź działanie skryptu na liście plików generowanej poleceniem ls -1.
Ostateczna wersja skryptu powinna działać na liście argumentów o ile
została podana ($# > 1), a w przeciwnym wypadku na standardowym wejściu.
-
Napisz skrypt, który zamieni i wyświetli na wyjściu kolejno wszystkie
swoje argumenty wywołania, traktowane jako nazwy plików, po zamianie
ich na absolutne ścieżki do plików. Argumentami mogą być dowolne
nazwy lub ścieżki do plików, względne lub bezwzględne, mogą też
zawierać znaki specjalne *,?,[].
Rozważ najprostsze możliwe rozwiązanie, po czym sprawdź, czy nie
rozwija ono listy argumentów, tzn. czy wynikowa lista plików nie jest
dłuższa w przypadku obecności gwiazdki w argumencie.
Spróbuj obmyśleć rozwiązanie lepsze, czyli takie, które nie rozwija
nazw plików.