LABORATORIUM 7


POLECENIA STERUJĄCE W SKRYPTACH

Bash jest pełnowartościowym skryptowym językiem programowania - oznacza to, że umożliwia nie tylko tworzenie skryptów o prostej, liniowej strukturze (to jest takich, w których polecenia wykonywane są po kolei, od pierwszego do ostatniego), ale również dysponuje instrukcjami sterującymi (złożonymi), które mogą wpływać na kolejność wykonywania pozostałych instrukcji. Bash udostępnia instrukcję warunkową (if), instrukcję wyboru (case), instrukcje iteracji (pętli) nieograniczonej (while i until) oraz dwie postacie instrukcji iteracji ograniczonej (for), jak również kilka innych, specyficznych dla bash'a instrukcji złożonych. Instrukcje sterujące na ogół są stosowane w skryptach, ale mogą również być używane bezpośrednio w linii poleceń.
Starsza wersja "for" przechodzi po obiektach, np. plikach o danym rozszerzeniu:
for i in *.rozszerzenie;
do
    echo "$i";
done
Nowsza ma postać podobną do klasycznej pętli w C, np.:
for (( i=1; $i <= 5; i++ ));
do
    echo $i;
done
W Bash'u możemy korzystać także z tablic, które deklarować możemy w następujący sposób:
table=(1 2 3 4)
table=$(seq 1 4)
Wypiswyanie ilości eklementów oraz wszystkich elementów:
echo "${#table[*]}"
echo "${table[*]}"
Po tablicy można iterować w następujący sposób:
numbers=$(seq 0 10);
for i in "${numbers[*]}";
do
    echo "$i";
done
Natomiast usuwanie elemntów odbywa się za pomocą polecenia unset, np.:
unset numbers[0];
ZADANIA

UWAGA: w miarę możliwości proszę robić zadania na 2 sposoby: z instrukcjami sterującymi przeszukującymi pliki, katalogi, np: for f in *.rozszerzenie ... oraz za pomocą polecenia find. Oczywiście można je także łączyć ze sobą.

Zad. 1
Przeczytać opisy poleceń złożonych (sterujących) bash'a. Wypróbować możliwość podawania ich bezpośrednio w linii poleceń, np.
 declare -i a b
 a= ...... #jakaś liczba
 b= ...... #jakaś inna liczba
 if [ $a -gt $b ]; then echo "Wieksza: $a"; else echo "Wieksza: $b";fi
Przeprowadzić analogiczną próbę naciskając zamiast podawania kolejnych średników, zaobserwować inny znak zgłoszenia (secondary prompt).

Zad. 2
Utworzyć skrypt o dwóch argumentach wywołania (pierwszym liczbowym, a drugim napisowym), który $1 razy wyświetli napis $2 (wskazówka: użyć nowszej formy polecenia "for").

Zad. 3
Utworzyć skrypt, który pobierze od użytkownika 5 liczb, wstawi je to tablicy, pobierze kolejną liczbe "mnożnik", a następnie pomnoży każdą komórkę tablicy przez "mnożnik" i wyświetli w konsoli uaktualnioną tablicę.

Zad. 4
Utworzyć skrypt, który wyświetli nazwę i rozmiar tego pliku w bieżącym katalogu, który ma największy rozmiar.

Zad. 5
Utworzyć skrypt o dwóch argumentach, który sprawdza, czy w katalogach o pełnych nazwach ścieżkowych $1 i $2 powtarza się jakaś nazwa pliku (i na końcu wyświetla odpowiedni komunikat).

Zad. 6
Utworzyć skrypt o jednym argumencie, który oblicza sumę rozmiarów wszystkich plików w drzewie katalogów o korzeniu $1 (wskazówka: użyć wywołań rekurencyjnych dla wszystkich podkatalogów danego katalogu).