A dzisiaj dzisiaj się nauczę Basha czyli szybki kurs

background image

"A dzisiaj... dzisiaj się nauczę Basha"

- czyli szybki kurs.

Konrad Dzwinel
v. 0.3 ( 26-05-2006 )

Spis rzeczy:


Skrypty
- z czym to się je?
- zmienne i operacje na zmiennych
- warunki
- pętle
- cytowanie
- funkcje
- wartosc zwracana
- narzędzia i filtry
Bibliografia
O tym artykule

Skrypty

Skrypty - z czym to się je?

Skrypty to, krótko mówiąc, programy czytane przez interpreter linijka po linijce, nie wymagające kompilacji. Skrypty pisze się szybko, skrypty są krótkie, skrypty 
ułatwiają życie.

Jak utworzyć sobie skrypt?


A jak taki skrypt odpalić?


A teraz pokrótce jak napisać skrypt:
Po pierwsze potrzebujemy programu który wykona nasz skrypt (interpreter). Dlatego też, w pierwszej linijce musimy go wskazać, w dzisiejszych czasach będzie to:

Czyli podstatwowa powłoka systemu. Dodam jeszcze, że wszystko napisane po '#' do końca linii jest komentarzem.
Czas już najwyższy na przykład, który omówimy step-by-step:

t o u c h s k r y p t / / t w o r z y m y p u s t y p l i k
chmod +x skrypt //dodajemy możl i w ość wykonania (+x) do pliku

. /s k r y p t

# ! / b i n / b a s h

"Napisz program który wypisze słowo podane w parametrze, obecny czas oraz nazwę użytkownika uruchamiaj ącego skrypt"

Linia pierwsza (przy cichym typowym dla informatyków założeniu, ze numerujemy od 0) zwraca nam pierwszy parametr jaki dostal skrypt ("$1"). Druga linia to
odpowiednio sformatowana data (godzina:minuta:sekunda). Trzecia linia to whoami - czyli "kim jestem" -polecenie które zwaraca nazwę zalogowanego usera.

Co to znaczy że skrypt dostał parametr? No np.

Skoro pierwszy parametr ukrywa się pod zmienną $1 to łatwo jest się domyślić, że reszta parametrów jest trzymana w zmiennych: $2, $3 itd. Jeżeli parametr nie
istnieje to pod daną zmienną nic nie ma. A co jest w $0? Ano w $0 jest nazwa skryptu (i sposób jego wywołania). Czyli np.

Da nam:

Jakie są jeszcze inne przydatne zmienne 'wbudowane'?
$* - wypisze wszystkie parametry naraz
$$ - zwróci numer procesu (PID)
$# - zwróci ilość podanych parametrów

Zmienne i operacje na zmiennych

Pada pytanie, jak działają w ogóle zmienne w tych skryptach? Otóż wygląda to tak:
Deklaracja/przypisanie:

Wywołanie:

No i fajnie jest, ale co poniektórzy zauważą że $LICZBA+$PI nie da nam "669.14" lecz "666+3.14". Króko mówiąc bash preferuje stringi. Słabo mu idzie liczenie,
zaokrangla, składania obliczeń arytmetycznych jest mało przyjazna. Ale to tylko dlatego, że takie operacje nie są w praktyce prawie w ogóle potrzebne. Ale jezeli już 
trzeba... :

Jak widać, mało przyjaźnie. W ostatniej linijce jak łatwo się domyślić pod zmienną WYNIK została przypisana liczba 666. Rozpoznawane operacje arytmetyczne to:
+, -, *, /
** - potęgowanie
% - modulo
++ - pre i post inkrementacia / dekrementacja
+=, -=, /= *=
i operacje logiczne
Należy pamietać o tym, że bash nie wykona niczego na liczbach zmiennoprzecinkowych (potraktuje je jako tekst).
Kto nie bawił się wcześniej językami w stylu php, tego może dziwić, że bashowi wszystko jedno czy pod zmeinną jest string czy liczba. Wbrew pozorom jest to bardzo
wygodne. Można kleić ze sobą wyrazy, zmienne tekstowe i liczbowe bez żadnych konwersji/rzutowań.

Niektóre symbole (jak np '_') moga być wykorzystane w nazwie wiec trzeba na nie uwazac. Jezeli koniecznie chcemy je wypisac to tradycyjnie stostujemy \
(backslash).


UWAGA! Przypomniało mi się. Popularny bład:


Mało popularna, ale niekiedy przydatna jest możliwość pobrania danych od użytkownika już w trakcie działania skryptu (a nie jako parametr).

Warunki

Zacznijmy od if..then..elsa. Moim skromnym zdaniem składnia nie jest zbyt przyjazna. Jednak (jak się za chwile okaże) daje duże mozliwości.Przykład:

Słowa kluczowe pisałem dużymi literami, taki kod raczej nie zadziała, ale jak narazie dla poprawienia czytelności tak bede pisal (z czasem mi się znudzi). Teraz
śmieszna rzecz: warto zauważyć że polecenie IF jest zakończone swoją odwrotnąścią FI. Podobnie jest z kilkoma innymi poleceniami blokowymi. Druga rzecz, dziwne
porównywanie. Oj dziwne - uważajcie na spacje, nawiasy i średniki które muszą być tak jak to jest w kodzie powyżej. Samo porównanie to '-le' znaczy 'less or
equal' - mniejszy lub równy. Zaraz sobie wypiszemy część możliwości porównywania. Jak widzimy ilość argumentów ($#) jest porównywana z liczbą 2 i na podstawie
wyniku mogą zostać wypisane dwa rózne teksty. Możliwe jest oczywiście pominięcie kawałka z ELSE albo dodanie (ile chcemy) ELIF [ warunek ]; THEN.

Krótko o dostępnych warunkach:
Inty można porównywać na dwa sposoby:
standardowo = (albo == - tutaj to jest to samo), !=, < , >, <=, >= używając takiego zapisu

albo mniej standardowo(odpowiednio do tych na górze): -eq, -ne, -lt, -gt, -le, -ge używając takiego zapisu:


Do stringów mamy: = (i == - tutaj to samo), !=,. <, >, -z (czy jest NULLem), -n (czy nie jest NULLem)
Z plikami można robić mi. -e (sprawdza czy dany plik istnieje)

Mamy jeszcze CASEa działa to tak:

To taki switch (jak w ansi c) w którym za zmienną brany jest pierwszy argument skryptu (w tym wypadku oczywiście). $1 jest prównywane z 'dupa' oraz '1' a jeżeli
wszystko zawiedzie to wykonywana jest czynność domyślna *). Proszę zwrócić uwagę na ;; - podwójne średniki!

Pętle

Mamy dwie (trochę kłamię, ale innych w życiu nie użyłem): for'a i while'a. For jest bardzo fajny bo można iterować po wszyskim.

Jak widać pod zmienną uczelnie są podstawiane kolejne nazwy z listy. Mogą to być również pliki z folderu, albo kolejni użytkownicy z listy itd. Pętle liczbową łatwiej
zrobić while'm:

Widać, że warunki są tworzone identycznie jak w IFie. Reszta jest chyba oczywista. Można pomijać ten średnik po warunku ( ten przed 'do') jeżeli 'do' napiszemy w
nowej linii. Średnik zachowuje się tak samo jak koniec linii.

Cytowanie

Mamy trzy rodzaje cytowania: "jedno", 'drugie' i `trzecie`. Czym się różnią pokazuje poniższy skrypt:

