SKRYPTY


Ważne komendy (przypomnienie)

Budowa skryptu Bash
#!/bin/bash

#instrukcje do wykonania

exit 0

Uruchomienie: ./nazwa

Uruchomienie w bieżącej powłoce: . nazwa lub source nazwa

Podanie argumentów podczas uruchomienia: ./nazwa argument1 argument2 ... argumentN

Przypisanie wartości zmiennej
Odniesienie się do wartości zmiennej: $zmienna.

Odniesienie się do argumentów
Składnia operacji arytmetycznych: $((wyrażenie)) lub $[wyrażenie]
Można je wykonywać jedynie na liczbach całkowitych

Operacje na zmiennych typu napisowego
Operacje na zmiennych typu całkowitego
Operacje na zmiennych typu tablicowego
Wartość wyjścia standardowego polecenia: $(polecenie) lub `polecenie`

Operatory logiczne
na liczbach całkowitych: na napisach: na plikach:
Instrukcja warunkowa if
if [[ warunek1 ]]
then
 # instrukcje wykonywane, jeżeli warunek1 jest spełniony
elif [[ warunek2 ]]
then
 # instrukcje wykonywane, jeżeli poprzedni warunek nie został spełniony natomiast warunek2 jest spełniony
# ...
else
 # instrukcje wykonywane, jeżeli żadne z wcześniejszych wyrażeń nie został spełniony
fi

Instrukcja warunkowa case
case wyrażenie in
wartość1)
 # instrukcje wykonywane, jeżeli wyrażenie -eq wartość1
 ;;
wartość2)
 # instrukcje wykonywane, jeżeli wyrażenie -eq wartość2
 ;;
# ...
*)
 # instrukcje wykonywane, jeżeli żaden z wcześniejszych warunków nie został spełniony
 ;;
esac

Pętla while - pętla w która jest wykonywana dopóki warunek jest spełniony
while [[ warunek ]]
do
 # instrukcje do wykonania w pętli, jeżeli warunek jest spełniony
done

Pętla until - pętla w która jest wykonywana dopóki warunek nie jest spełniony
until [[ warunek ]]
do
 # instrukcje do wykonania w pętli, jeżeli warunek jest nie spełniony
done

Pętla for (wersja 1) - pętla w której określamy liczbę przebiegów
for (( wyrażenie1; wyrażenie2; wyrażenie3 ))
do
 # instrukcje do wykonania w pętli
done

Pętla for (wersja 2) - pętla wykonywana dla każdej wartości z listy
for zmienna in sekwencja
do
 # instrukcje do wykonania w pętli dla każdego argumentu
done

Pętla select pętla na podstawie, której tworzone jest proste menu, z listy argumentów tworzone jest ponumerowane menu, każdej pozycji odpowiada kolejna liczba od zaczynając 1
select zmienna in sekwencja
do
 # instrukcje do wykonania w pętli dla każdego argumentu
done

Definicja funkcji
function nazwa
{
 # instrukcje do wykonania we funkcji
}

Wywołanie funkcji: nazwa argument1 argument2 ... argumentN

Deklaracja zmiennej lokalnej: local nazwa
Status wyjścia ostatniego polecenia: $?



Zadania


Zadanie 1. Napisz skrypt, który wyświetli sumę trzech liczb całkowitych, które zostały pobrane jako argumenty.

Zadanie 2. Napisz skrypt, który pobierze dwa napisy jako argument oraz wyświetli informacje, który jest dłuższy i który jest wcześniej leksykograficznie.

Zadanie 3. Napisz skrypt, który wyświetli informację odnośnie tego, czy argument jest ścieżką pliku, jeśli tak do jakiego rodzaju jest to plik i jakie prawa dostępu (odczyt, zapis, wykonanie) posiada użytkownik do pliku.

Zadanie 4. Napisz skrypt, który utworzy katalog, nazwany dzisiejszą datą, a następnie przekopiuje do niego wszystkie utworzone dziś pliki, znajdujące się w Twoim katalogu domowym.

Zadanie 5. Napisz skrypt, który wyświetli wszystkie pobrane argumenty w odwrotnej kolejności, np. argumenty 1 2 3, powinny zostać wyświetlone jako 3 2 1. Wykorzystaj tablicę.

Zadanie 6. Napisz skrypt, który będzie zawierał funkcję wyświetlającą odwrócony napis, który zostanie pobrany jako argument. Przykładowo napis kot powinien zostać wyświetlony jako tok.

Zadanie 7. Napisz skrypt, który jako argument pobierze ścieżkę do pliku. Następnie, jeżeli plik ma rozszerzenie *.txt otworzy go w dowolnym edytorze tekstu, jeżeli ma rozszerzenie *.sh uruchomi skrypt, w przeciwnym razie wyświetli odpowiedni komunikat informujący, że plik jest nieznany. Jeżeli żaden argument nie zostanie pobrany, powinien zostać wyświetlony komunikat informujący, że brakuje argumentu.

Zadanie 8. Napisz skrypt, który wyliczy średnią zaokrąglaną do części całkowitej z dowolnej liczby podanych argumentów. Rozwiąż to zadanie bez korzystania z instrukcji sterujących.

Zadanie 9. Napisz skrypt, który wyświetli informacje, odnośnie tego, jaka jest ścieżka do pliku terminala osoby, której login zostanie pobrany jako argument.

Zadanie 10. Napisz skrypt, który w sposób rekurencyjny, wyliczy rozmiary wszystkich plików znajdujących się w folderze, którego ścieżka została podana jako argument, oraz jego podfolderach.
Przejście po podfolderach możesz wykonać rekurencyjnie (np. poprzez ponowne uruchomienie skryptu, albo wywołanie tej samej funkcji we funkcji).

Zadanie 11. Utwórz dwa skrypty oraz potok nazwany (FIFO).
Pierwszy skrypt powinien odpowiadać za rolę serwera, który nadsłuchuje utworzony plik FIFO i po słowa wykonuje obliczenia i wysyła do pliku FIFO klienta informacje, odnośnie tego ile samogłosek zawiera słowo (powinien działać w nieskończonej pętli).
Drugi skrypt powinien pełnić rolę klienta, który pobiera napis od użytkownika, tworzy (swój) plik FIFO oraz wysyła do serwera informacje na temat ścieżki swojego pliku FIFO i odczytane słowo. Następnie czeka na odpowiedź serwera i wyświetla komunikat odnośnie tego ile samogłosek zawiera pobrany napis, usunie utworzony plik FIFO i zakończy działanie.

Zadanie 12. Napisz skrypt, który utworzy zmienną wyeksportowaną o nazwie test o wartości pobranej jako argument. Uruchom skrypt w podpowłoce (czyli tak jak zawsze) i bieżącej powłoce (przy drugim sposobie nie umieszczaj exit 0 na końcu skryptu). Sprawdź czy zmienna została utworzona po pierwszym i drugim uruchomieniu.