Wprowadzenie do programowania w powłoce mgr inż. Maciej Lasota m.lasota@tu.kielce.pl Katedra Informatyki, Politechnika Świętokrzyska w Kielcach 22 lutego 2012
Powłoka systemowa Powłoka systemowa Podstawowym sposobem komunikacji z systemem operacyjnym Unix/Linux (pomijając tryb graficzny) jest powłoka systemowa (ang. system shell) zwana również interpretatorem poleceń (ang. command interpreter). Powłoka systemowa jest to specjalny program rezydentny (działający w tle w pamięci operacyjnej) uruchamiany przy starcie systemu i stanowiący integralną część systemu operacyjnego. Zadaniem powłoki systemowej jest umożliwienie komunikacji między użytkownikiem systemu a jądrem systemu operacyjnego (całym systemem operacyjnym). Powłoka systemowa przyjmuje polecenia od użytkownika i wyprowadza wyniki działania systemu lub określonego programu na ekran monitora (w postaci komunikatów). W przypadku systemów uniksopodobnych wyróżniam kilka różnego rodzaju powłok systemowych, w zależności od przeznaczenia. Powłoki systemowe sh - podstawowa powłoka systemowa, bash - ulepszona wersja powłoki sh, csh, ksh, zsh, tcsh.
Powłoka systemowa Powłoka systemowa Powłoka systemowa sh stworzona została przez Stephena Bourne a przez rozbudowanie prostego interpretera poleceń o nazwie shell. Sh była domyślną powłoką w systemie Unix Version 7, gdzie zastąpiła pierwszą powłokę dla systemu Unix napisaną przez Kena Thompsona. Powłoka sh była rozwijana w laboratoriach AT&T, a jej pierwsza wersja pojawiła się w 1977 roku wraz z wydaniem systemu UNIX Version 7. Plikiem wykonywalnym powłoki na większości systemów Unix jest /bin/sh. Sh jest powłoką rozbudowaną wprowadzającą własny języki skryptowy (przypominający składnią język C), którego używa się do programowania w powłoce (tworzenia własnych skryptów). Obecnie jest to podstawowa powłoka systemowa w każdej wersji Unix a
Powłoka systemowa Powłoka systemowa Powłoka systemowa bash to jedna z najpopularniejszych powłok systemów uniksowych. Jest domyślną powłoką w większości dystrybucji systemu GNU/Linux oraz w systemie Mac OS X, istnieją także wersje dla większości systemów uniksowych. Bash jest także domyślną powłoką w środowisku Cygwin. Nazwa jest akronimem od Bourne-Again Shell (odrodzona powłoka shell a). Wywodzi się od powłoki sh, która była jedną z pierwszych i najważniejszych powłok systemu operacyjnego Unix oraz zawiera pomysły zawarte w powłokach ksh i csh. Pierwsza wersja powłoki Bourne a była tworzona przez Stephena Bourne a.
Szkielet skryptu powłoki Szkielet skryptu powłoki Skrypt powłoki tworzymy w zwykłym standardowym pliku tekstowym (plain-text) ASCII, skrypt wykonywany (interpretowany linia po linii) jest przez powłokę systemu operacyjnego. Skrypty powłoki zazwyczaj tworzymy w plikach z rozszerzeniem *.sh np. script.sh (nieformalna zasada). Podstawowy szkielet takiego skryptu został przedstawiony poniżej. Przykład # Nagłówek (może być #!/bin/sh) określa nam powłokę # która ma wykonać nasz skrypt #!/bin/bash # Cześć deklaracyjna, w części tej mogą znajdować się # zadeklarowane zmienne,stałe, tablice lub funkcje echo Witaj # Komentarze w skrypcie poprzedzamy znakiem # hash a
Szkielet skryptu powłoki Szkielet skryptu powłoki Uwaga Tak stworzony skrypt można wykonać (uruchomić) na dwa sposoby. Pierwszym sposobem jest wpisanie w linii poleceń (konsoli) nazwę powłoki i nazwę skryptu (oddzielonych spacją) np. sh script.sh, bash script.sh itd.. Drugim sposobem jest bezpośrednie wywołanie skryptu wpisując./script.sh, sposób ten wymaga jednak ustawienia odpowiednich praw wykonywania dla pliku script.sh.
Prawa dostępu Prawa dostępu W systemach Unix/Linux podczas tworzenia pliku, system operacyjny zapisuje nie tylko nazwę i datę utworzenia pliku, ale także identyfikator użytkownika oraz grupy. Aby chronić pliki przed niepowołanym dostępem dla każdego pliku można ustawić odpowiednie ograniczenia (uprawnienia) zwana też prawami dostępu.
Prawa dostępu Prawa dostępu Prawa dla plików lub katalogów w systemach uniksopodobnych ustawiamy za pomocą polecenia chmod. Przykład 1 chmod [prawa dostępu] [nazwa pliku lub katalogu] chmod [prawa dostępu] -R [nazwa katalogu] Przykład 2 chmod 755 plik.txt -> (111),(101),(101) pełne prawa dla właściciela, dla grupy i pozostałych jedynie odczyt i wykonywanie chmod 666 -R dane -> (110),(110),(110) dla właściciela, grupy i pozostałych prawo odczytu i zapisu chmod 700 script.sh -> (111),(000),(000) dla właściciela pełne prawa
Zmienne Zmienne Zmienne w skryptach powłoki deklarujemy w następujący sposób: nazwa zmiennej= wartość zmiennej, jako wartość możemy podać liczbę, napis lub polecenia systemowe, polecenia podajemy w postaci odwrotnych apostrofów polecenie lub $(polecenie). Do zmiennej odwołujemy się poprzez znak dolara $. Przykład #!/bin/bash a=1 b=2 zmienna1= napis testowy zmienna2= ls zmienna3=$(pwd) wynik=$[a+b] wynik2=$[a+1] wynik3=$((a+b)) echo $zmienna1 echo Moje pliki $zmienna2 echo Moj katlog $zmienna3 # Komentarze w skrypcie poprzedzamy znakiem # hash a
Operatory arytmetyczne i logiczne Operatory arytmetyczne i logiczne Wyróżniamy następujące operatory w języku powłoki: Operatory arytmetyczne = - operator przypisania, + - operator dodawania, - - operator odejmowania, * - operator mnożenia, / - operator dzielenia, ** - podnoszenie do potęgi, % - operator modulo (reszta z dzielenia). Operatory logiczne! - operator negacji, && - operator iloczynu logicznego, - operator sumy logicznej.
Operatory arytmetyczne i logiczne Operatory arytmetyczne i logiczne Pozostałe operatory += - operator plus równa, -= - operator minus równa, *= - operator razy równa, /= - operator dzielone równa, %= - operator modulo równa.
Operatory arytmetyczne i logiczne Operatory arytmetyczne i logiczne Przykład if [ $string1 = $string2 ] then command fi let z=5**3 # 5 * 5 * 5 echo z = $z # z = 125 a= expr 5 % 3 echo $a # 2 Przykład if [ $condition1 ] && [ $condition2 ] if [ $condition1 -a $condition2 ] if [ $condition1 ] [ $condition2 ] if [ $condition1 -o $condition2 ] let var += 5 # Results in var being incremented by 5. let var *= 4 # Rresults in var being multiplied by 4.
Zmienne systemowe i specjalne Zmienne systemowe i specjalne Zmienne systemowe, są to zmienne globalne widoczne w systemie. Każdy system operacyjny posiada własne zmienne systemowe (zmienne środowiskowe) są one wykorzystywane przez system oraz programy np. zmienna PATH, HOME, JAVA itp.. Aby wyświetlić w skrypcie powłoki zmienne systemowe należy wywołać polecenie export lub printenv. Przykład #!/bin/bash global= export echo $global export nowa= testowa zmienna globalna # Komentarze w skrypcie poprzedzamy znakiem # hash a
Zmienne systemowe i specjalne Zmienne systemowe i specjalne Zmienne specjalne, są to zmienne często wykorzystywane w skryptach powłoki (zazwyczaj są tylko do odczytu). Zmienne specjalne $0 - zmienna zawiera nazwę skryptu (pliku), $1..$9 - parametry zewnętrzne przekazywane do skryptu (od 1 do 9), $@ - zmienna zawiera wszystkie parametry przekazywane do skryptu, @? - zmienna przechowuje kod powrotu ostatnio wywołanego polecenia (0 oznacza poprawne wykonanie polecenia), $$ - PID procesu bieżącej powłoki.
Instrukcje warunkowe Instrukcje warunkowe Instrukcja warunkowa IF (wersja 1) if warunek then polecenie fi Instrukcja warunkowa IF (wersja 2) if warunek then polecenie 1 else polecenie 2 else polecenie 3 fi Przykład #!/bin/bash if [ -e /test.plik] then echo Plik test.plik jest w katalogu glownym fi # Komentarze w skrypcie poprzedzamy znakiem # hash a
Instrukcje warunkowe Instrukcje warunkowe Testowanie warunku możemy wykonać jawnie za pomocą polecenia test lub też wykorzystaniem nawiasów kwadratowych. Przykład test wyrazenie1 operator wyrazenie2 lub [ wyrazenie1 operator wyrazenie2 ]
Instrukcje warunkowe Instrukcje warunkowe Rodzaje operatorów wykorzystywane do testowania warunku -a plik istnieje, -b plik istnieje i jest blokowym plikiem specjalnym, -c plik istnieje i jest plikiem znakowym, -e plik istnieje, -h plik istnieje i jest linkiem symbolicznym, = sprawdza czy wyrażenia są równe,!= sprawdza czy wyrażenia są różne, -n wyrażenie ma długość większą niż 0, -d wyrażenie istnieje i jest katalogiem, -z wyrażenie ma zerową długość.
Instrukcje warunkowe Instrukcje warunkowe Rodzaje operatorów wykorzystywane do testowania warunku -r można czytać plik, -w można zapisywać do pliku, -x można plik wykonać, -f plik istnieje i jest plikiem zwykłym, -p plik jest łączem nazwanym, -N plik istnieje i był zmieniany od czasu jego ostatniego odczytu, plik1 -nt plik2 plik1 jest nowszy od pliku2, plik1 -ot plik2 plik1 jest starszy od pliku2, -lt mniejsze niż, -gt większe niż, -ge większe lub równe, -le mniejsze lub równe.
Instrukcje warunkowe Instrukcje warunkowe Instrukcja warunkowa CASE case $zmienna in wzorzec1 ) polecenie1 (break/continue/exit);; wzorzec2 ) polecenie2 (break/continue/exit);; *) polecenie (break/conitnue/exit);;... esac Przykład #!/bin/bash case $para in 1 ) echo Wybor 1 ; break ;; 2 ) echo Wybor 2 ; break ;; q ) echo Wyjscie ; exit ;; *) continue ;; esac
Instrukcje pętli Instrukcje pętli Instrukcja warunkowa WHILE (wersja 1) while warunek do polecenie... done Instrukcja warunkowa WHILE (wersja 2) while [1] polecenie done Przykład #!/bin/bash i=1 while [$i -le 100] do echo Tekst wyswietlony $i raz y i=$[i+1] if [i -le 20] then break fi done
Instrukcje pętli Instrukcje pętli Uwaga W pętli może występować instrukcja continue służąca do ponownego wykonania pętli lub instrukcja break, służąca do natychmiastowego przerwania wykonywania instrukcji pętli.
Instrukcje pętli Instrukcje pętli Instrukcja warunkowa FOR (wersja 1) for((zmienna; warunek; inkrementacja)) do polecenie... done Instrukcja warunkowa FOR (wersja 2) for zmienna in arg1 arg2 arg3... do polecenie done Przykład #!/bin/bash for((i=0; i =5; i++ )) echo Tekst wyswietlony $i raz y done for a in 1 2 3 4 5 echo Tekst wyswietlony $a raz y done
Instrukcje pętli Instrukcje pętli Instrukcja warunkowa UNTIL until warunek do polecenie... done Przykład #!/bin/bash i=10 until [$i -ge 5] do echo liczba i: $i i=$[i-1] done
Instrukcje pętli Instrukcje pętli Instrukcja warunkowa SELECT select zmienna in lista do polecenie... done Przykład #!/bin/bash select y in X Y Z do case $y in X ) echo Wybrałeś X ;; Y ) echo Wybrałeś Y ;; Z ) echo Wybrałeś Z ;; *) echo Nic nie wybrałeś esac break done
Wyświetlanie danych Wyświetlanie danych W celu wyświetlanie danych na ekranie monitora (standardowe wyjście) wykorzystuje się polecenie echo. Przykład echo -n Tekst do wyświetlenia echo -e \t\t Tekst do wyświetlenia i dodatkowo zmienna $a \n\n
Wyświetlanie danych Wyświetlanie danych Rodzaje parametrów -n nie wysyła znaku końca linii (brak przejścia do nowej linii), -e włącza interpretację parametrów wewnątrz tekstu. Rodzaje parametrów wewnątrz tekstu \n - przejście do nowej linii, \a alert (dzwonek) \b - backspace, \a alert (dzwonek) \c - pomija znak końca nowej linii, \f - escape, \r - znak nowej linii, \t tabulacja, \\ - backslash.
Wczytywanie danych Wczytywanie danych Przykład W celu wczytania danych do zmiennej wykorzystuje się polecenie read. read [operator][zmienna] read a b echo $a echo $b read -e echo $REPLY Rodzaje parametrów -a pokaż znak zachęty bez kończącego znaku nowej linii -p wczytywanie danych do tablicy, -e jeśli nie podano żadnej zmiennej dane trafią do zmiennej systemowej $REPLY.
Tablice Tablice Deklaracja tablicy zmienna=(wartość1 wartość2 wartość3...) Przykład #!/bin/bash tablica=(poniedzialek Wtorek Sroda Czwartek piątek Sobota Niedziela) echo ${tablica[0]} echo ${tablica[1]} echo ${tablica[2]} echo ${tablica[4]} echo ${tablica[5]} echo ${tablica[6]} echo ${tablica[*]} echo ${#tablica[0]} echo ${#tablica[@]}
Tablice Tablice Uwaga echo ${tablica[*]} - wyświetlanie wszystkich elementów tablicy, echo ${#tablica[0]} wyświetlanie długości znaków podanego elementu np. 12 dla tablica[0], echo ${#tablica[@]} - wyświetlanie liczby wszystkich elementów w tablicy np. 7 dla tablicy.
Tablice Tablice Przykład #!/bin/bash tablica=(poniedzialek Wtorek Sroda Czwartek piątek Sobota Niedziela) unset tablica[6] echo ${tablica[*]} tablica[6]=tekst tablica[7]=tekst2 echo ${tablica[*]} unset tablica[*] echo ${tablica[@]}
Funkcje Funkcje Deklaracja funkcji function nazwa funkcji() { polecenie... return $zmienna } Przykład 1 #!/bin/bash function test() { echo test } test Przykład 2 #!/bin/bash function dodaj() { wynik= expr $1 + $2 return $wynik } dodaj 20 30
Przekierowania i strumienie Przekierowania i strumienie Operatory przekierowania i strumieni > - operator przekierowania do, < - operator przekierowania z, >> - operator dopisania do, << - operator dopisania z, - operator strumienia. Przykład 1 pwd > plik.txt # zapisanie ścieżki do pliku more < plik.txt # wyświetlenie pliku na ekranie cat plik1.txt > plik2.txt # zpisanie pliku1.txt do pliku2.txt ls *.txt >> plik3.txt # dopisanie do pliku3.txt