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. 2Napisać 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. 3Napisać 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. 4Utworzyć 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. 6Utworzyć 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. 7Utworzyć 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. 9Utworzyć skrypt, który w bieżącym katalogu zmienia wszystkie nazwy
plików z rozszerzeniem .c na takie same nazwy z rozszerzeniem .cpp .