" - działa tak że wypisuje wszystko ze środka interpretując zmienne
' - nie interpretuje zmiennych, porpostu wypisuje wszystko jako zwykły tekst
` - interpretuje zmienne i uruchamia polecenia zawarte w tekście ( teks po poleceniu zostanie potraktowany jako parametr)
Cytowanie przydaje się mi. wtedy gdy chcemy przekazać poleceniu parametr skłądający się z dwóch (lub więcej) wyrazów np

bez cytowania każde słowo zostało by potraktowane jako oddzielna zmienna.

Funkcje

Funkcje tworzymy np. na sposób znany z c:

Funkcje nigdy nic nie zwracają i nigdy nie mają określonych pomiedzy '(' a ')' parametrów jakie przyjmują. Jeżeli już koniecznie chcemy coś przekazać to wewnątrz
funkcji działają $1 $2 itd, czyli funkcja zachowuje się jak 'skrypt w skrypcie'.

Funkcje mogą być deklarowane 'gdziebądź', ale są rozpoznawalne tylko w kodzie poniżej deklaracji.

Warotść zwracana

Porpawnie zakończona funkcja powinna zwracać 0. Inne liczby moga być trakowane jako numer błędu. A więc:

Narzędzi i filtry

Co warto umieć obsługiwać:

GREP
Ten mały programik pozwala nam wyszukiwać wzorzec w tekście. Czyli np.

Faniejsze opcje:
-c tylko zlicza wystąpienia wzorca (ilość linii), nie wypisuje ich na konsole
-v wypisuje linie w których wzorzec NIE występuje

CUT
Cut wycina nam interesujący nas fragment tekstu. Czyli głównie chodzi o kolumnę. Np jak mamy listę użytkowników (polecenie who albo finger) to możemy wyciąć 
np. tylko kolumnę z loginami.

Co robią powyższe flagi:
-d Znaczek ktory oddziela kolumny od siebie. W przykladzie powyzej jest to spacja (' '). Domyslnie jest to tabulator.
-f ktore kolumny chcemy wyciac (to moze być lista po przecinku).

SORT
Sort jak sama nazwa wskazuje wykonuje sortowanie. Możemy sobie np. alfabetycznie posortować zalogowanych użytkowników:

Faniejsze flagi
-u Zrobi to samo co programik uniq - usunie powtarzajace sie linie - tzn. nie wyswietli ich.
-r odwróci sortowanie (postortuje z-a zamiast a-z).

TAIL i HEAD
Dwa programiki zwracające kilka ostatnich (tail) bądź pierwszych (head) linii wrzuconych na standardowe wejście. Czyli np. jeżeli chcemy przejrzeć co się ostanio
działo w logu systemowym:

Oba programiki nie mają jakiś specjalnie fascynujących opcji. Najbardziej popularna to chyba
-n Która poprostu zmienia standardową ilość wyświetlanych linii (10) na podaną przez usera.

BASENAME DIRNAME
Basename wycina nam tylko ostatni człon w ścieżce dostępu. Czyli np:

Dirname robi coś innego, ale w podobnym stylu. Ze ścieżki usuwa plik, pozostawiając samą ścierzkę do katalogu w którym się on znajduje. Przykładzik:


FIND
A to już potężne narzędzie. Omówię tylko podstawowe funkcje. Przykład podstawowego użycia:

Pierwsze co się podaje po 'find' to ścieżka gdzie plik ma być szukany. A teraz flagi:
-name tutaj podajemy plik jakiego szukamy (mozna używać * i ?)
-ctime n gdzie n to liczba. Szuka plików modyfikowanych przez ostatnie n*24 godziny.
-perm 777 szuka pliku o zadanym dostępie (tutaj jako przykład 777).
-user kdzwinel szuka plików podanego usera (tutaj kdzwinel)

INNE
A to lista prostych programików które mogą przydać się w skryptach:
uname -a   Podstawowa informacja o systemie
uptime   Czas pracy systemu
file plik   Wyświetla dane o pliku 'plik'

Biblografia

http://home.agh.edu.pl/~gjn/dydaktyka/UGLX/node5.html

http://zeisk.tech.us.edu.pl/ogloszenia/romanek/index.htm

O tym artykule

Tekst początkowo miał status "repetytorium przedkolosowego". Jednak doszedłem do wniosku, że potrzebuję zasilić czymś swoją stronę www i po odpowiednich
modyfikacjach nazwałem go 'artykułem' i dodałem do strony. Z kolokwium dostałem 10 na 13.

v 0.1 - wszystkie sekcje bez 'Bibliografi', 'O tym artykule' i 'Narzędzia i filtry'
v.0.2 - poprawione kilka literówek, dodano 'Narzędzie i filtry' oraz 'Bibliografię'
v.0.3 - zmiana tytułu, porządne zmiany w treści, zmiana formatowania, dalsza walka z literówkami, dodano 'O tym artykule'

# ! / b i n / b a s h

echo $1

date +%H:%M:%S

whoami

./skrypt parametr1 parametr2

# ! / b i n / b a s h

echo $0

./skrypt #[ENTER]

. / s k r y p t

TEKST="dupa"

LICZBA=666

PI=3.14

echo $TEKST

echo $LICZBA+$PI

JEDEN=222

DWA=444

echo $[ $JEDEN + $DWA ] #zwroci 666

echo $[ $JEDEN + 111 ] #zwroci 333

WYNIK=$[ JEDEN + DWA ]

JEDEN="du"

DWA="mny"

TRZY="pa"

CZTERY="n"

PIEC=666

echo $JEDEN$DWA $TRZY$CZTERY #dumny pan

echo $JEDEN$TRZY #dupa

echo $JEDEN- $PIEC- $TRZY! #du- 666- p a !

JEDEN="du"

PIEC=666

echo $JEDEN_$PIEC # niepoprawnie - Bash bedzie szukal zmiennej $JEDEN_ (a takiej nie ma)

echo $JEDEN\_$PIEC #poprawnie - wypisze: du_666

JEDEN = 123 #zle - nie moze byc spacji pomiedzy znakiem =

DWA=23 #dobrze

# ! / b i n / s h

echo Wpisz tekst:

read TEST
echo Napisałeś:
echo $TEST

# ! / b i n / s h

I F [ $ # - le 2] ; THEN
e c h o " M n i e j n iż 3 parametry"
ELSE
echo "3 parametry albo nawet więc e j "
F I

# ! / b i n / s h

IF (($# < 2)); THEN

e c h o " m n i e j n i z 2 "

E L I F ( ( $ # > 2 ) ) ; t h e n

e c h o " w i e c e j n i z 2 "

ELSE

echo "dwa"

F I

# ! / b i n / s h

I F [ $ # - l t 2 ] ; T H E N

e c h o " m n i e j n i z 2 "

E L I F [ $ # - g t 2 ] ; t h e n

e c h o " w i e c e j n i z 2 "

ELSE

echo "dwa"

F I

# ! / b i n / s h

CASE $1 IN

dupa) echo "Ale brzydko napisales" ;;

1 ) e c h o " U c z e n b e z j e d y n k i t o j a k z o l n i e r z b e z k a r a b i n u " ; ;
*) echo Napisałeś $1 ; ;
ESAC

# ! / b i n / s h

FOR uczelnie IN agh uj pk ar ap ae ; DO

echo $uczelnie

done

# ! / b i n / s h

i = 0 ;

w h i l e [ $ i - l e 1 0 ] ; d o

i = $ [ i + 1 ] ; # i n k r e m e n t u j e m y l i c z n i k

echo $i

done

# ! / b i n / s h

$JEDEN="whoami"

echo "$JEDEN"

echo '$JEDEN'

echo `$JEDEN`

. / s k r y p t

whoami

$JEDEN

kdzwinel

./skrypt "Akademia Górniczo Hutnicza"

# ! / b i n / s h

f u n c t ( )

{

echo "dupa"

}

funct #wywolanie

# ! / b i n / s h

f u n c t ( )

{

echo $1

}

funct "dupa" #wywolanie

# ! / b i n / s h

i f [ $ # - e q 2 ]

then

echo "wysztko ok"

e x i t 0

e l s e

echo "zla ilosc parametrow"

e x i t 1

f i

l s | g r e p o g g

oggy_and_bruno.html

moj_song.ogg

E l v i s . o g g

w h o | c u t - d ' ' - f 1

kdzwinel

mjackson

epresley

w h o | s o r t

asper

bejo

dcm

d m e s g | t a i l

EXT3- fs: mounted filesystem with ordered data mode.

FAT: bogus number of reserved sectors

VFS: Can't find a valid FAT filesystem on dev hdb1.

basename /home/konrad/Downloads/firefox/config.conf

c o n f i g . c o n f

dirname /home/konrad/Downloads/firefox/config.conf

/home/konrad/Downloads/firefox

find /home - name elvis.ogg

/home/konrad/muzik/elvis/elvis.ogg

/home/marta/elvis.ogg

background image

"A dzisiaj... dzisiaj się nauczę Basha"

- czyli szybki kurs.

Konrad Dzwinel
v. 0.3 ( 26-05-2006 )

Spis rzeczy:


Skrypty
- z czym to się je?
- zmienne i operacje na zmiennych
- warunki
- pętle
- cytowanie
- funkcje
- wartosc zwracana
- narzędzia i filtry
Bibliografia
O tym artykule

Skrypty

Skrypty - z czym to się je?

Skrypty to, krótko mówiąc, programy czytane przez interpreter linijka po linijce, nie wymagające kompilacji. Skrypty pisze się szybko, skrypty są krótkie, skrypty 
ułatwiają życie.

Jak utworzyć sobie skrypt?


A jak taki skrypt odpalić?


A teraz pokrótce jak napisać skrypt:
Po pierwsze potrzebujemy programu który wykona nasz skrypt (interpreter). Dlatego też, w pierwszej linijce musimy go wskazać, w dzisiejszych czasach będzie to:

Czyli podstatwowa powłoka systemu. Dodam jeszcze, że wszystko napisane po '#' do końca linii jest komentarzem.
Czas już najwyższy na przykład, który omówimy step-by-step:

t o u c h s k r y p t / / t w o r z y m y p u s t y p l i k
chmod +x skrypt //dodajemy możl i w ość wykonania (+x) do pliku

. /s k r y p t

# ! / b i n / b a s h

"Napisz program który wypisze słowo podane w parametrze, obecny czas oraz nazwę użytkownika uruchamiaj ącego skrypt"

Linia pierwsza (przy cichym typowym dla informatyków założeniu, ze numerujemy od 0) zwraca nam pierwszy parametr jaki dostal skrypt ("$1"). Druga linia to
odpowiednio sformatowana data (godzina:minuta:sekunda). Trzecia linia to whoami - czyli "kim jestem" -polecenie które zwaraca nazwę zalogowanego usera.

Co to znaczy że skrypt dostał parametr? No np.

Skoro pierwszy parametr ukrywa się pod zmienną $1 to łatwo jest się domyślić, że reszta parametrów jest trzymana w zmiennych: $2, $3 itd. Jeżeli parametr nie
istnieje to pod daną zmienną nic nie ma. A co jest w $0? Ano w $0 jest nazwa skryptu (i sposób jego wywołania). Czyli np.

Da nam:

Jakie są jeszcze inne przydatne zmienne 'wbudowane'?
$* - wypisze wszystkie parametry naraz
$$ - zwróci numer procesu (PID)
$# - zwróci ilość podanych parametrów

Zmienne i operacje na zmiennych

Pada pytanie, jak działają w ogóle zmienne w tych skryptach? Otóż wygląda to tak:
Deklaracja/przypisanie:

Wywołanie:

No i fajnie jest, ale co poniektórzy zauważą że $LICZBA+$PI nie da nam "669.14" lecz "666+3.14". Króko mówiąc bash preferuje stringi. Słabo mu idzie liczenie,
zaokrangla, składania obliczeń arytmetycznych jest mało przyjazna. Ale to tylko dlatego, że takie operacje nie są w praktyce prawie w ogóle potrzebne. Ale jezeli już 
trzeba... :

Jak widać, mało przyjaźnie. W ostatniej linijce jak łatwo się domyślić pod zmienną WYNIK została przypisana liczba 666. Rozpoznawane operacje arytmetyczne to:
+, -, *, /
** - potęgowanie
% - modulo
++ - pre i post inkrementacia / dekrementacja
+=, -=, /= *=
i operacje logiczne
Należy pamietać o tym, że bash nie wykona niczego na liczbach zmiennoprzecinkowych (potraktuje je jako tekst).
Kto nie bawił się wcześniej językami w stylu php, tego może dziwić, że bashowi wszystko jedno czy pod zmeinną jest string czy liczba. Wbrew pozorom jest to bardzo
wygodne. Można kleić ze sobą wyrazy, zmienne tekstowe i liczbowe bez żadnych konwersji/rzutowań.

Niektóre symbole (jak np '_') moga być wykorzystane w nazwie wiec trzeba na nie uwazac. Jezeli koniecznie chcemy je wypisac to tradycyjnie stostujemy \
(backslash).


UWAGA! Przypomniało mi się. Popularny bład:


Mało popularna, ale niekiedy przydatna jest możliwość pobrania danych od użytkownika już w trakcie działania skryptu (a nie jako parametr).

Warunki

Zacznijmy od if..then..elsa. Moim skromnym zdaniem składnia nie jest zbyt przyjazna. Jednak (jak się za chwile okaże) daje duże mozliwości.Przykład:

Słowa kluczowe pisałem dużymi literami, taki kod raczej nie zadziała, ale jak narazie dla poprawienia czytelności tak bede pisal (z czasem mi się znudzi). Teraz
śmieszna rzecz: warto zauważyć że polecenie IF jest zakończone swoją odwrotnąścią FI. Podobnie jest z kilkoma innymi poleceniami blokowymi. Druga rzecz, dziwne
porównywanie. Oj dziwne - uważajcie na spacje, nawiasy i średniki które muszą być tak jak to jest w kodzie powyżej. Samo porównanie to '-le' znaczy 'less or
equal' - mniejszy lub równy. Zaraz sobie wypiszemy część możliwości porównywania. Jak widzimy ilość argumentów ($#) jest porównywana z liczbą 2 i na podstawie
wyniku mogą zostać wypisane dwa rózne teksty. Możliwe jest oczywiście pominięcie kawałka z ELSE albo dodanie (ile chcemy) ELIF [ warunek ]; THEN.

Krótko o dostępnych warunkach:
Inty można porównywać na dwa sposoby:
standardowo = (albo == - tutaj to jest to samo), !=, < , >, <=, >= używając takiego zapisu

albo mniej standardowo(odpowiednio do tych na górze): -eq, -ne, -lt, -gt, -le, -ge używając takiego zapisu:


Do stringów mamy: = (i == - tutaj to samo), !=,. <, >, -z (czy jest NULLem), -n (czy nie jest NULLem)
Z plikami można robić mi. -e (sprawdza czy dany plik istnieje)

Mamy jeszcze CASEa działa to tak:

To taki switch (jak w ansi c) w którym za zmienną brany jest pierwszy argument skryptu (w tym wypadku oczywiście). $1 jest prównywane z 'dupa' oraz '1' a jeżeli
wszystko zawiedzie to wykonywana jest czynność domyślna *). Proszę zwrócić uwagę na ;; - podwójne średniki!

Pętle

Mamy dwie (trochę kłamię, ale innych w życiu nie użyłem): for'a i while'a. For jest bardzo fajny bo można iterować po wszyskim.

Jak widać pod zmienną uczelnie są podstawiane kolejne nazwy z listy. Mogą to być również pliki z folderu, albo kolejni użytkownicy z listy itd. Pętle liczbową łatwiej
zrobić while'm:

Widać, że warunki są tworzone identycznie jak w IFie. Reszta jest chyba oczywista. Można pomijać ten średnik po warunku ( ten przed 'do') jeżeli 'do' napiszemy w
nowej linii. Średnik zachowuje się tak samo jak koniec linii.

Cytowanie

Mamy trzy rodzaje cytowania: "jedno", 'drugie' i `trzecie`. Czym się różnią pokazuje poniższy skrypt:

" - działa tak że wypisuje wszystko ze środka interpretując zmienne
' - nie interpretuje zmiennych, porpostu wypisuje wszystko jako zwykły tekst
` - interpretuje zmienne i uruchamia polecenia zawarte w tekście ( teks po poleceniu zostanie potraktowany jako parametr)
Cytowanie przydaje się mi. wtedy gdy chcemy przekazać poleceniu parametr skłądający się z dwóch (lub więcej) wyrazów np

