Podstawy programowania w Bash`u - prajmus
Transkrypt
Podstawy programowania w Bash`u - prajmus
Podstawy programowania w Bash'u I. Czym jest bash? II. Pierwszy program! III. Zmienne IV. Cytowanie V. Modyfikacja wyjścia VI. Wejście VII. Zmienne specjalne. VIII. Testy IX. Instrukcje warunkowe X. Pętle XI. Słowa Zastrzeżone XII. Tablice XIII. Funkcje XIV. Autor I. Czym jest bash? Bash jest powłoką systemową Unix, jedną z najpopularniejszych powłok systemów uniksowych. Została stworzona przez Briana Foxa i Cheta Rameya w 1987 roku. Powłoka umożliwia pracę interaktywną. Umożliwia także jak większość języków programowania definiować funkcje, zawiera instrukcje sterujące (if, while itp.). Bash zapisuje historię wykonywanych poleceń w pliku .bash_history w katalogu domowym użytkownika. ( domyślnie po otworzeniu Konsoli, bądź terminala jesteśmy w katalogu domowym, wtedy piszemy "cat .bash_history" i widzimy wszystkie polecenia wydane przez nas ) II. Pierwszy program! 1. Tworzymy nowy plik Kod: touch helloworld gdzie helloworld to nazwa naszego pliku. Nie musimy dodawać żadnego rozszerzenia! 2. Edytujemy plik w jakimś edytorze Kod: pico helloworld edytor jest dowolny może to być pico, ale tekże gedit lub mcedit 3. Przychodzimy do pisania właściwej treści pliku: Kod: #! /bin/bash #1 echo "Hello World"; #2 # moj pierwszy program w bash'u #3 ©Jakub 'prajmus' Borowski 2007 Omówienie programu: 1 - jest to niezbędna linijka aby nasz program zadziałał. #! wskazuje na powłokę w której nasz skrypt ma sie wykonać. U nas jest to /bin/bash 2 - polecenie echo służy do wyświetlania komunikatów albo danych na standardowe wyjście ( ekran ) 3 - wolno stojący # (hash) oznacza komentarz wszystko po nim jest omijane przez powłokę. 4. Nadajemy naszemu skryptowi prawa wykonania Kod: chmod +x helloworld 5. I uruchamiamy go Kod: ./helloworld spowoduje to wyświetlenie na ekranie napisu Hello World, przez polecenie echo. III. Zmienne. a) Deklarowanie zmiennych: Zmienne definiujemy inaczej niż w Pascalu, C++ itp. Otóż nie podajemy typu zmiennej, tylko podajemy nazwę i jej wartość "nazwa = wartość;" np.: Kod: users = 30; Aby wyświetlić zmienną na ekranie używamy tak jak poprzednio polecenia echo, jednak nazwę zmiennej poprzedzamy tak jak w php znakiem dolara $ np.: Kod: echo "Ilość uzytkownikow jest rowna $users"; Wartością zmiennej może być liczba, tekst, lub polecenie powłoki (patrz rozdział IV) Przykładowy program ze zmienną : Kod: #! /bin/bash #deklarujemy zmienne users=21; #1 admin="prajmus" #2 echo "Jest $users uzytkownikow, a adminem jest $admin"; # 3 ©Jakub 'prajmus' Borowski 2007 1 - zmienna przybierająca jako wartość liczbę 2 - zmienna przybierająca jako wartość tekst 3 - przykład bardziej rozbudowanego polecenia echo b) Operacje na zmiennych: Operacje na zmiennych możemy wykonywać na trzy sposoby: $((obliczenia)) ; $[obliczenia] , lub przez polecenie let (np. let zmienna = obliczenia) Kod: #! /bin/bash #operujemy na zmiennych1 girls=5 boys=4 together=$[girls+boys] echo "razem jest" $together lub Kod: #! /bin/bash #operujemy na zmiennych2 girls=5 boys=4 together=$((girls+boys)) echo "razem jest" $together lub Kod: #! /bin/bash #operujemy na zmiennych3 girls=5 boys=4 let together=girls+boys echo "razem jest" $together Dostępne operacje na zmiennych: + dodawanie - odejmowanie * mnożenie / dzielenie % modulo(reszta z dzielenia) ©Jakub 'prajmus' Borowski 2007 IV. Cytowanie Ten rozdział można określić rozszerzeniem rozdziału IIIa , ponieważ też zajmujemy się tu deklarowaniem zmiennych. Otóż w bash'u dostępne są trzy rodzaje cytowania (cytowania ponieważ chodzi tu o cudzysłowie): 1. przez przez cudzysłów "tekst" 2. przez pojedynczy apostrof 'tekst' 3. przez odwrócony apostrof `tekst` (znajduje się na klawiszu tylda pod ESC) 1. Między cudzysłowami umieszcza się tekst oraz wartości zmiennych oddzielone spacją (można także umieszczać polecenia konsoli) 2. Wszystko co znajduje się pomiędzy apostrofami jest traktowane jako tekst, czyli wartości zadeklarowanych przez nas zmiennych nie zostaną wyświetlone. 3. Odwrotny apostrof umożliwia cytowanie poleceń konsoli (może być zagnieżdżony w cudzysłów) przykład 1. Kod: #! /bin/bash #cudzyslow gdzie="katalogu" echo "jestem w $gdzie `pwd`" przykład 2. Kod: #! /bin/bash #apostrof gdzie="katalogu" echo 'jestem w $gdzie `pwd`' #niestety nie pokaze sie ani wartosc zmiennej ani nasza pozycja ;/ V. Modyfikowanie wyjścia. Krótko na ten temat. Po poleceniu echo zawsze powstaje nowa linijka można jednak temu zapobiec przez dodanie -n Kod: echo -n "czesc " echo "to ja" spowoduje wypisanie "czesc to ja " inne parametry: (zaczerpnięte z http://www.dief.republika.pl/echo.html ) # -e włącza interpretacje znaków specjalnych takich jak: * \a czyli alert, usłyszysz dzwonek * \b backspace * \c pomija znak kończący nowej linii * \f escape ©Jakub 'prajmus' Borowski 2007 * \n form feed czyli wysuw strony * \r znak nowej linii * \t tabulacja pozioma * \v tabulacja pionowa * \\ backslash * \nnn znak, którego kod ASCII ma wartość ósemkowo * \xnnn znak, którego kod ASCII ma wartość szesnastkowo VI. Wejście Do wczytywania danych służy polecenie read read (-opcje) nazwa zmiennej Programik: Kod: #! /bin/bash #wczytywanie danych echo "jak masz na imie: " read imie echo "czesc $imie" Oczywiście można wczytywać kilka zmiennych naraz (read jeden dwa trzy) a także nadpisywać już istniejące zmienne. VII. Zmienne specjalne Myślę że to będzie ostatni rozdział, ponieważ chcę aby były tu podstawy. Uruchamiając program możemy podać dodatkowo parametry np. ./nazwa_programu parametr1 parametr2 itp Parametry te są zapisywane w specjalnych zmiennych od $0 do $9 w $0 znajduje się nazwa skryptu, natomiast w $1...$9 podane parametry przykład: Kod: #! /bin/bash #parametry echo $0 $1 uruchommy program w następujący sposób: ./program czesc powinniśmy dokładnie to samo co wpisaliśmy ujrzeć na ekranie monitora VIII. Testy Zanim będę mógł omówić pętle, musze przedstawić koncepcję testu logicznego (prawda lub fałsz). W powłoce 0 oznacza prawdę, a każda inna wartość – fałsz. Polecenie test: jest to polecenie wbudowane w powłokę; zwraca 0 jeśli warunek jest prawdziwy, lub 1 jeżeli ©Jakub 'prajmus' Borowski 2007 fałszywy. Kod: #! /bin/bash #test test 20 -lt 10 # -ln omówię za momencik echo $? #jest to zmienna specjalna oznaczająca kod powrotu ; każde polecenie taki zwraca Jako rezultat wykonania naszego programu powinniśmy ujrzeć: 1 Teraz trochę o tym -ln. Otóż jest to argument stosowany przez polecenie test. Argumentów jest oczywiście dużo więcej. Postaram się najciekawsze przedstawić. Testy plików -d plik plik jest katalogiem ? -f plik plik jest zwykłym plikiem? -L plik plik jest dowiązaniem symbolicznym ? -r plik plik istnieje i daje sie odczytać ? -w plik plik istnieje i daje sie zapisać ? -x plik plik istnieje i daje sie uruchomić ? -s plik plik istnieje i jego wielkość jest większa od 0 pl1 -nt pl2 plik pl1 jest nowszy od pl2 pl1 -ot pl2 plik pl1 jest starszy od pl2 Testy ciągów znaków ci1 = ci2 ciąg ci1 jest taki sam jak ci2 ci1 != ci2 ciąg ci1 jest różny od ci2 -z ci1 ciąg ci1 jest równy 0(długość) -n ci1 ciąg ci1 jest większy od 0 (dłuższy) Testy numeryczne a -eq b a jest równe b a -ne b a nie jest równe b a -gt b a jest większe od b a -ge b a jest większe lub równe b a -lt b a jest mniejsze od b a -le b a jest mniejsze lub równe b Łączenie i negowanie testów t1 -a t2 iloczyn logiczny ( i t1 i t2 muszą mieć wartość true) t1 -o t2 suma logiczna (t1 lub t2 musi mieć wartość true) ! test negacja testu (test w tym wypadku to nie polecenie tylko nasz test logiczny ©Jakub 'prajmus' Borowski 2007 Zamiast polecenia test możemy również użyć nawiasów kwadratowych i pomiędzy nimi umieścić nasz test Kod: #! /bin/bash #test [ 20 -lt 10 ] #nalezy pamietac o spacji po [ i przed ] echo $? Jest to ten sam program co w pierwszym przykładzie, zapisany nieco inaczej. IX. Instrukcje warunkowe Są to jak mówi nazwa instrukcje, które sprawdzają warunki. Pierwszym przykładem instrukcji warunkowej jest instrukcja if. Budowa: Kod: if polecenie then instrukcje fi #jeśli test zwróci 0 A oto przykład: Kod: #!/bin/bash if [ `whoami` = "root" ] #znów przypomnę o spacjach than echo "masz władze" fi Inna postać instrukcji if to: Kod: if polecenie then instrukcje1 else instrukcje2 fi ©Jakub 'prajmus' Borowski 2007 Rozbudowany przykład: Kod: #!/bin/bash if [ `whoami` = "root" ] then echo "masz władze" else echo "twoje prawa są ograniczone" fi Jeżeli uruchomimy program ze swojego konta ujrzymy: "twoje prawa są ograniczone", jednak jako root zobaczymy już, że mamy władze ;P Istnieje jeszcze jedna forma instrukcji if: Kod: if polecenie1 then instrukcje1 elif polecenie2 then instrukcje2 elif ... ...... else instrukcjeN fi Pozwala ona na tworzenie jeszcze bardziej rozbudowanych programów. Przykład: Kod: #!/bin/bash echo "podaj liczbe:" read liczba if [ $liczba -lt 0 ] then echo "twoja liczba jest mniejsza od 0" elif [ $liczba -gt 0 -a $liczba -lt 10 ] then echo "liczba jest wieksza niz 0 ale mniejsza od 10" else echo "liczba jest większa od 10" fi ©Jakub 'prajmus' Borowski 2007 Prosty program wiadomo co robi :). Istnieje jeszcze jedna instrukcja warunkowa. Jest to case Budowa: Kod: case ciąg_znaków(lub zmienna) in wyrażenie1) ciało1 ;; wyrażenie2) ciało2 ;; ... *) inne ciało (jeżeli nie było prawidłowej wartości) ;; esac Case sprawdza ciąg_znaków i szuka takiego samego wyrażenia, jeżeli takie istnieje to wtedy wykonuje sie ciało wyrażenia. przykład: Kod: #!/bin/bash echo "podaj liczbe 1-3:" read liczba case $liczba in 1) echo "podałeś jeden" ;; 2) echo "podaleś dwa" ;; 3) echo "podałeś trzy" ;; *) echo "nie zastosowałeś się do warunków zadania" ;; esac Ten program chyba też nie wymaga wyjaśnień. X. Pętle ©Jakub 'prajmus' Borowski 2007 Pętla while – powtarza ona wykonanie poleceń dopóki warunek jest prawdziwy. Budowa: Kod: while warunek do polecenia done Przykład: Kod: #!/bin/bash i=0 while [ $i -lt 4 ] do echo $i i=$[$i+1] done Po wykonaniu tego prostego skryptu ujrzymy cyfry od 0 – 3 każda w innej linijce Bardzo podobna do pętli while jest pętla until, tyle że wykonuje ona polecenia dopóki warunek jest fałszywy. Budowa: Kod: until warunek do polecenia done Pętla for – służy do iterowania wartości z podanej listy. Kod: for zmienna in lista do polecenia done Program: ©Jakub 'prajmus' Borowski 2007 Kod: #!/bin/bash for users in Kuba Ja Prajmus do echo "$users jest na ircu" done Do tematu pętli warto jeszcze dodać dwa polecenia. Jest to break i continue/ break – umieszczone w pętli powoduje jej zakończenie continue – umieszczone w pętli powoduje przejście do kolejnej iteracji. XI. Słowa zastrzeżone W bash'u istnieją słowa, których nie możesz użyć jako nazwy zmiennych są to (alfabetycznie): ● ! ● [ ● ] ● { ● } ● case ● do ● done ● elif ● else ● esac ● fi ● for ● function ● if ● in ● select ● time ● then ● until ● while XII. Tablice Tablice są to specjalne zmienne, które mogą przechowywać kilka wartości. Deklarujemy je następująco: n_zmiennej=(wartosc1 wartosc2 wartosc3 ...) Wartości są oddzielane spacja. Aby odwołać się do któregoś jej elementu należy wpisać: {n_zmiennej[index]} ©Jakub 'prajmus' Borowski 2007 Indeksowanie tablic zaczyna sie od zera, czyli w naszym przypadku wartosc1 będzie miała index 0, wartosc2 1 itd. Przykładowy program: Kod: #!/bin/bash tablica=(my home) echo -n "${tablica[0]} " #ten sam efekt uzyskamy wpisując ${tablica} echo ${tablica[1]} Na ekranie ujrzymy napis "my home" Możemy to zrobić nieco szybciej wypisując naraz cała tablice. Aby to wykonać trzeba w miejsce indexu wpisać @ lub *. Kod: #!/bin/bash tablica=(my home) echo ${tablica[@]} Aby wyświetlić długość któregoś z elementów, lub ilość elementów w tablicy należy przez nazwą zmiennej postawić # np. echo ${#tablica[0]} (wyświetli 2 bo tyle liter ma słowo "my") Nadpisywanie, dodawanie i usuwanie elementów tablicy Kod: #!/bin/bash tablica=(my home) echo ${tablica[@]} tablica[2]=prajmus #dodaje element prajmus na koniec tablicy echo ${tablica[@]} tablica[2]=pprraajjmmuuss #zamienia wartość elementu o podanym indexie echo ${tablica[@] unset tablica[2] #usuwa podany element echo ${tablica[@]} unset tablica[@] #usuwa cala tablice echo ${tablica[@]} ©Jakub 'prajmus' Borowski 2007 XIII. Funkcje Funkcja jest to wydzielona część programu wykonująca konkretne operacje. Definiujemy je dzięki słowu function(które jednak nie jest konieczne), a wywołujemy podając jej nazwę, np.: Kod: #!/bin/bash function home #równie dobrze możemy napisać tylko home { echo "my home" } home #wywołanie funkcji Możliwe jest także tworzenie funkcji z parametrami. Wywołuje się je następująco: nazwa_funkcji "parametr1" "parametr2". Parametry w funkcji odbiera sie tak jak w programie wykorzystując zmienne $1-$9. Jednak w przeciwieństwie do programów zmienna $0 nie przechowuje nazwy funkcji. XIV. Autor Jakub 'prajmus' Borowski, uczeń I LO Collegium Gostomianum w Sandomierzu Strona Domowa: http://prajmus.cba.pl Adres e-mail: [email protected] numer gg: 2224871 Jeżeli masz jakieś uwagi na temat artykułu napisz. ©Jakub 'prajmus' Borowski 2007