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