bez cytowania każde słowo zostało by potraktowane jako oddzielna zmienna.

Funkcje

Funkcje tworzymy np. na sposób znany z c:

Funkcje nigdy nic nie zwracają i nigdy nie mają określonych pomiedzy '(' a ')' parametrów jakie przyjmują. Jeżeli już koniecznie chcemy coś przekazać to wewnątrz
funkcji działają $1 $2 itd, czyli funkcja zachowuje się jak 'skrypt w skrypcie'.

Funkcje mogą być deklarowane 'gdziebądź', ale są rozpoznawalne tylko w kodzie poniżej deklaracji.

Warotść zwracana

Porpawnie zakończona funkcja powinna zwracać 0. Inne liczby moga być trakowane jako numer błędu. A więc:

Narzędzi i filtry

Co warto umieć obsługiwać:

GREP
Ten mały programik pozwala nam wyszukiwać wzorzec w tekście. Czyli np.

Faniejsze opcje:
-c tylko zlicza wystąpienia wzorca (ilość linii), nie wypisuje ich na konsole
-v wypisuje linie w których wzorzec NIE występuje

CUT
Cut wycina nam interesujący nas fragment tekstu. Czyli głównie chodzi o kolumnę. Np jak mamy listę użytkowników (polecenie who albo finger) to możemy wyciąć 
np. tylko kolumnę z loginami.

