Wykład 3
Programowanie w języku Shell
Język shell:
sh – interakcyjny interpreter komend, który wykonuje komendy przeczytane z terminala lub pliku
skrypt powłokowy – plik tekstowy, który zawiera sekwencję poleceń przeznaczony do interpretacji przez powłokę Shell
Metody uruchamiania skryptów:
- przez wskazanego shell’a (niezbędne prawa dostępu r):
$ sh skrypt1 [par] …
- przez wskazanego shell’a z ustawioną opcję śledzenia:
$ sh –x skrypt1 [par] …
- przez potomka bieżącego shell’a (niezbędne prawa dostępu rx):
$ sciezka_dostepu/skrypt1 [par] …
- z bieżącego katalogu:
$ ./skrypt1 [par] …
- gdy ustawiona zmienna środowiskowa PATH
$ skrypt1 [par] …
- interpretacja skryptu przez bieżący Shell:
$ . ./skrypt1 [par] …
Przerywanie działania skryptów:
- wysyłanie sygnału nr 2 (SIGINT) do procesu - <CTRL-C>
- wygenerowanie pliku core - <CTRL-\>
- wysyłanie sygnału nr 9 (KILL) do procesu – komenda kill z opcją -9
Zmienne specjalne shell’a:
$# - liczba argumentów pozycyjnych
$0 – nazwa skryptu shell’owego
$1-$9 – zmienne pozycyjne
$* - rozwijane do „$1 $2 …”
$@ - rozwijane do „$1” „$2” …”
$? – kod powrotu ostatniego polecenia
$$ - numer procesu bieżącego shell’a
$! – numer ostatniego procesu uruchomionego w tle
Wybrane zmienne środowiskowe:
HOME – domyślna wartość argumentu komendy cd ustawiana przez proces login na podstawie zapisu w pliku /etc/passwd
IFS – domyślne separatory pól (spacja, znak tabulacji i nowej linii)
LOGNAME – nazwa konta
PATH – lista ścieżek dostępu przeszukiwania dla komend
PS1 – pierwszy ciąg zaproszenia do pisania (domyślnie „$”)
PS2 – pierwszy ciąg zaproszenia do pisania (domyślnie „>”)
PWD – ścieżka dostępu do katalogu bieżącego
Zmienne programowe:
Zmienne programowe – tworzaeone przez użytkownika i wykorzystywane przez procedury shell’owe
Przykład:
$ nazwa_pliku=dane.txt
$ dzien_tyg=dzien.txt
Listowanie i odwoływanie zmiennych programowych oraz środowiskowych:
Listowanie zmiennych:
$ set
Odwoływanie zmiennych:
$ Undset dzien_tyg
Przykładowy skrypt:
$ cat > skrypt2
echo „Podaj imie: \c”
read A
echo „\nWprowadzono:\t$A”
<CTRL-D>
Wynik:
$ skrypt2
Podaj imie: Ewa
Wprawadzono: Ewa
$
Pojęcia podstawowe shell’a:
Znak biały – niezerowej długości ciąg znaków składający się ze znaków tabulacji i/lub znaków spacji
Nazwa – sekwencja znaków ASCII: małych liter, dużych liter, cyfr i znaków podkreślenia zaczynających się od litery lub znaku podkreślenia
Parametr – nazwa, liczba lub znak ze zbioru {*, @, #, ?, -, $, !, \, ^}
Komenda prosta – nazwa_kom [-opcje] [parametry]
Wartość komendy prostej – dodatnia liczba zwracana po wykonaniu komendy; (0 – poprawnie)
Potok
- sekwencja kilku komend oddzielonych „|”
- standardowe wejście jednej komendy jest podłączone do standardowego wejścia kolejnej komendy
- zwraca wartość potoku jest równa wartości ostatniej komendy potoku
Lista – sekwencja jednego lub kliku potoków oddzielonych przez znaki ‘;’ i ‘&’ (niski priorytet) i znaki &&, || (wysoki priorytet)
; - sekwencyjne wykonywanie potoków
& - asynchroniczne wykonywanie potoków
&& - lista występująca za tymi znakami jest realizowana, jeżeli poprzedzający potok zwróci wartość równą 0
$ test –r /etc/hosts && cat /etc/hosts
|| - lista występująca za tymi znakami jest realizowana, jeżeli poprzedzający potok zwróci wartość różną od 0
$ test –e /etc/dzien||date > cat /etc/dzien
Komenda
komenda prosta lub złożona
złożone:
podstawienie komend
komenda1 `komenda2`
Wynik działania komendy komenda2 jest traktowany jako parametry komendy komenda1
Podstawienie komend może być wykonywane rekurencyjnie
warunkowa – if
if lista0 Jeżeli wartość zwracana przez
then listę lista0 jest równa 0
lista1 (sukces), to wykonywana jest
elif lista2 ; then lista lista1, a jeżeli jest różna
lista3 od 0, to sprawdzana jest
: wartość listy lista2 itd.
:
else Gdy wszystkie listy następujące po
listan if lub po elif zwrócą wartość różną
fi od 0 wykonywana jest lista listan
wyboru – case
case word in
wz01 wz02 … )
lista0
;;
wz11 wz12 … )
lista1
;;
:
:
esac
pętli – for, while, until
for name [ in word…] ; do
list
done
W każdym przebiegu pętli zmienna name przybiera kolejne wartości z wykazu słów po in. Jeżeli wykaz In jest pominięty, to pętla jest wykonywana jednorazowo dla każdej ustawionej wcześniej zmiennej pozycyjnej
while lista0 ; do
lista1
done
Jeżeli wartość zwracana przez listę lista0 jest równa 0 (sukces), to wykonywana jest lista lista1. W przeciwnym przypadku pętla jest przerywana. Jeżeli lista1 jest pusta komenda while zwraca 0.
definicja funkcji
wartość komendy jest wartością ostatniej wykonywanej komendy prostej
TEST
Test expr lub [ expr ]
Komenda test wyznacza wyrażenie expr jeżeli jego wartość logiczna jest prawdą zwraca 0; w przeciwnym przypadku zwraca wartość różną od 0.
Wartość niezerowa jest również zwracana w
Elementy do tworzenia wyrażeń Expo:
-r file – prawda, jeżeli plik file istnieje i jest odczytywalny
-w file – prawda, jeżeli plik file istnieje i jest zapisywalny (ustawione prawdo dostępu „w” dla pliku).
- x file – prawda, jeżeli plik file istnieje i ma atrybuty do wykonywania
- e file – prawda, jeżeli plik file istnieje
- f file – prawda, jeżeli plik file istnieje i jest plikiem regularnym
- d file – prawda, jeżeli plik file istnieje i jest katalogiem
- h file – prawda, jeżeli plik file istnieje i jest symbolicznym wiązaniem do pliku
- c file – prawda, jeżeli plik file istnieje i jest znakowym plikiem specjalnym
- b file – prawda, jeżeli plik file istnieje i jest blokowym plikiem specjalnym
- u file – prawda, jeżeli plik file istnieje i ma ustawiony bit SUID
- g file – prawda, jeżeli plik file istnieje i ma ustawiony bit GUID
- k file – prawda, jeżeli plik file istnieje i ma ustawiony sticky bit
- s file – prawda, jeżeli plik file istnieje i jego rozmiar jest większy od 0
- z s1 – prawda, jeżeli długość ciągu s1 jest równa 0
-n s1 – prawda, jeżeli długość ciągu s1 nie jest równa 0
s1 – prawda, jeżeli ciąg s1 nie jest ciągiem pustym
s1 = s2 – prawda, jeżeli ciągi s1 i s2 są identyczne
s1! = s2 – prawda, jeżeli ciągi s1 i s2 nie są identyczne
n1 –eq n2 – prawda, jeżeli liczby całkowite n1 i n2 są algebraicznie równe. Pozostałe operatory algebraiczne: ne, gt, ge, lt, le
! – jednoargumentowy operator negacji logicznej
-a – operator iloczynu logicznego
-o – operator sumy logicznej (-a ma priorytet wyższy niż –o)
( expr ) – nawiasy do tworzenia wyrażeń złożonych
Sprawdzenie czy plik nie istnieje:
if [ ! –f $HOME/.profile ] ; then
Echo „Brak pliku .profile.
Kopiuje z /etc/skel/B”
Cp /etc/skel/B/.profile $HOME/.profile
fi
Sprawdzenie czy zmienna została zdefiniowana:
while [ -z „$VAL” ] ; do
echo –n „Wprowadź wartość zmiennej:”
read VAL
done
EXPR
expr argumetny
parametry argumenty tworzą wyrażenie
po wyznaczeniu wartości wyrażenia wynik wpisywany jest na standardowym wyjsciu
elementy wyrażenia muszą być oddzielone spacją
znaki specjalne dla shell’a muszą być poprzedzone znakiem „\”
ciągi znaków zawierające spacje muszą być cytowane
długość wyrażenia jest ograniczona do 512 znaków
Wykaz operatorów (ułożone rosnąco według priorytetu):
expr1\| expr2 wypisuje expr1 jeżeli nie jest puste ani nie jest wyzerowane. W przeciwnym przypadku wypisuje expr2
expr1\&expr2 wypisuje expr1 jeżeli nie jest puste ani nie jest wyzerowane. W przeciwnym przypadku wypisuje 0.
expr1 {=, \>, \>=, \<, \<=, != } expr2 wypisuje logiczną wartość wyniku porównania
expr1 { +, -} expr2 – wypisuje wynik dodawania lub odejmowania wyrażeń całkowitych
expr1 {\*, /, % } expr2 – wypisuje wynik mnożenia, dzielenia lub resztę z dzielenia wyrażeń całkowitych
expr1 : expr2 – wpisuje liczbę identycznych znaków w obu wyrażeniach począwszy od lewej strony
\( expr \) - wyodrębnianie ciągu pasującego do wyrażenia w nawiasach
0 – jeżeli nie jest puste ani nie ma wartości 0
1 – jeżeli jest puste lub ma wartość zero
2 – błąd
FUNKCJE:
name(){
Lista0
}
Definicja funkcji o nazwie name, której ciałem jest lista lista0. Parametry wywoływania funkcji są przekazywane do funkcji przez parametry pozycyjne.