Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...
Bash 1 ----- wykład2i3
1. 1
PODSTAWY INFORMATYKI
dr inż. Krzysztof Małecki
Bash – literatura
Wykład został opracowany na podstawie materiałów:
http://www.ournet.pl/kursbasha/main.html
2. 2
Bash
• BASH (ang. Bourne Again SHell) to stworzony przez
Briana Foxa i Cheta Rameya zgodny z sh interpreter
poleceń, łączący w sobie zalety shella Korna (ksh) i C-
shella (csh).
• BASH to najbardziej popularna powłoka używana na
systemach unixowych, jest też skryptowym językiem
programowania, umożliwiającym efektywne zarządzanie
systemem.
• Skrypt – to niekompilowany tekstowy plik wykonywalny,
zawierający pewne polecenia systemowe oraz polecenia
sterujące jego wykonaniem (instrukcje, pętle itp.).
Wykonywany jest tylko i wyłącznie przez interpreter
(np. /bin/bash), który tłumaczy polecenia zawarte w
skrypcie na język zrozumiały dla procesora.
Przykładowe polecenia
• ls (np. ls –l)
– prawa dostępu ([d-katalog, l-dowiązanie], właściciel, grupa, do
której należy właściciel, pozostali): drwxrwxrwx
• man
• apropos
• mkdir
• touch – zakładanie pliku (pico, vim, vi, mcedit,….)
• cp
• mv
• rm
– (np. rm –r nazwa_katalogu - kasowanie katalogu, niepustego)
• cat – wyświetlenie zawartości zbioru
3. 3
Echo
• Polecenie echo – służy do wydrukowania
na standardowym wyjściu (stdout -
domyślnie jest to ekran) napisu podanego
jako argument polecenia.
echo "jakiś napis”
• Można też pisać do pliku.
echo "jakiś napis" > plik
echo "jakiś napis" >> plik
Kasowanie
zawartości
Dopisywanie
na końcu
Echo – parametry polecenia
• -n nie jest wysyłany znak nowej linii
• -e włącza interpretacje znaków specjalnych:
– a alert, dzwonek
– b backspace
– c pomija znak kończący nowej linii
– f escape
– 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
4. 4
Echo
• $ echo Angielskie I’m
• $ echo ‘Angielskie I’’’m’
• W tym przypadku zapis ‘’’ (apostrof, backslash, apostrof,
apostrof) zadziała tak jakby apostrof znajdował się w
ciągu znaków objętych apostrofami. Pierwszy znak ‘ w
ciągu ‘’’ kończy pierwszy ciąg objęty apostrofami
(‘Angielskie I’), ’ dodaje znak apostrofu, a następny
apostrof rozpoczyna kolejny ciąg znaków objęty
apostrofami, zawierający literę ‘m’.
Pierwszy skrypt!!
touch skrypt1
#!/bin/bash #Tu jest komentarz.
echo "Witaj"
• Znak # oznacza komentarz, interpreter pomija wszystko
co znajduje się za nim w tej samej linii.
• #! ma szczególne znaczenie - wskazuje na rodzaj shella
w jakim skrypt ma być wykonany.
• Ale to nie wszystko…
5. 5
Pierwszy skrypt!!
• Aby móc uruchomić skrypt należy mu jeszcze nadać
atrybut wykonywalności za pomocą polecenia:
chmod +x skrypt1
• Jeśli katalog bieżący w którym znajduje się skrypt nie
jest dopisany do zmiennej PATH, to nasz skrypt
możemy uruchomić następująco:
./skrypt1
chmod
• chmod
– chmod u+x, chmod u-x,
– chmod +x, chmod -x,
– chmod 777,
– itd.
• UWAGA: chmod 000 .
Czy są inne
możliwości?
6. 6
read
• Polecenie read – czyta ze standardowego wejścia
pojedynczy wiersz.
read -opcje nazwa_zmiennej
Przykład:
#!/bin/bash
echo -n "Podaj swoje imię: "
read imie
echo "$imie"
• zmienna nie musi być wcześniej tworzona, jeśli istniała
wcześniej, to jej zawartość zostanie zastąpiona tym co
wpisaliśmy.
Wprowadzenie
danych do zmiennej
imie
read – cd.
Przykład:
#!/bin/bash
echo „Wpisz coś:”
answer=„napis”
read
echo „$answer”
Sposób zapisu!!!
7. 7
read – cd.
• Polecenie read pozwala na przypisanie kilku wartości
kilku zmiennym.
Przykład:
• #!/bin/bash
• echo „Wpisz cztery wartości:”
• read a b c
• echo „Wartość zmiennej a to: $a”
• echo „Wartość zmiennej b to: $b”
• echo „Wartość zmiennej c to: $c”
Np. 5 7 8 3
A co tutaj będzie?
read – wybrane opcje
-p Pokaże znak zachęty bez kończącego znaku nowej
linii.
#!/bin/bash
read -p "Podaj swoje imię :" odp
echo "$odp"
-a Kolejne wartości przypisywane są do kolejnych
indeksów zmiennej tablicowej.
#!/bin/bash
echo „Podaj elementy zmiennej tablicowej:”
read –a tablica
echo "${tablica[*]}”
8. 8
Cytowanie
Znaki cytowania służą do usuwania interpretacji
znaków specjalnych przez powłokę.
• cudzysłów (ang. double quote): " "
– do umieszczania tekstu, wartości zmiennych
zawierających spacje. Cudzysłowy zachowują
znaczenie specjalne trzech znaków:
– $ wskazuje na nazwę zmiennej, umożliwiając
podstawienie jej wartości,
– znak maskujący,
– ` ` odwrotny apostrof, umożliwia zacytowanie
polecenia.
Cytowanie – przykład
#!/bin/bash
x=2
echo "Wartość zmiennej x to $x"
#wydrukuje Wartość zmiennej x to 2
echo -ne "Usłyszysz dzwoneka„
echo "Polecenie date pokaże: `date`"
9. 9
Cytowanie – cd.
• apostrof (ang. single quote): ' '
– Wszystko co ujęte w znaki apostrofu
traktowane jest jak łańcuch tekstowy, apostrof
wyłącza interpretowanie wszystkich znaków
specjalnych, znaki traktowane są jak zwykłe
znaki.
• Przykład:
#!/bin/bash
echo '$USER' #nie wypisze loginu!!!
Cytowanie – cd.
• odwrotny apostrof (ang. backquote): ` `
– umożliwia zacytowanie polecenia, bardzo przydatne jeśli chce
się podstawić pod zmienną wynik jakiegoś polecenia np:
• Przykład:
#!/bin/bash
x=`ls -la $PWD`
echo $x #pokaże rezultat polecenia
Alternatywny zapis, który ma takie samo działanie:
#!/bin/bash
echo $(ls -la $PWD)
10. 10
Cytowanie – cd.
• backslash, czyli znak maskujący:
• Przykład:
– na ekranie ma pojawić się napis $HOME
echo "$HOME" #wydrukuje /home/ja
– aby wyłączyć interpretacje przez powłokę tej zmiennej, trzeba
napisać:
echo $HOME
i jest napis
$HOME
☺
Funkcje
• Coś w rodzaju podprogramów. Stosuje się, gdy w
skrypcie powtarza się jakaś grupa poleceń.
• Do danej funkcji odwołujemy się podając jej nazwę, a
wykonane zostanie wszystko, co wpisaliśmy między
nawiasy { }.
• Funkcje skracają znacznie długość skryptu.
• Składnia:
function nazwa_funkcji
{
polecenie1
polecenie2
…
}
11. 11
Funkcje – przykład
#!/bin/bash
function napis
{
echo "To jest napis"
}
napis wywołanie
naszej
funkcji
Funkcje – cd.
• Funkcje mogą się znajdować w innym pliku, co uczyni
nasz skrypt bardziej przejrzystym i wygodnym, tworzy
się własne pliki nagłówkowe, wywołuje się je tak:
. ~/nasz_plik_z_funkcjami
nazwa_funkcji
Trzeba pamiętać o
podaniu kropki i
spacji przed nazwą
pliku !!!!
12. 12
Funkcje – przykład
#!/bin/bash
function nasza_funkcja
{
echo -e 'Właśnie użyłeś funkcji o nazwie
"nasza_funkcja".a'
}
• Teraz pozostało jeszcze utworzyć skrypt, w którym
wywołamy funkcję: nasza_funkcja:
#!/bin/bash
echo "Test funkcji."
. funkcja
nasza_funkcja
Zmienne programowe
(ang. program variables
• Zmienne definiowane samodzielnie przez użytkownika.
nazwa_zmiennej="wartość"
Na przykład:
x="napis"
echo $x
x = "napis" Błędny zapis !!!
13. 13
Zmienne programowe – cd.
Pod zmienną możemy podstawić wynik jakiegoś polecenia
(dwa sposoby):
1. Poprzez użycie odwrotnych apostrofów:
`polecenie`
• Przykład:
#!/bin/bash
GDZIE_JESTEM=`pwd` #Wartością zmiennej
GDZIE_JESTEM jest wynik działania polecenia pwd, które
wypisze nazwę katalogu w jakim się w danej chwili znajdujemy.
echo "Jestem w katalogu $GDZIE_JESTEM"
Zmienne programowe – cd.
2. Za pomocą rozwijania zawartości nawiasów:
$(polecenie)
• Przykład:
#!/bin/bash
GDZIE_JESTEM=$(pwd)
echo "Jestem w katalogu $GDZIE_JESTEM"
14. 14
Zmienne specjalne
(ang. special variables, special parameters)
To najbardziej prywatne zmienne powłoki, są udostępniane
użytkownikowi tylko do odczytu.
• $0
– nazwa bieżącego skryptu lub powłoki
#!/bin/bash
echo "$0" #Pokaże nazwę naszego skryptu.
• $1..$9
– Parametry przekazywane do skryptu (użytkownik może
modyfikować ten rodzaj $-ych specjalnych).
#!/bin/bash
echo "$1 $2 $3"
Zadziała w przypadku
uruchomienia skryptu
z parametrami!!!
Zmienne specjalne – cd.
• $@
– Pokaże wszystkie parametry przekazywane do skryptu (też
wyjątek), równoważne $1 $2 $3..., jeśli nie podane są żadne
parametry $@ interpretowana jest jako nic ☺.
• Przykład:
#!/bin/bash
echo "Skrypt uruchomiono z parametrami: $@"
./plik parametr1 parametr2
• Wynik działania:
Skrypt uruchomiono z parametrami: parametr1 parametr2
15. 15
Zmienne specjalne – cd.
• $?
– kod powrotu ostatnio wykonywanego polecenia
• $$
– PID procesu bieżącej powłoki
Zmienne środowiskowe
(ang.environment variables)
Definiują środowisko użytkownika, dostępne dla wszystkich
procesów potomnych. Wyróżniamy:
– globalne - widoczne w każdym podshellu
– lokalne - widoczne tylko dla tego shella, w którym zostały
ustawione
• Przykład:
x="napis" #definicja zmiennej
echo $x
xterm #wywołanie podshella
• ponowne wywołanie:
echo $x
nie pokaże nic, bo zmienne lokalne nie są widoczne w
podshellach!!!
16. 16
Zmienne środowiskowe – cd.
• Inicjacja zmiennej globalnej:
export x="napis"
– Teraz zmienna x będzie widoczna w podshellach. Polecenie
export nadaje wskazanym zmiennym atrybut zmiennych
globalnych.
– Polecenie export -p pozwala uzyskać listę aktualnie
eksportowanych zmiennych.
• usunięcie atrybutu eksportu dla danej zmiennej
export -n zmienna
Przykłady zmiennych środowiskowych
$HOME #ścieżka do katalogu domowego
$USER #twój login
$HOSTNAME #nazwa twojego hosta
$OSTYPE #rodzaj systemu operacyjnego
• dostępne zmienne środowiskowe można wyświetlić za
pomocą polecenia:
printenv | more
17. 17
Zmienne tablicowe
• BASH pozwala na stosowanie zmiennych tablicowych
jednowymiarowych.
• Tablica? Zmienna, która przechowuje listę pewnych
wartości (rozdzielonych spacjami).
• w BASH'u nie ma maksymalnego rozmiaru tablic.
• Kolejne wartości zmiennej tablicowej indeksowane są
przy pomocy liczb całkowitych, zaczynając od 0.
• Składnia
zmienna=(wartość1 wartość2 wartość3 wartośćn)
Zmienne tablicowe – przykład
#!/bin/bash
tablica=(element1 element2 element3)
echo ${tablica[0]}
echo ${tablica[1]}
echo ${tablica[2]}
• Do elementów tablicy odwołujemy się za pomocą
wskaźników.
${nazwa_zmiennej[wskaźnik]}
• Wskaźnikami są indeksy elementów tablicy: 0…n, @, *.
echo ${tablica[*]} #to samo co powyżej
18. 18
Zmienne tablicowe – cd.
Można też uzyskać długość (liczba znaków) danego
elementu tablicy:
${#nazwa_zmiennej[wskaźnik]}
• Przykład:
#!/bin/bash
tablica=(element1 element2 element3)
echo ${#tablica[0]} #liczba znaków pierwszego
elementu tablicy, czyli 8.
echo ${#tablica[@]} #liczba wszystkich
elementów tablicy, czyli 3.
Dodawanie elementów do tablicy
nazwa_zmiennej[wskaźnik]=wartość
#!/bin/bash
tablica=(element1 element2 element3)
tablica[3]=element4
echo ${tablica[@]}
• BASH automatycznie utworzy tablicę, w przypadku
dodania elementu do zmiennej nieistniejącej:
#!/bin/bash
linux[0]=slackware
linux[1]=debian
echo ${linux[@]}
Tablica linux
z dwoma
elementami.
19. 19
Usuwanie elementów tablic
• Polecenie unset.
unset nazwa_zmiennej[wskaźnik]
#!/bin/bash
tablica=(element1 element2 element3)
echo ${tablica[@]}
unset tablica[2]
echo ${tablica[*]}
Usunięty ostatni
element tablicy.
Usuwanie całych tablic
• Aby usunąć całą tablicę wystarczy podać jako wskaźnik:
@ lub *.
#!/bin/bash
tablica=(element1 element2 element3)
unset tablica[*]
echo ${tablica[@]}
Ciekawe, co
zostanie
wyświetlone?
20. 20
Wyrażenia arytmetyczne
• mechanizm interpretacji wyrażeń arytmetycznych,
• obliczenia dokonywane są na liczbach całkowitych,
• nie przeprowadzana jest kontrola przepełnienia (ang.
overflow).
$((wyrażenie)) lub $[wyrażenie]
• Przykład:
#!/bin/bash
echo $((8/2))
wynik=$[4*5/2]
echo "$wynik"
Wyrażenia arytmetyczne – cd.
• Polecenie let
• Przykład:
#!/bin/bash
liczba1=5
liczba2=6
let wynik=liczba1*liczba2
echo "$wynik"
21. 21
Strumienie danych
• stdin (ang. standard input), standardowe wejście, skąd
proces pobiera dane, domyślnie jest to klawiatura
• stdout (ang. standard output) to standardowe wyjście,
wysyłany jest tam wynik działania procesu, domyślnie
ekran
• stderr (ang. standard error), standardowe wyjście
błędów, tam trafiają wszystkie komunikaty o błędach,
domyślnie ekran
Deskryptory plików
• Linux wszystko traktuje jako plik, niezależnie od tego czy
to jest plik zwykły, katalog, urządzenie blokowe
(klawiatura, ekran) itd.
• Tak samo jest ze strumieniami, BASH identyfikuje je za
pomocą przyporządkowanych im liczb całkowitych
(0…2), tzw. deskryptorów plików:
– 0 to plik, z którego proces pobiera dane: stdin,
– 1 to plik, do którego proces pisze wyniki swojego działania
stdout,
– 2 to plik, do którego trafiają komunikaty o błędach stderr.
• Za pomocą operatorów przypisania można
manipulować strumieniami, poprzez przypisanie
deskryptorów: 0, 1, 2 innym plikom, niż tym
reprezentującym klawiaturę i ekran.
22. 22
Przełączanie standardowego wejścia
• Zamiast klawiatury jako standardowe wejście można
otworzyć plik:
< plik
• Przykład:
sort < lista
• Wynik na ekranie:
caldera
debian
redhat
slackware
Plik lista:
slackaware
redhat
debian
caldera
Przełączanie standardowego wyjścia
• Wynik jakiegoś polecenia można wysłać do pliku (z
nadpisaniem lub z dopisaniem), a nie na ekran:
> plik lub >> plik
• Przykład:
ls -la /usr/bin > ~/wynik
• jeśli plik wynik wcześniej nie istniał, to zostanie
utworzony, jeśli istniał cała jego poprzednia zawartość
zostanie nadpisana.
ls -la /usr/bin >> ~/wynik
• jeśli plik wynik istniał to zawartość zostanie uzupełniona.
23. 23
Przełączanie standardowego wyjścia błędów
• Do pliku można też kierować strumień diagnostyczny:
2> plik
• Przykład:
#!/bin/bash
echo "Stderr jest skierowane do pliku error"
ls -y 2> ~/error #błąd
ls -y 2>> ~/error #błąd
Polecenie ls jest użyte
z błędną opcją -y,
komunikat o błędzie
trafi do pliku error.
Koniec
Dziękuję za uwagę