Co robią powyższe flagi:
-d Znaczek ktory oddziela kolumny od siebie. W przykladzie powyzej jest to spacja (' '). Domyslnie jest to tabulator.
-f ktore kolumny chcemy wyciac (to moze być lista po przecinku).

SORT
Sort jak sama nazwa wskazuje wykonuje sortowanie. Możemy sobie np. alfabetycznie posortować zalogowanych użytkowników:

Faniejsze flagi
-u Zrobi to samo co programik uniq - usunie powtarzajace sie linie - tzn. nie wyswietli ich.
-r odwróci sortowanie (postortuje z-a zamiast a-z).

TAIL i HEAD
Dwa programiki zwracające kilka ostatnich (tail) bądź pierwszych (head) linii wrzuconych na standardowe wejście. Czyli np. jeżeli chcemy przejrzeć co się ostanio
działo w logu systemowym:

Oba programiki nie mają jakiś specjalnie fascynujących opcji. Najbardziej popularna to chyba
-n Która poprostu zmienia standardową ilość wyświetlanych linii (10) na podaną przez usera.

BASENAME DIRNAME
Basename wycina nam tylko ostatni człon w ścieżce dostępu. Czyli np:

Dirname robi coś innego, ale w podobnym stylu. Ze ścieżki usuwa plik, pozostawiając samą ścierzkę do katalogu w którym się on znajduje. Przykładzik:


FIND
A to już potężne narzędzie. Omówię tylko podstawowe funkcje. Przykład podstawowego użycia:

Pierwsze co się podaje po 'find' to ścieżka gdzie plik ma być szukany. A teraz flagi:
-name tutaj podajemy plik jakiego szukamy (mozna używać * i ?)
-ctime n gdzie n to liczba. Szuka plików modyfikowanych przez ostatnie n*24 godziny.
-perm 777 szuka pliku o zadanym dostępie (tutaj jako przykład 777).
-user kdzwinel szuka plików podanego usera (tutaj kdzwinel)

INNE
A to lista prostych programików które mogą przydać się w skryptach:
uname -a   Podstawowa informacja o systemie
uptime   Czas pracy systemu
file plik   Wyświetla dane o pliku 'plik'

Biblografia

http://home.agh.edu.pl/~gjn/dydaktyka/UGLX/node5.html

http://zeisk.tech.us.edu.pl/ogloszenia/romanek/index.htm

O tym artykule

Tekst początkowo miał status "repetytorium przedkolosowego". Jednak doszedłem do wniosku, że potrzebuję zasilić czymś swoją stronę www i po odpowiednich
modyfikacjach nazwałem go 'artykułem' i dodałem do strony. Z kolokwium dostałem 10 na 13.

v 0.1 - wszystkie sekcje bez 'Bibliografi', 'O tym artykule' i 'Narzędzia i filtry'
v.0.2 - poprawione kilka literówek, dodano 'Narzędzie i filtry' oraz 'Bibliografię'
v.0.3 - zmiana tytułu, porządne zmiany w treści, zmiana formatowania, dalsza walka z literówkami, dodano 'O tym artykule'

# ! / b i n / b a s h

echo $1

date +%H:%M:%S

whoami

./skrypt parametr1 parametr2

# ! / b i n / b a s h

echo $0

./skrypt #[ENTER]

. / s k r y p t

TEKST="dupa"

LICZBA=666

PI=3.14

echo $TEKST

echo $LICZBA+$PI

JEDEN=222

DWA=444

echo $[ $JEDEN + $DWA ] #zwroci 666

echo $[ $JEDEN + 111 ] #zwroci 333

WYNIK=$[ JEDEN + DWA ]

JEDEN="du"

DWA="mny"

TRZY="pa"

CZTERY="n"

PIEC=666

echo $JEDEN$DWA $TRZY$CZTERY #dumny pan

echo $JEDEN$TRZY #dupa

echo $JEDEN- $PIEC- $TRZY! #du- 666- p a !

JEDEN="du"

PIEC=666

echo $JEDEN_$PIEC # niepoprawnie - Bash bedzie szukal zmiennej $JEDEN_ (a takiej nie ma)

echo $JEDEN\_$PIEC #poprawnie - wypisze: du_666

JEDEN = 123 #zle - nie moze byc spacji pomiedzy znakiem =

DWA=23 #dobrze

# ! / b i n / s h

echo Wpisz tekst:

read TEST
echo Napisałeś:
echo $TEST

# ! / b i n / s h

