LABORATORIUM 6


SKRYPTY W JĘZYKU INTERPRETERA POLECEŃ

Język poleceń bash'a może być uważany za skryptowy język programowania. Oznacza to, że polecenia mogą nie tylko być używane w linii poleceń, ale również mogą być umieszczane (w większej liczbie) w plikach (nazywanych skryptami), które następnie są uruchamiane jako całość. W związku z tym skrypty muszą mieć nadane zarówno prawo do odczytu (r), jak i do wykonywania (x) dla tego, kto je będzie uruchamiał.

Języki skryptowe (interpretowane) różnią się od języków kompilowanych tym, że programy w nich napisane nie podlegają kompilacji (tłumaczeniu w całości i dołączaniu podprogramów bibliotecznych) na język wewnętrzny komputera, tylko pojedyncze instrukcje podlegają tłumaczeniu "na bieżąco" (są interpretowane przez program interpretera poleceń - w tym przypadku przez bash'a). Niektóre języki programowania (na przykład Basic) mogą być używane zarówno jako języki interpretowane, jak i kompilowane. Programy skompilowane są wykonywane dużo szybciej, niż programy interpretowane, ale wprowadzanie w nich zmian wymaga później ponownej kompilacji całości.

W systemach uniksowych zazwyczaj jest dostępnych co najmniej kilka różnych interpreterów, z których jeden (zwykle bash) uważany jest za interpreter domyślny. W przypadku, gdy skrypt przeznaczony jest do wykonywania pod bieżącym interpreterem (tym, z którym aktualnie współpracujemy w oknie tekstowym), nie ma potrzeby umieszczania na jego początku żadnej dodatkowej informacji, natomiast jeśli chcemy wymusić interpretację skryptu przez pewien wybrany interpreter, umieszczamy na jego początku linię sterującą o postaci:

 #!........ (bezwzględna ścieżka dostępu do programu interpretera)

Przykłady:

	#!/bin/bash
	#!/bin/csh
Innym sposobem jest podanie polecenia o postaci:
nazwa_interpretera nazwa_skryptu

Przykład:
	
	sh moj_skrypt
ZADANIA

Zad. 1
Utworzyć plik o dowolnej nazwie i następującej zawartości:
 clear
 echo "To jest pierwszy napis"
 echo "A to jest drugi napis"
 exit 0
Nadać prawo do wykonywania. Uruchomić pisząc ./nazwa . Do wartości zmiennej środowiska PATH dopisać ścieżkę do bieżącego katalogu: PATH=$PATH:. , sprawdzić, że teraz można uruchomić skrypt pisząc nazwa. Wprowadzić do skryptu zmianę:
 echo -n "To jest pierwszy napis"
i ponownie uruchomić skrypt.

Zad. 2
Napisać i uruchomić skrypt wczytujący i wyświetlający łańcuch (napis):
 clear
 echo -n "Napisz cos: "
 read x
 echo "Otrzymalem napis: $x"
 exit 0


Skrypty (podobnie, jak inne programy uruchamiane w trybie tekstowym) mogą w chwili swojego uruchomienia otrzymać pewną liczbę argumentów wywołania podanych w linii poleceń:
 nazwa_programu argument_1 argument_2 ... argument_n
Podawanie argumentów jest najbardziej podstawowym sposobem podawania danych dla programu (zwykle są to dane o charakterze "sterującym", a właściwy strumień danych jest podawany przez wejście standardowe). Programy mogą mieć stałą lub zmienną liczbę argumentów. UWAGA: sama nazwa programu też jest uważana za argument (o numerze 0).

Zad. 3
Napisać i uruchomić skrypt, który: a) otrzymuje trzy argumenty wywołania i kolejno je wyświetla:
 echo $1 $2 $3
b) otrzymuje dowolną liczbę argumentów wywołania i wyświetla je wszystkie:
 echo $*
c) otrzymuje dowolną liczbę argumentów wywołania i wyświetla, ile ich otrzymał:
 echo $#

Zad. 4
Utworzyć dwa proste skrypty o nazwach odpowiednio Pierwszy i Drugi, które robią cokolwiek (np. wyświetlają coś), a następnie skrypt, który po kolei wywołuje je w swojej treści (jako podprogramy):
 ...
 echo Uruchamiam pierwszy skrypt
 Pierwszy
 sleep 3
 echo Uruchamiam drugi skrypt
 Drugi
 sleep 3
 echo Koncze dzialanie
 exit 0



W przypadku uruchamiania skryptów tak, jak robiliśmy to do tej pory (podanie w linii poleceń nazwy skryptu i ewentualnych argumentów wywołania), tworzony jest nowy proces (potomny względem bieżącego interpretera), który inicjuje wykonywanie skryptu. Jest też jednak możliwe uruchomienie skryptu w ramach procesu bieżącego interpretera.

Zad. 5
Utworzyć skrypt, który tworzy nową zmienną środowiska i nadaje jej wartość (uwaga: nie umieszczać exit 0 na końcu tego skryptu). Uruchomić skrypt: a) w podpowłoce (czyli tak, jak do tej pory); b) w bieżącej powłoce (pisząc . skrypt lub source skrypt). Za każdym razem po wykonaniu skryptu sprawdzać, czy utworzona zmienna środowiska nadal istnieje, a jeżeli tak, to usunąć ją. UWAGA: w poleceniu . skrypt spacja po kropce jest konieczna.

Zad. 6
Utworzyć skrypt, który wczytuje dwie liczby całkowite, a następnie wyświetla ich sumę. Zmodyfikować skrypt tak, żeby zamiast wczytywać dane pobierał je z argumentów wywołania (np. suma 5 8).

Zad. 7
Utworzyć skrypt, który w bieżącym katalogu tworzy podkatalog Teksty, przenosi do niego z bieżącego katalogu wszystkie pliki, których nazwy kończą się na .txt i ustanawia prawa dostępu 600 do tych plików i 700 do podkatalogu Teksty.

Zad. 8
Utworzyć skrypt, który wypisze listę plików z bieżącego katalogu posortowaną malejąco według numerów i-węzłów, i-węzeł znajduje się w pierwszej kolumnie po zastosowaniu polecenia ls -i.

Zad. 9
Utworzyć skrypt, który w bieżącym katalogu zmienia wszystkie nazwy plików z rozszerzeniem .c na takie same nazwy z rozszerzeniem .cpp .