Wprowadzenie do programowania w powłoce
Transkrypt
Wprowadzenie do programowania w powłoce
Wprowadzenie do programowania w powłoce Wprowadzenie do programowania w powłoce mgr inż. Maciej Lasota [email protected] Katedra Informatyki, Politechnika Świętokrzyska w Kielcach 22 lutego 2012 Wprowadzenie do programowania w powłoce 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. Wprowadzenie do programowania w powłoce 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 Wprowadzenie do programowania w powłoce 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. Wprowadzenie do programowania w powłoce 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 Wprowadzenie do programowania w powłoce 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. Wprowadzenie do programowania w powłoce 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. Wprowadzenie do programowania w powłoce 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 Wprowadzenie do programowania w powłoce 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 Wprowadzenie do programowania w powłoce 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. Wprowadzenie do programowania w powłoce 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. Wprowadzenie do programowania w powłoce 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. Wprowadzenie do programowania w powłoce 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 Wprowadzenie do programowania w powłoce 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. Wprowadzenie do programowania w powłoce 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 Wprowadzenie do programowania w powłoce 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 ] Wprowadzenie do programowania w powłoce 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ść. Wprowadzenie do programowania w powłoce 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. Wprowadzenie do programowania w powłoce 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 Wprowadzenie do programowania w powłoce 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 Wprowadzenie do programowania w powłoce 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. Wprowadzenie do programowania w powłoce 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 Wprowadzenie do programowania w powłoce 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 Wprowadzenie do programowania w powłoce 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 Wprowadzenie do programowania w powłoce 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” Wprowadzenie do programowania w powłoce 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. Wprowadzenie do programowania w powłoce Wczytywanie danych Wczytywanie danych W celu wczytania danych do zmiennej wykorzystuje się polecenie read. Przykład 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. Wprowadzenie do programowania w powłoce 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[@]} Wprowadzenie do programowania w powłoce 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. Wprowadzenie do programowania w powłoce 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[@]} Wprowadzenie do programowania w powłoce 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 Wprowadzenie do programowania w powłoce 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