I F [ $ # - le 2] ; THEN
e c h o " M n i e j n iż 3 parametry"
ELSE
echo "3 parametry albo nawet więc e j "
F I

# ! / b i n / s h

IF (($# < 2)); THEN

e c h o " m n i e j n i z 2 "

E L I F ( ( $ # > 2 ) ) ; t h e n

e c h o " w i e c e j n i z 2 "

ELSE

echo "dwa"

F I

# ! / b i n / s h

I F [ $ # - l t 2 ] ; T H E N

e c h o " m n i e j n i z 2 "

E L I F [ $ # - g t 2 ] ; t h e n

e c h o " w i e c e j n i z 2 "

ELSE

echo "dwa"

F I

# ! / b i n / s h

CASE $1 IN

dupa) echo "Ale brzydko napisales" ;;

1 ) e c h o " U c z e n b e z j e d y n k i t o j a k z o l n i e r z b e z k a r a b i n u " ; ;
*) echo Napisałeś $1 ; ;
ESAC

# ! / b i n / s h

FOR uczelnie IN agh uj pk ar ap ae ; DO

echo $uczelnie

done

# ! / b i n / s h

i = 0 ;

w h i l e [ $ i - l e 1 0 ] ; d o

i = $ [ i + 1 ] ; # i n k r e m e n t u j e m y l i c z n i k

echo $i

done

# ! / b i n / s h

$JEDEN="whoami"

echo "$JEDEN"

echo '$JEDEN'

echo `$JEDEN`

. / s k r y p t

whoami

$JEDEN

kdzwinel

./skrypt "Akademia Górniczo Hutnicza"

# ! / b i n / s h

f u n c t ( )

{

echo "dupa"

}

funct #wywolanie

# ! / b i n / s h

f u n c t ( )

{

echo $1

}

funct "dupa" #wywolanie

# ! / b i n / s h

i f [ $ # - e q 2 ]

then

echo "wysztko ok"

e x i t 0

e l s e

echo "zla ilosc parametrow"

e x i t 1

f i

l s | g r e p o g g

oggy_and_bruno.html

moj_song.ogg

E l v i s . o g g

w h o | c u t - d ' ' - f 1

kdzwinel

mjackson

epresley

w h o | s o r t

asper

bejo

dcm

d m e s g | t a i l

EXT3- fs: mounted filesystem with ordered data mode.

FAT: bogus number of reserved sectors

VFS: Can't find a valid FAT filesystem on dev hdb1.

basename /home/konrad/Downloads/firefox/config.conf

c o n f i g . c o n f

dirname /home/konrad/Downloads/firefox/config.conf

/home/konrad/Downloads/firefox

find /home - name elvis.ogg

/home/konrad/muzik/elvis/elvis.ogg

/home/marta/elvis.ogg

background image

"A dzisiaj... dzisiaj się nauczę Basha"

- czyli szybki kurs.

Konrad Dzwinel
v. 0.3 ( 26-05-2006 )

Spis rzeczy:


Skrypty
- z czym to się je?
- zmienne i operacje na zmiennych
- warunki
- pętle
- cytowanie
- funkcje
- wartosc zwracana
- narzędzia i filtry
Bibliografia
O tym artykule

Skrypty

Skrypty - z czym to się je?

Skrypty to, krótko mówiąc, programy czytane przez interpreter linijka po linijce, nie wymagające kompilacji. Skrypty pisze się szybko, skrypty są krótkie, skrypty 
ułatwiają życie.

Jak utworzyć sobie skrypt?


A jak taki skrypt odpalić?


A teraz pokrótce jak napisać skrypt:
Po pierwsze potrzebujemy programu który wykona nasz skrypt (interpreter). Dlatego też, w pierwszej linijce musimy go wskazać, w dzisiejszych czasach będzie to:

Czyli podstatwowa powłoka systemu. Dodam jeszcze, że wszystko napisane po '#' do końca linii jest komentarzem.
Czas już najwyższy na przykład, który omówimy step-by-step:

t o u c h s k r y p t / / t w o r z y m y p u s t y p l i k
chmod +x skrypt //dodajemy możl i w ość wykonania (+x) do pliku

. /s k r y p t

# ! / b i n / b a s h

"Napisz program który wypisze słowo podane w parametrze, obecny czas oraz nazwę użytkownika uruchamiaj ącego skrypt"

Linia pierwsza (przy cichym typowym dla informatyków założeniu, ze numerujemy od 0) zwraca nam pierwszy parametr jaki dostal skrypt ("$1"). Druga linia to
odpowiednio sformatowana data (godzina:minuta:sekunda). Trzecia linia to whoami - czyli "kim jestem" -polecenie które zwaraca nazwę zalogowanego usera.

Co to znaczy że skrypt dostał parametr? No np.

Skoro pierwszy parametr ukrywa się pod zmienną $1 to łatwo jest się domyślić, że reszta parametrów jest trzymana w zmiennych: $2, $3 itd. Jeżeli parametr nie
istnieje to pod daną zmienną nic nie ma. A co jest w $0? Ano w $0 jest nazwa skryptu (i sposób jego wywołania). Czyli np.

Da nam:

Jakie są jeszcze inne przydatne zmienne 'wbudowane'?
$* - wypisze wszystkie parametry naraz
$$ - zwróci numer procesu (PID)
$# - zwróci ilość podanych parametrów

Zmienne i operacje na zmiennych

Pada pytanie, jak działają w ogóle zmienne w tych skryptach? Otóż wygląda to tak:
Deklaracja/przypisanie:

Wywołanie:

No i fajnie jest, ale co poniektórzy zauważą że $LICZBA+$PI nie da nam "669.14" lecz "666+3.14". Króko mówiąc bash preferuje stringi. Słabo mu idzie liczenie,
zaokrangla, składania obliczeń arytmetycznych jest mało przyjazna. Ale to tylko dlatego, że takie operacje nie są w praktyce prawie w ogóle potrzebne. Ale jezeli już 
trzeba... :

Jak widać, mało przyjaźnie. W ostatniej linijce jak łatwo się domyślić pod zmienną WYNIK została przypisana liczba 666. Rozpoznawane operacje arytmetyczne to:
+, -, *, /
** - potęgowanie
% - modulo
++ - pre i post inkrementacia / dekrementacja
+=, -=, /= *=
i operacje logiczne
Należy pamietać o tym, że bash nie wykona niczego na liczbach zmiennoprzecinkowych (potraktuje je jako tekst).
Kto nie bawił się wcześniej językami w stylu php, tego może dziwić, że bashowi wszystko jedno czy pod zmeinną jest string czy liczba. Wbrew pozorom jest to bardzo
wygodne. Można kleić ze sobą wyrazy, zmienne tekstowe i liczbowe bez żadnych konwersji/rzutowań.

Niektóre symbole (jak np '_') moga być wykorzystane w nazwie wiec trzeba na nie uwazac. Jezeli koniecznie chcemy je wypisac to tradycyjnie stostujemy \
(backslash).


UWAGA! Przypomniało mi się. Popularny bład:


Mało popularna, ale niekiedy przydatna jest możliwość pobrania danych od użytkownika już w trakcie działania skryptu (a nie jako parametr).

Warunki

Zacznijmy od if..then..elsa. Moim skromnym zdaniem składnia nie jest zbyt przyjazna. Jednak (jak się za chwile okaże) daje duże mozliwości.Przykład:

Słowa kluczowe pisałem dużymi literami, taki kod raczej nie zadziała, ale jak narazie dla poprawienia czytelności tak bede pisal (z czasem mi się znudzi). Teraz
śmieszna rzecz: warto zauważyć że polecenie IF jest zakończone swoją odwrotnąścią FI. Podobnie jest z kilkoma innymi poleceniami blokowymi. Druga rzecz, dziwne
porównywanie. Oj dziwne - uważajcie na spacje, nawiasy i średniki które muszą być tak jak to jest w kodzie powyżej. Samo porównanie to '-le' znaczy 'less or
equal' - mniejszy lub równy. Zaraz sobie wypiszemy część możliwości porównywania. Jak widzimy ilość argumentów ($#) jest porównywana z liczbą 2 i na podstawie
wyniku mogą zostać wypisane dwa rózne teksty. Możliwe jest oczywiście pominięcie kawałka z ELSE albo dodanie (ile chcemy) ELIF [ warunek ]; THEN.

Krótko o dostępnych warunkach:
Inty można porównywać na dwa sposoby:
standardowo = (albo == - tutaj to jest to samo), !=, < , >, <=, >= używając takiego zapisu

albo mniej standardowo(odpowiednio do tych na górze): -eq, -ne, -lt, -gt, -le, -ge używając takiego zapisu:


Do stringów mamy: = (i == - tutaj to samo), !=,. <, >, -z (czy jest NULLem), -n (czy nie jest NULLem)
Z plikami można robić mi. -e (sprawdza czy dany plik istnieje)

Mamy jeszcze CASEa działa to tak:

To taki switch (jak w ansi c) w którym za zmienną brany jest pierwszy argument skryptu (w tym wypadku oczywiście). $1 jest prównywane z 'dupa' oraz '1' a jeżeli
wszystko zawiedzie to wykonywana jest czynność domyślna *). Proszę zwrócić uwagę na ;; - podwójne średniki!

Pętle

Mamy dwie (trochę kłamię, ale innych w życiu nie użyłem): for'a i while'a. For jest bardzo fajny bo można iterować po wszyskim.

Jak widać pod zmienną uczelnie są podstawiane kolejne nazwy z listy. Mogą to być również pliki z folderu, albo kolejni użytkownicy z listy itd. Pętle liczbową łatwiej
zrobić while'm:

Widać, że warunki są tworzone identycznie jak w IFie. Reszta jest chyba oczywista. Można pomijać ten średnik po warunku ( ten przed 'do') jeżeli 'do' napiszemy w
nowej linii. Średnik zachowuje się tak samo jak koniec linii.

Cytowanie

Mamy trzy rodzaje cytowania: "jedno", 'drugie' i `trzecie`. Czym się różnią pokazuje poniższy skrypt:

" - działa tak że wypisuje wszystko ze środka interpretując zmienne
' - nie interpretuje zmiennych, porpostu wypisuje wszystko jako zwykły tekst
` - interpretuje zmienne i uruchamia polecenia zawarte w tekście ( teks po poleceniu zostanie potraktowany jako parametr)
Cytowanie przydaje się mi. wtedy gdy chcemy przekazać poleceniu parametr skłądający się z dwóch (lub więcej) wyrazów np

bez cytowania każde słowo zostało by potraktowane jako oddzielna zmienna.

Funkcje

Funkcje tworzymy np. na sposób znany z c:

Funkcje nigdy nic nie zwracają i nigdy nie mają określonych pomiedzy '(' a ')' parametrów jakie przyjmują. Jeżeli już koniecznie chcemy coś przekazać to wewnątrz
funkcji działają $1 $2 itd, czyli funkcja zachowuje się jak 'skrypt w skrypcie'.

Funkcje mogą być deklarowane 'gdziebądź', ale są rozpoznawalne tylko w kodzie poniżej deklaracji.

Warotść zwracana

Porpawnie zakończona funkcja powinna zwracać 0. Inne liczby moga być trakowane jako numer błędu. A więc:

Narzędzi i filtry

Co warto umieć obsługiwać:

GREP
Ten mały programik pozwala nam wyszukiwać wzorzec w tekście. Czyli np.

Faniejsze opcje:
-c tylko zlicza wystąpienia wzorca (ilość linii), nie wypisuje ich na konsole
-v wypisuje linie w których wzorzec NIE występuje

CUT
Cut wycina nam interesujący nas fragment tekstu. Czyli głównie chodzi o kolumnę. Np jak mamy listę użytkowników (polecenie who albo finger) to możemy wyciąć 
np. tylko kolumnę z loginami.

Co robią powyższe flagi:
-d Znaczek ktory oddziela kolumny od siebie. W przykladzie powyzej jest to spacja (' '). Domyslnie jest to tabulator.
-f ktore kolumny chcemy wyciac (to moze być lista po przecinku).

SORT
Sort jak sama nazwa wskazuje wykonuje sortowanie. Możemy sobie np. alfabetycznie posortować zalogowanych użytkowników:

Faniejsze flagi
-u Zrobi to samo co programik uniq - usunie powtarzajace sie linie - tzn. nie wyswietli ich.
-r odwróci sortowanie (postortuje z-a zamiast a-z).

TAIL i HEAD
Dwa programiki zwracające kilka ostatnich (tail) bądź pierwszych (head) linii wrzuconych na standardowe wejście. Czyli np. jeżeli chcemy przejrzeć co się ostanio
działo w logu systemowym:

Oba programiki nie mają jakiś specjalnie fascynujących opcji. Najbardziej popularna to chyba
-n Która poprostu zmienia standardową ilość wyświetlanych linii (10) na podaną przez usera.

BASENAME DIRNAME
Basename wycina nam tylko ostatni człon w ścieżce dostępu. Czyli np:

Dirname robi coś innego, ale w podobnym stylu. Ze ścieżki usuwa plik, pozostawiając samą ścierzkę do katalogu w którym się on znajduje. Przykładzik:


FIND
A to już potężne narzędzie. Omówię tylko podstawowe funkcje. Przykład podstawowego użycia:

Pierwsze co się podaje po 'find' to ścieżka gdzie plik ma być szukany. A teraz flagi:
-name tutaj podajemy plik jakiego szukamy (mozna używać * i ?)
-ctime n gdzie n to liczba. Szuka plików modyfikowanych przez ostatnie n*24 godziny.
-perm 777 szuka pliku o zadanym dostępie (tutaj jako przykład 777).
-user kdzwinel szuka plików podanego usera (tutaj kdzwinel)

INNE
A to lista prostych programików które mogą przydać się w skryptach:
uname -a   Podstawowa informacja o systemie
uptime   Czas pracy systemu
file plik   Wyświetla dane o pliku 'plik'

Biblografia

http://home.agh.edu.pl/~gjn/dydaktyka/UGLX/node5.html

http://zeisk.tech.us.edu.pl/ogloszenia/romanek/index.htm

O tym artykule

Tekst początkowo miał status "repetytorium przedkolosowego". Jednak doszedłem do wniosku, że potrzebuję zasilić czymś swoją stronę www i po odpowiednich
modyfikacjach nazwałem go 'artykułem' i dodałem do strony. Z kolokwium dostałem 10 na 13.

v 0.1 - wszystkie sekcje bez 'Bibliografi', 'O tym artykule' i 'Narzędzia i filtry'
v.0.2 - poprawione kilka literówek, dodano 'Narzędzie i filtry' oraz 'Bibliografię'
v.0.3 - zmiana tytułu, porządne zmiany w treści, zmiana formatowania, dalsza walka z literówkami, dodano 'O tym artykule'

# ! / b i n / b a s h

echo $1

date +%H:%M:%S

whoami

./skrypt parametr1 parametr2

# ! / b i n / b a s h

echo $0

./skrypt #[ENTER]

. / s k r y p t

TEKST="dupa"

LICZBA=666

PI=3.14

echo $TEKST

echo $LICZBA+$PI

JEDEN=222

DWA=444

echo $[ $JEDEN + $DWA ] #zwroci 666

echo $[ $JEDEN + 111 ] #zwroci 333

WYNIK=$[ JEDEN + DWA ]

JEDEN="du"

DWA="mny"

TRZY="pa"

CZTERY="n"

PIEC=666

echo $JEDEN$DWA $TRZY$CZTERY #dumny pan

echo $JEDEN$TRZY #dupa

echo $JEDEN- $PIEC- $TRZY! #du- 666- p a !

JEDEN="du"

PIEC=666

echo $JEDEN_$PIEC # niepoprawnie - Bash bedzie szukal zmiennej $JEDEN_ (a takiej nie ma)

echo $JEDEN\_$PIEC #poprawnie - wypisze: du_666

JEDEN = 123 #zle - nie moze byc spacji pomiedzy znakiem =

DWA=23 #dobrze

# ! / b i n / s h

echo Wpisz tekst:

read TEST
echo Napisałeś:
echo $TEST

# ! / b i n / s h

I F [ $ # - le 2] ; THEN
e c h o " M n i e j n iż 3 parametry"
ELSE
echo "3 parametry albo nawet więc e j "
F I

# ! / b i n / s h

IF (($# < 2)); THEN

e c h o " m n i e j n i z 2 "

E L I F ( ( $ # > 2 ) ) ; t h e n

e c h o " w i e c e j n i z 2 "

ELSE

echo "dwa"

F I

# ! / b i n / s h

I F [ $ # - l t 2 ] ; T H E N

e c h o " m n i e j n i z 2 "

E L I F [ $ # - g t 2 ] ; t h e n

e c h o " w i e c e j n i z 2 "

ELSE

echo "dwa"

F I

# ! / b i n / s h

CASE $1 IN

dupa) echo "Ale brzydko napisales" ;;

1 ) e c h o " U c z e n b e z j e d y n k i t o j a k z o l n i e r z b e z k a r a b i n u " ; ;
*) echo Napisałeś $1 ; ;
ESAC

# ! / b i n / s h

FOR uczelnie IN agh uj pk ar ap ae ; DO

echo $uczelnie

done

# ! / b i n / s h

i = 0 ;

w h i l e [ $ i - l e 1 0 ] ; d o

i = $ [ i + 1 ] ; # i n k r e m e n t u j e m y l i c z n i k

echo $i

done

# ! / b i n / s h

$JEDEN="whoami"

echo "$JEDEN"

echo '$JEDEN'

echo `$JEDEN`

. / s k r y p t

whoami

$JEDEN

kdzwinel

./skrypt "Akademia Górniczo Hutnicza"

# ! / b i n / s h

f u n c t ( )

{

echo "dupa"

}

funct #wywolanie

# ! / b i n / s h

f u n c t ( )

{

echo $1

}

funct "dupa" #wywolanie

# ! / b i n / s h

i f [ $ # - e q 2 ]

then

echo "wysztko ok"

e x i t 0

e l s e

echo "zla ilosc parametrow"

e x i t 1

f i

l s | g r e p o g g

oggy_and_bruno.html

moj_song.ogg

E l v i s . o g g

w h o | c u t - d ' ' - f 1

kdzwinel

mjackson

epresley

w h o | s o r t

asper

bejo

dcm

d m e s g | t a i l

EXT3- fs: mounted filesystem with ordered data mode.

FAT: bogus number of reserved sectors

VFS: Can't find a valid FAT filesystem on dev hdb1.

basename /home/konrad/Downloads/firefox/config.conf

c o n f i g . c o n f

dirname /home/konrad/Downloads/firefox/config.conf

/home/konrad/Downloads/firefox

find /home - name elvis.ogg

/home/konrad/muzik/elvis/elvis.ogg

/home/marta/elvis.ogg

background image

"A dzisiaj... dzisiaj się nauczę Basha"

- czyli szybki kurs.

Konrad Dzwinel
v. 0.3 ( 26-05-2006 )

Spis rzeczy:


Skrypty
- z czym to się je?
- zmienne i operacje na zmiennych
- warunki
- pętle
- cytowanie
- funkcje
- wartosc zwracana
- narzędzia i filtry
Bibliografia
O tym artykule

Skrypty

Skrypty - z czym to się je?

Skrypty to, krótko mówiąc, programy czytane przez interpreter linijka po linijce, nie wymagające kompilacji. Skrypty pisze się szybko, skrypty są krótkie, skrypty 
ułatwiają życie.

Jak utworzyć sobie skrypt?


A jak taki skrypt odpalić?


A teraz pokrótce jak napisać skrypt:
Po pierwsze potrzebujemy programu który wykona nasz skrypt (interpreter). Dlatego też, w pierwszej linijce musimy go wskazać, w dzisiejszych czasach będzie to:

Czyli podstatwowa powłoka systemu. Dodam jeszcze, że wszystko napisane po '#' do końca linii jest komentarzem.
Czas już najwyższy na przykład, który omówimy step-by-step:

t o u c h s k r y p t / / t w o r z y m y p u s t y p l i k
chmod +x skrypt //dodajemy możl i w ość wykonania (+x) do pliku

. /s k r y p t

# ! / b i n / b a s h

"Napisz program który wypisze słowo podane w parametrze, obecny czas oraz nazwę użytkownika uruchamiaj ącego skrypt"

Linia pierwsza (przy cichym typowym dla informatyków założeniu, ze numerujemy od 0) zwraca nam pierwszy parametr jaki dostal skrypt ("$1"). Druga linia to
odpowiednio sformatowana data (godzina:minuta:sekunda). Trzecia linia to whoami - czyli "kim jestem" -polecenie które zwaraca nazwę zalogowanego usera.

Co to znaczy że skrypt dostał parametr? No np.

Skoro pierwszy parametr ukrywa się pod zmienną $1 to łatwo jest się domyślić, że reszta parametrów jest trzymana w zmiennych: $2, $3 itd. Jeżeli parametr nie
istnieje to pod daną zmienną nic nie ma. A co jest w $0? Ano w $0 jest nazwa skryptu (i sposób jego wywołania). Czyli np.

Da nam:

Jakie są jeszcze inne przydatne zmienne 'wbudowane'?
$* - wypisze wszystkie parametry naraz
$$ - zwróci numer procesu (PID)
$# - zwróci ilość podanych parametrów

Zmienne i operacje na zmiennych

Pada pytanie, jak działają w ogóle zmienne w tych skryptach? Otóż wygląda to tak:
Deklaracja/przypisanie:

Wywołanie:

No i fajnie jest, ale co poniektórzy zauważą że $LICZBA+$PI nie da nam "669.14" lecz "666+3.14". Króko mówiąc bash preferuje stringi. Słabo mu idzie liczenie,
zaokrangla, składania obliczeń arytmetycznych jest mało przyjazna. Ale to tylko dlatego, że takie operacje nie są w praktyce prawie w ogóle potrzebne. Ale jezeli już 
trzeba... :

Jak widać, mało przyjaźnie. W ostatniej linijce jak łatwo się domyślić pod zmienną WYNIK została przypisana liczba 666. Rozpoznawane operacje arytmetyczne to:
+, -, *, /
** - potęgowanie
% - modulo
++ - pre i post inkrementacia / dekrementacja
+=, -=, /= *=
i operacje logiczne
Należy pamietać o tym, że bash nie wykona niczego na liczbach zmiennoprzecinkowych (potraktuje je jako tekst).
Kto nie bawił się wcześniej językami w stylu php, tego może dziwić, że bashowi wszystko jedno czy pod zmeinną jest string czy liczba. Wbrew pozorom jest to bardzo
wygodne. Można kleić ze sobą wyrazy, zmienne tekstowe i liczbowe bez żadnych konwersji/rzutowań.

Niektóre symbole (jak np '_') moga być wykorzystane w nazwie wiec trzeba na nie uwazac. Jezeli koniecznie chcemy je wypisac to tradycyjnie stostujemy \
(backslash).


UWAGA! Przypomniało mi się. Popularny bład:


Mało popularna, ale niekiedy przydatna jest możliwość pobrania danych od użytkownika już w trakcie działania skryptu (a nie jako parametr).

Warunki

Zacznijmy od if..then..elsa. Moim skromnym zdaniem składnia nie jest zbyt przyjazna. Jednak (jak się za chwile okaże) daje duże mozliwości.Przykład:

Słowa kluczowe pisałem dużymi literami, taki kod raczej nie zadziała, ale jak narazie dla poprawienia czytelności tak bede pisal (z czasem mi się znudzi). Teraz
śmieszna rzecz: warto zauważyć że polecenie IF jest zakończone swoją odwrotnąścią FI. Podobnie jest z kilkoma innymi poleceniami blokowymi. Druga rzecz, dziwne
porównywanie. Oj dziwne - uważajcie na spacje, nawiasy i średniki które muszą być tak jak to jest w kodzie powyżej. Samo porównanie to '-le' znaczy 'less or
equal' - mniejszy lub równy. Zaraz sobie wypiszemy część możliwości porównywania. Jak widzimy ilość argumentów ($#) jest porównywana z liczbą 2 i na podstawie
wyniku mogą zostać wypisane dwa rózne teksty. Możliwe jest oczywiście pominięcie kawałka z ELSE albo dodanie (ile chcemy) ELIF [ warunek ]; THEN.

Krótko o dostępnych warunkach:
Inty można porównywać na dwa sposoby:
standardowo = (albo == - tutaj to jest to samo), !=, < , >, <=, >= używając takiego zapisu

albo mniej standardowo(odpowiednio do tych na górze): -eq, -ne, -lt, -gt, -le, -ge używając takiego zapisu:


Do stringów mamy: = (i == - tutaj to samo), !=,. <, >, -z (czy jest NULLem), -n (czy nie jest NULLem)
Z plikami można robić mi. -e (sprawdza czy dany plik istnieje)

Mamy jeszcze CASEa działa to tak:

To taki switch (jak w ansi c) w którym za zmienną brany jest pierwszy argument skryptu (w tym wypadku oczywiście). $1 jest prównywane z 'dupa' oraz '1' a jeżeli
wszystko zawiedzie to wykonywana jest czynność domyślna *). Proszę zwrócić uwagę na ;; - podwójne średniki!

Pętle

Mamy dwie (trochę kłamię, ale innych w życiu nie użyłem): for'a i while'a. For jest bardzo fajny bo można iterować po wszyskim.

Jak widać pod zmienną uczelnie są podstawiane kolejne nazwy z listy. Mogą to być również pliki z folderu, albo kolejni użytkownicy z listy itd. Pętle liczbową łatwiej
zrobić while'm:

Widać, że warunki są tworzone identycznie jak w IFie. Reszta jest chyba oczywista. Można pomijać ten średnik po warunku ( ten przed 'do') jeżeli 'do' napiszemy w
nowej linii. Średnik zachowuje się tak samo jak koniec linii.

Cytowanie

Mamy trzy rodzaje cytowania: "jedno", 'drugie' i `trzecie`. Czym się różnią pokazuje poniższy skrypt:

" - działa tak że wypisuje wszystko ze środka interpretując zmienne
' - nie interpretuje zmiennych, porpostu wypisuje wszystko jako zwykły tekst
` - interpretuje zmienne i uruchamia polecenia zawarte w tekście ( teks po poleceniu zostanie potraktowany jako parametr)
Cytowanie przydaje się mi. wtedy gdy chcemy przekazać poleceniu parametr skłądający się z dwóch (lub więcej) wyrazów np

bez cytowania każde słowo zostało by potraktowane jako oddzielna zmienna.

Funkcje

Funkcje tworzymy np. na sposób znany z c:

Funkcje nigdy nic nie zwracają i nigdy nie mają określonych pomiedzy '(' a ')' parametrów jakie przyjmują. Jeżeli już koniecznie chcemy coś przekazać to wewnątrz
funkcji działają $1 $2 itd, czyli funkcja zachowuje się jak 'skrypt w skrypcie'.

Funkcje mogą być deklarowane 'gdziebądź', ale są rozpoznawalne tylko w kodzie poniżej deklaracji.

Warotść zwracana

Porpawnie zakończona funkcja powinna zwracać 0. Inne liczby moga być trakowane jako numer błędu. A więc:

Narzędzi i filtry

Co warto umieć obsługiwać:

GREP
Ten mały programik pozwala nam wyszukiwać wzorzec w tekście. Czyli np.

Faniejsze opcje:
-c tylko zlicza wystąpienia wzorca (ilość linii), nie wypisuje ich na konsole
-v wypisuje linie w których wzorzec NIE występuje

CUT
Cut wycina nam interesujący nas fragment tekstu. Czyli głównie chodzi o kolumnę. Np jak mamy listę użytkowników (polecenie who albo finger) to możemy wyciąć 
np. tylko kolumnę z loginami.

Co robią powyższe flagi:
-d Znaczek ktory oddziela kolumny od siebie. W przykladzie powyzej jest to spacja (' '). Domyslnie jest to tabulator.
-f ktore kolumny chcemy wyciac (to moze być lista po przecinku).

SORT
Sort jak sama nazwa wskazuje wykonuje sortowanie. Możemy sobie np. alfabetycznie posortować zalogowanych użytkowników:

Faniejsze flagi
-u Zrobi to samo co programik uniq - usunie powtarzajace sie linie - tzn. nie wyswietli ich.
-r odwróci sortowanie (postortuje z-a zamiast a-z).

TAIL i HEAD
Dwa programiki zwracające kilka ostatnich (tail) bądź pierwszych (head) linii wrzuconych na standardowe wejście. Czyli np. jeżeli chcemy przejrzeć co się ostanio
działo w logu systemowym:

Oba programiki nie mają jakiś specjalnie fascynujących opcji. Najbardziej popularna to chyba
-n Która poprostu zmienia standardową ilość wyświetlanych linii (10) na podaną przez usera.

BASENAME DIRNAME
Basename wycina nam tylko ostatni człon w ścieżce dostępu. Czyli np:

Dirname robi coś innego, ale w podobnym stylu. Ze ścieżki usuwa plik, pozostawiając samą ścierzkę do katalogu w którym się on znajduje. Przykładzik:


FIND
A to już potężne narzędzie. Omówię tylko podstawowe funkcje. Przykład podstawowego użycia:

Pierwsze co się podaje po 'find' to ścieżka gdzie plik ma być szukany. A teraz flagi:
-name tutaj podajemy plik jakiego szukamy (mozna używać * i ?)
-ctime n gdzie n to liczba. Szuka plików modyfikowanych przez ostatnie n*24 godziny.
-perm 777 szuka pliku o zadanym dostępie (tutaj jako przykład 777).
-user kdzwinel szuka plików podanego usera (tutaj kdzwinel)

INNE
A to lista prostych programików które mogą przydać się w skryptach:
uname -a   Podstawowa informacja o systemie
uptime   Czas pracy systemu
file plik   Wyświetla dane o pliku 'plik'

Biblografia

http://home.agh.edu.pl/~gjn/dydaktyka/UGLX/node5.html

http://zeisk.tech.us.edu.pl/ogloszenia/romanek/index.htm

O tym artykule

Tekst początkowo miał status "repetytorium przedkolosowego". Jednak doszedłem do wniosku, że potrzebuję zasilić czymś swoją stronę www i po odpowiednich
modyfikacjach nazwałem go 'artykułem' i dodałem do strony. Z kolokwium dostałem 10 na 13.

v 0.1 - wszystkie sekcje bez 'Bibliografi', 'O tym artykule' i 'Narzędzia i filtry'
v.0.2 - poprawione kilka literówek, dodano 'Narzędzie i filtry' oraz 'Bibliografię'
v.0.3 - zmiana tytułu, porządne zmiany w treści, zmiana formatowania, dalsza walka z literówkami, dodano 'O tym artykule'

# ! / b i n / b a s h

echo $1

date +%H:%M:%S

whoami

./skrypt parametr1 parametr2

# ! / b i n / b a s h

echo $0

./skrypt #[ENTER]

. / s k r y p t

TEKST="dupa"

LICZBA=666

PI=3.14

echo $TEKST

echo $LICZBA+$PI

JEDEN=222

DWA=444

echo $[ $JEDEN + $DWA ] #zwroci 666

echo $[ $JEDEN + 111 ] #zwroci 333

WYNIK=$[ JEDEN + DWA ]

JEDEN="du"

DWA="mny"

TRZY="pa"

CZTERY="n"

PIEC=666

echo $JEDEN$DWA $TRZY$CZTERY #dumny pan

echo $JEDEN$TRZY #dupa

echo $JEDEN- $PIEC- $TRZY! #du- 666- p a !

JEDEN="du"

PIEC=666

echo $JEDEN_$PIEC # niepoprawnie - Bash bedzie szukal zmiennej $JEDEN_ (a takiej nie ma)

echo $JEDEN\_$PIEC #poprawnie - wypisze: du_666

JEDEN = 123 #zle - nie moze byc spacji pomiedzy znakiem =

DWA=23 #dobrze

# ! / b i n / s h

echo Wpisz tekst:

read TEST
echo Napisałeś:
echo $TEST

# ! / b i n / s h

I F [ $ # - le 2] ; THEN
e c h o " M n i e j n iż 3 parametry"
ELSE
echo "3 parametry albo nawet więc e j "
F I

# ! / b i n / s h

IF (($# < 2)); THEN

e c h o " m n i e j n i z 2 "

E L I F ( ( $ # > 2 ) ) ; t h e n

e c h o " w i e c e j n i z 2 "

ELSE

echo "dwa"

F I

# ! / b i n / s h

I F [ $ # - l t 2 ] ; T H E N

e c h o " m n i e j n i z 2 "

E L I F [ $ # - g t 2 ] ; t h e n

e c h o " w i e c e j n i z 2 "

ELSE

echo "dwa"

F I

# ! / b i n / s h

CASE $1 IN

dupa) echo "Ale brzydko napisales" ;;

1 ) e c h o " U c z e n b e z j e d y n k i t o j a k z o l n i e r z b e z k a r a b i n u " ; ;
*) echo Napisałeś $1 ; ;
ESAC

# ! / b i n / s h

FOR uczelnie IN agh uj pk ar ap ae ; DO

echo $uczelnie

done

# ! / b i n / s h

i = 0 ;

w h i l e [ $ i - l e 1 0 ] ; d o

i = $ [ i + 1 ] ; # i n k r e m e n t u j e m y l i c z n i k

echo $i

done

# ! / b i n / s h

$JEDEN="whoami"

echo "$JEDEN"

echo '$JEDEN'

echo `$JEDEN`

. / s k r y p t

whoami

$JEDEN

kdzwinel

./skrypt "Akademia Górniczo Hutnicza"

# ! / b i n / s h

f u n c t ( )

{

echo "dupa"

}

funct #wywolanie

# ! / b i n / s h

f u n c t ( )

{

echo $1

}

funct "dupa" #wywolanie

# ! / b i n / s h

i f [ $ # - e q 2 ]

then

echo "wysztko ok"

e x i t 0

e l s e

echo "zla ilosc parametrow"

e x i t 1

f i

l s | g r e p o g g

oggy_and_bruno.html

moj_song.ogg

E l v i s . o g g

w h o | c u t - d ' ' - f 1

kdzwinel

mjackson

epresley

w h o | s o r t

asper

bejo

dcm

d m e s g | t a i l

EXT3- fs: mounted filesystem with ordered data mode.

FAT: bogus number of reserved sectors

VFS: Can't find a valid FAT filesystem on dev hdb1.

basename /home/konrad/Downloads/firefox/config.conf

c o n f i g . c o n f

dirname /home/konrad/Downloads/firefox/config.conf

/home/konrad/Downloads/firefox

find /home - name elvis.ogg

/home/konrad/muzik/elvis/elvis.ogg

/home/marta/elvis.ogg


Wyszukiwarka

Podobne podstrony:
82 Dzis moj zenit moc moja dzisiaj sie przesili przeslanie monologu Konrada
82 Dzis moj zenit moc moja dzisiaj sie przesili przeslanie monologu Konrada
Jak sie poruszac po naszym kurs Nieznany
Kurs Zdrowy Wzrok, Szybki kurs
Numerologia - Poznaj swoją wibrację˜, POZNAJ SWOJĄ WIBRACJĘ, CZYLI KRÓTKI KURS NUMEROLOGII (1)
Jutro zaczyna sie dzis czyli jak zaprojektowac swoja wymarzona przyszlosc jutzad
SMED czyli szybkie przezbrojenia, Lean
Język C szybki kurs
H sapiens kurczą się mózgi Czyli z punktu widzenia NEOmitomaństwa ewolucja podąża nie w tą stronę co
5 rynkowy mechanizm kształtowania sie?n w gospodarce H34ZALAWIRF4V7BMVEEVEDDBFOJXRW2V426PABY
Mała kadra czyli zastępowy, Kurs zastępowych
ADOBE PHOTOSHOP SZYBKI KURS
Jak sie poruszac po naszym kurs Nieznany

więcej podobnych podstron