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?
touch skrypt //tworzymy pusty plik
chmod +x skrypt //dodajemy możl i wość wykonania (+x) do pliku
A jak taki skrypt odpalić?
. /skrypt
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:
#!/bin/bash
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:
"Napisz program który wypisze słowo podane w parametrze, obecny czas oraz nazwę użytkownika uruchamiaj ącego skrypt"
#!/bin/bash
echo $1
date +%H:%M:%S
whoami
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.
./skrypt parametr1 parametr2
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.
#!/bin/bash
echo $0
Da nam:
./skrypt #[ENTER]
./ skrypt
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:
TEKST="dupa"
LICZBA=666
PI=3.14
Wywołanie:
echo $TEKST
echo $LICZBA+$PI
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... :
JEDEN=222
DWA=444
echo $[ $JEDEN + $DWA ] #zwroci 666
echo $[ $JEDEN + 111 ] #zwroci 333
WYNIK=$[ JEDEN + DWA ]
PI=3.14
Wywołanie:
echo $TEKST
echo $LICZBA+$PI
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... :
JEDEN=222
DWA=444
echo $[ $JEDEN + $DWA ] #zwroci 666
echo $[ $JEDEN + 111 ] #zwroci 333
WYNIK=$[ JEDEN + DWA ]
Jak widać, mało przyjaznie. 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ń.
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- pa!
Niektóre symbole (jak np '_') moga być wykorzystane w nazwie wiec trzeba na nie uwazac. Jezeli koniecznie chcemy je wypisac to tradycyjnie stostujemy \
(backslash).
JEDEN="du"
PIEC=666
echo $JEDEN_$PIEC # niepoprawnie - Bash bedzie szukal zmiennej $JEDEN_ (a takiej nie ma)
echo $JEDEN\_$PIEC #poprawnie - wypisze: du_666
UWAGA! Przypomniało mi się. Popularny bład:
JEDEN = 123 #zle - nie moze byc spacji pomiedzy znakiem =
DWA=23 #dobrze
Mało popularna, ale niekiedy przydatna jest możliwość pobrania danych od użytkownika już w trakcie działania skryptu (a nie jako parametr).
#!/bi n/sh
echo Wpisz tekst:
read TEST
echo Napisałeś:
echo $TEST
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:
#!/bi n/sh
I F [ $# - le 2] ; THEN
echo "Mniej niż 3 parametry"
ELSE
echo "3 parametry albo nawet więcej "
FI
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
#!/bi n/sh
IF (($# < 2)); THEN
echo "mniej niz 2"
ELIF (($# > 2)); then
echo "wiecej niz 2"
ELSE
echo "dwa"
FI
albo mniej standardowo(odpowiednio do tych na górze): -eq, -ne, -lt, -gt, -le, -ge używając takiego zapisu:
#!/bi n/sh
I F [ $# - lt 2 ]; THEN
echo "mniej niz 2"
ELIF [ $# - gt 2 ] ; t hen
echo "wiecej niz 2"
ELSE
echo "dwa"
FI
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:
#!/bi n/sh
CASE $1 IN
dupa) echo "Ale brzydko napisales" ;;
1) echo "Uczen bez jedynki to jak zolnierz bez karabinu" ;;
*) echo Napisałeś $1; ;
ESAC
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!
Z plikami można robić mi. -e (sprawdza czy dany plik istnieje)
Mamy jeszcze CASEa działa to tak:
#!/bi n/sh
CASE $1 IN
dupa) echo "Ale brzydko napisales" ;;
1) echo "Uczen bez jedynki to jak zolnierz bez karabinu" ;;
*) echo Napisałeś $1; ;
ESAC
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.
#!/bi n/sh
FOR uczelnie IN agh uj pk ar ap ae ; DO
echo $uczelnie
done
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:
#!/bi n/sh
i =0;
whi l e [ $i - l e 10 ] ; do
i=$[i+1]; #inkrementujemy licznik
echo $i
done
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:
#!/bi n/sh
$JEDEN="whoami"
echo "$JEDEN"
echo '$JEDEN'
echo `$JEDEN`
./ skrypt
whoami
$JEDEN
kdzwinel
" - 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
./skrypt "Akademia Górniczo Hutnicza"
bez cytowania każde słowo zostało by potraktowane jako oddzielna zmienna.
Funkcje
Funkcje tworzymy np. na sposób znany z c:
#!/bi n/sh
f unct ()
{
echo "dupa"
}
funct #wywolanie
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'.
#!/bi n/sh
f unct ()
{
echo $1
}
funct "dupa" #wywolanie
Funkcje mogą być deklarowane 'gdziebądz', 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:
#!/bi n/sh
i f [ $# - eq 2 ]
then
echo "wysztko ok"
exi t 0
else
echo "zla ilosc parametrow"
exi t 1
f i
Narzędzi i filtry
Co warto umieć obsługiwać:
GREP
Ten mały programik pozwala nam wyszukiwać wzorzec w tekście. Czyli np.
l s | grep ogg
oggy_and_bruno.html
moj_song.ogg
Elvis.ogg
Faniejsze opcje:
Narzędzi i filtry
Co warto umieć obsługiwać:
GREP
Ten mały programik pozwala nam wyszukiwać wzorzec w tekście. Czyli np.
l s | grep ogg
oggy_and_bruno.html
moj_song.ogg
Elvis.ogg
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.
who | cut - d ' ' - f 1
kdzwinel
mjackson
epresley
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:
who | sort
asper
bejo
dcm
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ądz pierwszych (head) linii wrzuconych na standardowe wejście. Czyli np. jeżeli chcemy przejrzeć co się ostanio
działo w logu systemowym:
dmesg | tail
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.
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:
basename /home/konrad/Downloads/firefox/config.conf
config.conf
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:
dirname /home/konrad/Downloads/firefox/config.conf
/home/konrad/Downloads/firefox
FIND
A to już potężne narzędzie. Omówię tylko podstawowe funkcje. Przykład podstawowego użycia:
find /home - name elvis.ogg
/home/konrad/muzik/elvis/elvis.ogg
/home/marta/elvis.ogg
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'
Wyszukiwarka
Podobne podstrony:
Szybki kurs Adobe PhotoshopWłoski szybki kursMalowanie ścian szybki kurs malowania pokojuADOBE PHOTOSHOP SZYBKI KURSKurs Szybkiego Czytania Czytaj 10 Razy Szybciej W 2 Tygodniewięcej podobnych podstron