SlideShare a Scribd company logo
LINUX COMMAND LINE
BASH I PRZYJACIELE
Oskar Wyciślak
(oskar.wycislak@gmail.com)
Agenda
 Co to jest powłoka?
 Bash
 Interaktywna praca
 Metody wprowadzania (emacs, vi)
 Pliki i katalogi
 Historia i jej przeszukiwanie
 Pliki konfiguracyjne
 .bashrc
 .bash_profile
 Zmienne
 Specjalne zmienne
 Strumienie i potoki
 Przydatne komendy
 Wczytywanie danych
 Co to jest skrypt?
 Pierwszy skrypt
2
oskar.wycislak@gmail.com
Agenda dzień 2
 Dopełnianie
 Arytmetyka
 Instrukcje warunkowe
 Logika
 Pliki (czy istnieje np.)
 If / case
 test
 Pętle
 for
 while
 until
 Funkcje
 Praca w tle
 Pułapki i sygnały
 Tablice
3
oskar.wycislak@gmail.com
Czym jest powłoka?
 Program uruchamiający inne programy
 Interfejs między użytkownikiem a systemem
(jądrem).
 Typy powłok
 Tekstowe
 Bash, linia poleceń windows
 Graficzne
 Windows explorer, fluxbox, xfce, kde, gnome
4
oskar.wycislak@gmail.com
Bash
<xxx> Pomorze ktos?
<Unf> Niestety, mazowsze.
<kubaaa> co robisz ?
<kambys> nic
<kambys> w pracy jestem
5
oskar.wycislak@gmail.com
Bash – Bourne again shell
Brian Fox
Stworzył bash’a jak miał 30 lat.
To znaczy, że mamy jeszcze czas!
Jedna z najpopularniejszych powłok
systemów Unixowych. Standard w
większośći dystrybucji Linux’a oraz w OS
X.
6
oskar.wycislak@gmail.com
Praca interaktywna - emacs
 bash/set –o emacs – standardowo
 C(ctrl)-a – początek linii
 C-e – koniec linii
 C-f –znak do przodu
 C-b –znak do tyłu
 A(alt)-f – słowo do przodu
 Słowo – litery i cyfry, znak specjalny przerywa słowo
 A-b – słowo do tyłu
 C-l – czyści ekran (clear)
 C-k – kasuje wszystkie znaki za kursorem oraz znak pod kursorem
 C-u – kasuje wszystkie znaki przed kursorem
 C-w – kasuje jedno słowo przed kursorem
 A-d – kasuje jedno słowo za kursorem
 C-x C-u – cofnij
 C-x C-e – otwiera edytor do edycji komend
 A-# – komentuje linię i rozpoczyna nową
7
oskar.wycislak@gmail.com
Praca interaktywna – vi
 bash/set –o vi (tryb wprowadzania – input mode)
 esc – tryb poleceń
 i – wstaw znak przed kursorem
 a – wstaw znak za kursorem
 x – skasuj znak pod kursorem
 h, l – lewo prawo, jeden znak
 w, b – początek poprzedniego, kolejnego słowa
 0, ^, $ - bezwzględny początek, pierwszy niebiały znak, koniec linii
 % - pasujący nawias
 D – kasuje wszystkie znaki za kursorem oraz znak pod kursorem
 C-u – kasuje wszystkie znaki przed kursorem
 u – cofnij
 U – cofnij wszystkie
 A(alt)-# - komentuje linię i rozpoczyna nową
Można też # w trybie poleceń
8
oskar.wycislak@gmail.com
Pliki i katalogi
 ls – wyświetla listę plików oraz katalogów
 -l – wyświetla informacje w postaci listy
 -a – pokazuje również ukryte pliki i katalogi
 pwd – pokazuje w jakim znajdujemy się aktualnie katalogu
 cd – zmienia aktualny katalog na inny
 chmod – zmienia uprawnienia
 chown – zmienia właściciela
 mkdir – tworzy katalog
 -p – tworzy od razu całą ścieżkę
 cp – kopiuje plik lub katalog
 mv – przenosi plik lub katalog
 rm – usuwa plik lub katalog
9
oskar.wycislak@gmail.com
Drzewo katalogów
10
oskar.wycislak@gmail.com
Historia
 history
 ~/.bash_history
 shopt -s histverify
 Zmienne środowiskowe
 HISTFILE, HISTLIFE, HISTSIZE
 HISTCONTROL
 ignorespace:ignoredups
 !, !!, !n, !-2
 !!:gs/foo/bar/ - substytucje jak w sedzie
 sudo !!
 cd - to też historia ;-)
11
oskar.wycislak@gmail.com
Wyszukiwanie w historii
CTRL+
12
oskar.wycislak@gmail.com
Pliki konfiguracyjne
 .bashrc
Wykonuje się z każdym odpaleniem powłoki
zmienne, funkcje, etc
 /etc/bashrc
 ~/.bashrc
 .bash_profile
Wykonuje się za każdym interaktywnym logowaniem
uptime, motd, etc
 /etc/profile
 ~/.bash_profile
 Często załącza .bashrc
http://tldp.org/LDP/abs/html/sample-bashrc.html
13
oskar.wycislak@gmail.com
Zmienne
 Czym jest zmienna?
 Deklaracja zmiennych w Bash’u
 bash$ zmienna=“wartość”;
 bash$ unset zmienna;
 export – zmienne lokalne oraz globalne
 env i set
 Wynik komendy w zmiennej
 Średni sposób – bash$ zmienna=`ls`; - ``
 Dobry sposób – bash$ zmienna=$(ls); - $()
14
oskar.wycislak@gmail.com
Zmienne specjalne
 $1, $2, $3 … $(10), $(11), … - parametry
 $# - liczba przekazanych parametrów
 $@ - tablica ze wszystkimi parametrami
 Bardzo ważne – używając zmiennej $@ koniecznie brać
ją w cudzysłów ( “$@” ). W przeciwnym wypadku przy
iteracji np. w pętli mogą wystąpić problemy z przekazanymi
parametrami.
 $* - wszystkie parametry jako string
 $0 – nazwa skryptu
 $$ - PID procesu
 $? – kod wyjścia ostatniej komendy
 $! – PID ostatniego procesu odpalonego w tle
15
oskar.wycislak@gmail.com
Zmienne systemowe
 $HOME – katalog domowy
 $HOSTNAME – nazwa hosta
 $IFS – osobny slajd
 $OLDPWD (cd -) – poprzedni katalog
 $PATH – ścieżka wyszukiwania
 $PPID – PID procesu matki
 $PS1 – osobny slajd
 $PWD – aktualny katalog
 $RANDOM – losowa liczba całkowita
http://tldp.org/LDP/abs/html/internalvariables.html
16
oskar.wycislak@gmail.com
IFS – wewnętrzny separator pól
IFS jest używany przez Bash do rozpoznawania
słów (lub linii). Standardowo jest to znak biały,
spacja, tabulator oraz znak nowej linii.
mbp:~ canto$ IFS=“:" && for i in $(echo ”a:b:c:d"); do echo $i; done
a
b
c
d
mbp:~ canto$ IFS=$’n’ && for i in $(cat); do echo $i; done
a
b
c
d
aD
b
c
d
17
oskar.wycislak@gmail.com
IFS cd.
 Dlaczego $’n’ a nie po prostu “n”?
 $’n’ – jeden bajt
mbp:~ canto$ echo -n $'n' | hexdump
0000000 0a
0000001
 “n” – dwa bajty
mbp:~ canto$ echo -n "n" | hexdump
0000000 5c 6e
0000002
18
oskar.wycislak@gmail.com
PS1
19
oskar.wycislak@gmail.com
Strumienie
 Strumienie
 stdin – standardowe wejście, fd 0
 stdout – standardowe wyjście, fd 1
 stderr – strumień błędów, fd 2
 Przekierowanie strumienia
 Wejścia <
 Wyjścia >
 Wyjścia do fd >&n
20
oskar.wycislak@gmail.com
Potoki
 Potok, pipe, |
 Mechanizm komunikacji między procesami
 Najczęściej łączy stdout pierwszego procesu z
stdin drugiego
cat plik | sed coś | grep coś | sort
21
oskar.wycislak@gmail.com
Przydatne komendy
i przełączniki
 man
 echo
 touch
 cat
 grep
 seq
 cut
 sort
 uniq
 paste
 less
 more Find head Tail tee Awk sed tr ps which wc wget/curl
md5sum/digest
22
oskar.wycislak@gmail.com
man, info, whatis/apropos
 man man
 -s - Sekcje
 1 komendy
 2 wywołania systemowe (syscall)
 3 funkcje bibliotek
 4 pliki specjalne
 5 format plików
 6 gry i wygaszacze ekranu
 7 różne
 8 komendy i demony administracyjne
 9 wewnętrzne funkcje jądra
 /usr/share/man, /usr/share/man/whatis
 /usr/share/info
23
oskar.wycislak@gmail.com
echo, touch, cat
 echo – wyświetla dany tekst
 -n
 -e
 Echo… echo… Wbudowane oraz /bin/echo
 touch – uaktualnia ostatni czas dostępu oraz
modyfikacji
 Zwykle używany do tworzenia nowego pustego pliku
 cat – łączy oraz wyświetla pliki
 -v – wyświetla także znaki kontrolne
 tac – odwrotność cat
24
oskar.wycislak@gmail.com
grep
 grep – Jedno z najczęściej używanych narzędzi, wyświetla linie
pasujące do wzorca
 -R – wyszukiwanie rekursywne
 -A – pokaż n lini za znalezionym wzorcem
 -B - pokaż n lini przed znalezionym wzorcem
 -C - pokaż n lini za i przed znalezionym wzorcem
 -c – pokaż ilość znalezionych lini
 -i – ignoruje wielkość liter
 -v – pokaż linie niepasujące do wzorca
 -q – tryb cichy, nie wyświetla nic. Wychodzi z kodem błędu 0 jeśli
wzorzec pasował lub 1 jeśli nie znaleziono pasujących linii
bash$ netstat -an | grep -i listen
bash$ grep –v –e ^# -e ^$ /etc/apache2/httpd.conf
25
oskar.wycislak@gmail.com
seq, cut
 seq – tworzy sekwencję liczb
 -s – string pomiędzy liczbami, standardowo jest to
nowa linia
bash$ for i in $(seq 1 255); do ping -c 1
192.168.1.$i & done
 cut – wycina zdefiniowane fragmenty pliku
 -d – znak rodzielający
 -f – pola, które zostaną wyświetlone
 n, n,m, n-m
bash$ cut -d : -f 1,5 /etc/passwd
bash$ for i in $(seq 1 255); do ping -c 1
192.168.1.$i | grep “bytes from” | cut -d " " -f4 |
cut -d : -f1 & done
26
oskar.wycislak@gmail.com
sort
 sort – sortuje plik tekstowy
 -n - sortowanie numeryczne
 -r - odwraca wynik sortowania
 -f - ignoruje wielkość liter
 -T - katalog na plik tymczasowy, bardzo przydatne
przy sortowaniu plików większych niż ilość pamięci
RAM
 -u - nie wyświetla duplikatów
 -k - ustaw klucz sortowania na pozycji n
 -t - separator pól, często używane razem z –k
bash$ sort –u –n –t. –k1,1 –k2,2 –k3,3 –k4,4 ip
27
oskar.wycislak@gmail.com
uniq
 uniq – filtruje unikalne linie w pliku. Plik musi
być posortowany
 -u – pokaż tylko unikalne linie
 -d – pokaż tylko zduplikowane linie
 -c – pokaż ilość wystąpień każdej linii
 -i – ignoruj wielkość liter
bash$ sort –n –t. –k1,1 –k2,2 –k3,3 –k4,4 ip |
uniq -c
28
oskar.wycislak@gmail.com
paste, less, more
 paste – wyświetla linie plików obok siebie
 less – pozwala przeglądać zawartość pliku
 -f, działa jak tail –f, podąża za zmianami w pliku
 more – uboga wersja less’a
29
oskar.wycislak@gmail.com
find
 find – wyszukuje pliki lub foldery
 -type – typ
 b - urządzenie blokowe
 c – urządzenie “wskazujące”
 d – katalog
 f – plik
 l – link symboliczny
 p – kolejka fifo
 s – gniazdo (socket)
 -name – nazwa
 -iname – nazwa bez rozróżniania wielkości liter
 --maxdepth – “głębokość” wyszukiwania
 -mtime, -atime, -ctime – czas od ostatniego zmodyfikowania, dostępu, stworzenia pliku
 -exec – uruchomienie komendy, {} przekazuje ścieżkę
 -ls – wykonuje ls na każdym znalezionym pliku/katalogu
 -size – określa wyszukiwaną wielkość pliku
 Logika - -and, -not, -or
bash$ find /var/log -type f -mtime +30d -ls
bash$ find /var/log -type f -mtime +30d -exec ls -la {} ;
bash$ find / -type f ( -perm 4000 -or -perm 2000 ) -ls
30
oskar.wycislak@gmail.com
head, tail, tee
 head – wyświetla n pierwszych linii pliku
 tail – wyświetla n ostatnich linii pliku
 -f – tail będzie czekał aż na końcu pliku pojawią
się nowe dane I je wyświetli
 -F – lepsza wersja –f, nie wszędzie dostępna
 tee – przyrządza herbatę kopiuje stdin do
stdout oraz do pliku. Bardzo przydatne przy
logowaniu
bash$ netstat -an| tee /tmp/tee.out
31
oskar.wycislak@gmail.com
awk
 AWK – interpretowany język programowania
bash$ cat /etc/passwd | awk –F ‘:’ ‘{print $1 “
“ $5}’
bash$ awk 'length > 64’ /etc/passwd
bash$ awk NF plik
bash$ awk 'FS=":" { if ($3 == 0) {print $0} }'
/etc/passwd
32
oskar.wycislak@gmail.com
sed
 sed – edytor strumieniowy, używany do edycji tekstu
bash$ sed s/jedno/drugie/ plik
bash$ sed s/jedno/drugie_zawsze/g plik
bash$ sed s/jedno/drugie/g plik1 > plik2
bash$ sed –i s/jedno/drugie/g plik1
bash$ sed ‘/^$/d’ plik
bash$ sed ‘5d’ ~/.ssh/known_hosts
33
oskar.wycislak@gmail.com
tr
 tr – zamienia znak w strumieniu
 -d – usuwa znak
 [:class:] – zestaw znaków
 alnum – znaki alfanumeryczne
 alpha – znaki alfabetu
 blank – białe znaki
 cntrl – znaki kontrolne
 digit – cyfry
 lower – małe litery
 upper – wielkie litery
bash$ tr ‘[:lower:]’ ‘[:upper:]’
bash$ tr ‘n’ ‘ ‘
34
oskar.wycislak@gmail.com
ps
 ps – wyświetla status procesów
 -a – pokaż procesy innych użytkowników
 -x – pokaż procesy bez terminali
 -u – pokaż formacje o procesach
 -o – opcje
 user, pid, ppid, pgid, sess, jobc, state, tt, time, comm
35
oskar.wycislak@gmail.com
Wczytywanie danych
 read – wczytuje stdin do zmiennej/zmiennych
while IFS=: read name passwd uid gid fullname ignore
do
echo "$name $fullname"
done < /etc/passwd
36
oskar.wycislak@gmail.com
Czym jest skrypt?
 Listą komend dla interpretera
 Narzędziem pracy administratora
37
oskar.wycislak@gmail.com
Po co nam skrypty?
 Automatyzować powtarzalne zadania
 Udostępniać funkcjonalność dla innych
użytkowników systemu
 Upraszczać skomplikowane zadania
 Planować pracę
38
oskar.wycislak@gmail.com
Pierwszy skrypt
#!/bin/bash
#mój pierwszy super skrypt! - komentarz
echo “Witaj świecie”;
39
oskar.wycislak@gmail.com
Prosty skrypt wykonujący kopie
zapasowe
#!/bin/bash
#To jest pierwsza bardzo prosta wersja skryptu do kopii
zapasowych.
#W kolejnej części będziemy ten skrypt ulepszać i dodawać nowe
funkcjonalności
echo "Kopiuje pliki starsze niz 30 dni z /var/log do
/var/backup";
mkdir -p /var/backup;
find /var/log/ -type f -mtime +30 | xargs tar -zcvf
/var/backup/bak-$(date "+%d%m%y").tar.gz
find /var/log/ -type f -mtime +30 –exec rm -f {} ;
echo "Koniec."
40
oskar.wycislak@gmail.com
Dopełnianie i rozwijanie
 TAB
 Komend
 Nazw plików
 Nazw zmiennych
 Nawiasy klamrowe
[canto@localhost ~]$ echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y
[canto@localhost ~]$ echo /var/tmp/{oskar,zdzisiek,marta.*}
/var/tmp/oskar /var/tmp/zdzisiek /var/tmp/marta.*
41
oskar.wycislak@gmail.com
Zamiany zmiennych (-.-)
 ${foo:-bar}
 Jeśli foo puste lub nie istnieje wyświetl bar, w przeciwnym wypadku wyświetl foo
– zamiana
 ${foo:=bar}
 Tak jak powyżej z tą różnicą, iż zamiast zamiany następuje przypisanie
(permamentne)
 ${foo:?bar}
 Jeśli foo jest puste lub nie istnieje zwróć błąd (stderr) i bar, w przeciwnym
wypadku zwróć foo
 ${foo:+bar}
 Jeśli foo jest puste lub nie istnieje nie rób nic. Jeśli istnieje lub niepuste zamień
na bar (zamiana)
 ${#foo}
 Zwraca długość foo lub ilość elementów jeśli foo jest tablicą
 ${foo:ofset:długość}
 Wyświetl długość znaków foo zaczynając od ofset
42
oskar.wycislak@gmail.com
Ciekawsze zamiany zmiennych
(-.-)
 ${foo#bar}
 Jeśli bar (regex) pasuje do początku foo wtedy zwróć foo pozbawiony tekstu do
pierwszego dopasowania
 ${foo##bar}
 To samo co powyżej jednak zwraca foo pozbawione tekstu aż do ostatniego
dopasowania
[canto@localhost ~]$ export foo=/var/tmp/jacek.txt.bak.old
[canto@localhost ~]$ echo ${foo#*.}
txt.bak.old
[canto@localhost ~]$ echo ${foo##*.}
old
 ${foo%bar}
 Podobnie jak w przypadku „#” lecz zwraca foo pozbawione tekstu do
pierwszego dopasowania od końca foo
 ${foo%%bar}
 Jak wyżej lecz po ostatnim dopasowaniu od końca foo
[canto@localhost ~]$ echo ${foo%.*}
/var/tmp/jacek.txt.bak
[canto@localhost ~]$ echo ${foo%%.*}
/var/tmp/jacek
43
oskar.wycislak@gmail.com
 ${foo/wzorzec/bar}
 Zamień (jeden) wzorzec w foo na bar
 Jeśli wzorzec zaczyna się od
 / - zamień wszystkie wystąpienia
 # - dopasuj od początku foo
 % - dopasuj od końca foo
[canto@localhost ~]$ echo $foo
a b c d e f g h i j k l m n o p q r s t u v w x y z+n
[canto@localhost ~]$ echo ${foo//n/Z}
a b c d e f g h i j k l m Z o p q r s t u v w x y z+Z
[canto@localhost ~]$ echo ${foo/n/Z}
a b c d e f g h i j k l m Z o p q r s t u v w x y z+n
44
oskar.wycislak@gmail.com
Arytmetyka
 $((2+2*2))
 ++foo, --foo, foo++, foo--
 &&, ||
 Operacje logiczne (I i LUB)
 &, |, ^
 Operacje bitowe (I, LUB, XOR)
 <=, >=, <, >, ==, !=
45
oskar.wycislak@gmail.com
Instrukcje warunkowe
if warunek
then
pracuj
fi
46
oskar.wycislak@gmail.com
if warunek
then
pracuj
else
obijaj się
fi
47
oskar.wycislak@gmail.com
[canto@localhost ~]$
if [ -f /var/log/messages1 ]
> then
> echo "Plik istnieje";
> else
> echo "Plik NIE istnieje";
> fi
Plik NIE istnieje
48
oskar.wycislak@gmail.com
[ vs [[
 [[, lepsze, nowsze, ciekawsze, więcej funkcji
 Dostępne tylko w bashu
 &&, ||, =~
 [, dobre, przenośne
49
oskar.wycislak@gmail.com
test
 !, negacja wyrażenia
 WYRAŻENIE -a WYRAŻENIE, „AND”, „i” oba wyrażenia są prawdziwe
 WYRAŻENIE -o WYRAŻENIE, „OR”, „lub” jedno z wyrażeń jest prawdziwe
Powyższe są niezalecane, nie powinno się ich używać a zamiast nich używać [[.
 -b, plik istnieje i jest urządzeniem blokowym
 -c, plik istnieje i jest urządzeniem znakowym
 -d, plik istnieje i jest katalogiem (w linuxie wszystko jest plikiem ;-)
 -e, plik istnieje
 -f, plik istnieje i jest „normalnym” plikiem
 -h, plik istnieje i jest linkiem symbolicznym
 -k, plik istnieje i ma ustawiony sticky bit
 -r, plik istnieje i mamy prawa do jego odczytu
 -s, plik istnieje i ma wielkość większą niż 0
 -w, plik istnieje i mamy prawo do zapisu w nim
 -x, plik istnieje i mamy prawo do wykonania
 TEXT == TEXT, prawda jeśli teksty są takie same
 TEXT != TEXT, prawda jeśli teksty są różne
 -eq, -ne, -ge, -gt, -le, -lt, porównywanie liczb, prawda jeśli, równe, różne, większe równe, większe, mniejsze
równe, mniejsze
50
oskar.wycislak@gmail.com
case
case "$1" in
start) # $1 == „start”
start
;;
stop) # $1 == „stop”
stop
;;
status) # $1 == „status”
status
;;
*) # $1 =~ „*”, czyli reszta
echo $"Usage: $0 {start|stop|restart}"
exit 1
esac
51
oskar.wycislak@gmail.com
Przykład
#!/bin/bash
if [ -w "$1" ]
then
echo "Plik istnieje i mozemy do niego pisac";
wielkosc=$(du $1 | awk '{print $1}');
echo "Jego wielkosc to $wielkosc bajt/y/ow";
elif [ -f "$1" ]
then
echo "Plik istnieje ale nie mozemy do niego pisac";
else
echo "Plik nie istnieje - $1";
fi
52
oskar.wycislak@gmail.com
Przykład nr 2
#!/bin/bash
if [ $1 == "costam" ]
then
echo "OK"
else
echo "NOK"
fi
53
oskar.wycislak@gmail.com
Przykład nr 2 lepiej
#!/bin/bash
if [ x$1 == "xcostam" ]
then
echo "OK"
else
echo "NOK"
fi
54
oskar.wycislak@gmail.com
Przykład nr 3
#!/bin/bash
if [ x$1 == "x" ]
then
echo "Uzycie $0 nazwa_uzytkownika";
exit 1
fi
grep -q $1 /etc/passwd
if [ $? -eq 0 ]
then
echo "Uzytkownik $1 istnieje";
else
echo "Uzytkownik $1 nie istnieje";
fi
55
oskar.wycislak@gmail.com
backup.sh
#!/bin/bash
co=${1:-"/var/log"};
gdzie=${2:-"/var/backup"};
if [ ! -d $co ]
then
echo "Katalog $co nie istnieje";
exit 1
fi
echo "Kopiuje pliki starsze niz 30 dni z $co do $gdzie";
mkdir -p $gdzie;
find $co -type f -mtime +30 | xargs tar -zcvf $gdzie/bak-$(date
"+%d%m%y").tar.gz
find $co -type f -mtime +30 .exec rm -f {} ;
echo "Koniec."
56
oskar.wycislak@gmail.com
Pętle
 for
 while
 until
57
oskar.wycislak@gmail.com
for
for ZMIENNA in
LISTA
do PRACA;
done
58
oskar.wycislak@gmail.com
for
[canto@localhost ~]$
for i in a b c d; do echo $i; done
a
b
c
d
59
oskar.wycislak@gmail.com
for, ciekawszy przykład
[canto@localhost ~]$
for i in *; do echo $i; done
backup.sh
d.sh
f.sh
hardcopy.2
nltk_data
space.sh
s.sh
veelobot
60
oskar.wycislak@gmail.com
for, jeszcze ciekawszy przykład
for i in 
$(netstat -an |
grep ^tcp |
grep -v LISTEN |
awk '{print $5}' |
awk -F ":" '{print $1}');
do
whois $i;
done
61
oskar.wycislak@gmail.com
for
[canto@localhost ~]$ for host in
$(cat plik_z_hostami); do ping -c1
$host; done
[canto@localhost ~]$ for host in
$(cat plik_z_hostami); do scp
/var/log/{messages,authlog,syslog,
costam_jeszcze} –i
~/.ssh/mój_tajny_klucz
ja@$host:/backup/logs/; done
62
oskar.wycislak@gmail.com
while
 while WARUNEK_JEST_PRAWDZIWY
do
coś coś coś
done
 W praktyce najczęściej używane do pętli nieskończonych
while true
do
ping -c1 host.domain;
sleep 10;
done
63
oskar.wycislak@gmail.com
until
 until WARUNEK_BĘDZIE_PRAWDZIWY
do
coś coś coś;
done
 until działa podobnie jak while z tą różnicą, że zawartość wykonuję się
dopóki warunek nie będzie prawdziwy włącznie
num=1;
until [ $num -eq 3 ]
do
((num++));
echo $num;
done
2
3
64
oskar.wycislak@gmail.com
break i continue
 break przerywa pętlę
 continue przechodzi do kolejnej iteracji
 Działa dla pętli for, while, until i select
65
oskar.wycislak@gmail.com
Funkcje
 Funkcja, zbiór komend
 function NAZWA { CIAŁO_FUNKCJI; }
NAZWA() { CIAŁO_FUNKCJI; }
 Parametry, działają tak samo jak w skrypcie, tj
$1..$n
66
oskar.wycislak@gmail.com
Praca w tle
 jobs, wyświetla liczbę zadań
 bg, wznawia zadanie w tle
 fg, wznawia zadanie
 kill, wysyła sygnał
 &, praca w tle
 Ctrl+z, przerwij
67
oskar.wycislak@gmail.com
Pułapki i sygnały
 Sygnał, co to jest sygnał
 Lista sygnałów w linuxie
 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47)
SIGRTMIN+13
 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52)
SIGRTMAX-12
 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-
7
 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-
2
 63) SIGRTMAX-1 64) SIGRTMAX
68
oskar.wycislak@gmail.com
trap
oskar.wycislak@gmail.com
69
 trap, przechwytuje sygnały
backup.sh
oskar.wycislak@gmail.com
70
#!/bin/bash
#Prosty skrypt do backupow
#
# version 0.1 - 06.5.2013 - Oskar Wycislak
#funkcja szukajaca i pakujaca
pakuj() {
if [ ! -d $1 ]
then
echo "Katalog $1 nie istnieje";
exit 1
fi
echo "Kopiuje pliki starsze niz 30 dni z $1 do $2";
mkdir -p $2;
find $1 -type f -mtime +30 2>/dev/null | xargs tar -zcvf $2/bak-$(date "+%d%m%y")-
$RANDOM.tar.gz;
}
backup.sh
oskar.wycislak@gmail.com
71
#kasowanie plikow
kasuj() {
find $1 -type f -mtime +30 -exec rm -f {} ;
2>/dev/null
}
co=${1:-"/var/log"};
gdzie=${2:-"/var/backup"};
backup.sh
oskar.wycislak@gmail.com
72
#ignoruj sygnal INT (ctrl+c)
trap "" SIGINT;
#dla kazdego katalogu podanego jako 1 parametr
for katalog in $co
do
#wykonaj funkcje pakujaca
pakuj $katalog $gdzie;
done
echo "Koniec."
Tablice
 tablica=(raz dwa trzy)
 echo ${tablica[1]}
 unset ${tablica[1]}
[canto@localhost ~]$
for i in ${tablica[@]}; do echo $i; done
raz
dwa
trzy
73
oskar.wycislak@gmail.com
Dodatki
 alias ls='echo "Segmentation Fault”’
mbp:~ canto$ ls –la
Segmentation Fault -la
 alias ls='echo "Segmentation Fault"; echo >
/dev/null’
mbp:~ canto$ ls –la
Segmentation Fault
74
oskar.wycislak@gmail.com
oskar.wycislak@gmail.com
75
:(){ :|:& };:

More Related Content

Viewers also liked

Invite media playbook
Invite media playbookInvite media playbook
Invite media playbook
AdCMO
 
Archiwizacja i kompresja zbiorów w systemie linux
Archiwizacja i kompresja zbiorów w systemie linuxArchiwizacja i kompresja zbiorów w systemie linux
Archiwizacja i kompresja zbiorów w systemie linuxJacek Tomczak
 
Linux on Windows - Zimowisko Linuksowe 2014
Linux on Windows - Zimowisko Linuksowe 2014Linux on Windows - Zimowisko Linuksowe 2014
Linux on Windows - Zimowisko Linuksowe 2014
Michał Smereczyński
 
Sejarah perkembangan kurikulum sejak indonesia merdeka
Sejarah perkembangan kurikulum sejak indonesia merdekaSejarah perkembangan kurikulum sejak indonesia merdeka
Sejarah perkembangan kurikulum sejak indonesia merdeka
Kurosaki_akira
 
Dodanie Prezentacji Z Slide Share Do Blog Engine
Dodanie Prezentacji Z Slide Share Do Blog EngineDodanie Prezentacji Z Slide Share Do Blog Engine
Dodanie Prezentacji Z Slide Share Do Blog Engine
daniel.plawgo
 
How to generate those leads all day everyday
How to generate those leads all day everydayHow to generate those leads all day everyday
How to generate those leads all day everyday
Michael King
 
Proyecto Pedgogico de Aula: Rescatando Mis Raíces
Proyecto Pedgogico de Aula: Rescatando Mis RaícesProyecto Pedgogico de Aula: Rescatando Mis Raíces
Proyecto Pedgogico de Aula: Rescatando Mis Raíces
ProyectoSPE2013
 
Breaking The Cross Domain Barrier
Breaking The Cross Domain BarrierBreaking The Cross Domain Barrier
Breaking The Cross Domain Barrier
Alex Sexton
 
Conozco mi cuerpo y lo cuido
Conozco mi cuerpo y lo cuidoConozco mi cuerpo y lo cuido
Conozco mi cuerpo y lo cuido
etorresl
 

Viewers also liked (9)

Invite media playbook
Invite media playbookInvite media playbook
Invite media playbook
 
Archiwizacja i kompresja zbiorów w systemie linux
Archiwizacja i kompresja zbiorów w systemie linuxArchiwizacja i kompresja zbiorów w systemie linux
Archiwizacja i kompresja zbiorów w systemie linux
 
Linux on Windows - Zimowisko Linuksowe 2014
Linux on Windows - Zimowisko Linuksowe 2014Linux on Windows - Zimowisko Linuksowe 2014
Linux on Windows - Zimowisko Linuksowe 2014
 
Sejarah perkembangan kurikulum sejak indonesia merdeka
Sejarah perkembangan kurikulum sejak indonesia merdekaSejarah perkembangan kurikulum sejak indonesia merdeka
Sejarah perkembangan kurikulum sejak indonesia merdeka
 
Dodanie Prezentacji Z Slide Share Do Blog Engine
Dodanie Prezentacji Z Slide Share Do Blog EngineDodanie Prezentacji Z Slide Share Do Blog Engine
Dodanie Prezentacji Z Slide Share Do Blog Engine
 
How to generate those leads all day everyday
How to generate those leads all day everydayHow to generate those leads all day everyday
How to generate those leads all day everyday
 
Proyecto Pedgogico de Aula: Rescatando Mis Raíces
Proyecto Pedgogico de Aula: Rescatando Mis RaícesProyecto Pedgogico de Aula: Rescatando Mis Raíces
Proyecto Pedgogico de Aula: Rescatando Mis Raíces
 
Breaking The Cross Domain Barrier
Breaking The Cross Domain BarrierBreaking The Cross Domain Barrier
Breaking The Cross Domain Barrier
 
Conozco mi cuerpo y lo cuido
Conozco mi cuerpo y lo cuidoConozco mi cuerpo y lo cuido
Conozco mi cuerpo y lo cuido
 

Linux command line - Przewodnik

  • 1. LINUX COMMAND LINE BASH I PRZYJACIELE Oskar Wyciślak (oskar.wycislak@gmail.com)
  • 2. Agenda  Co to jest powłoka?  Bash  Interaktywna praca  Metody wprowadzania (emacs, vi)  Pliki i katalogi  Historia i jej przeszukiwanie  Pliki konfiguracyjne  .bashrc  .bash_profile  Zmienne  Specjalne zmienne  Strumienie i potoki  Przydatne komendy  Wczytywanie danych  Co to jest skrypt?  Pierwszy skrypt 2 oskar.wycislak@gmail.com
  • 3. Agenda dzień 2  Dopełnianie  Arytmetyka  Instrukcje warunkowe  Logika  Pliki (czy istnieje np.)  If / case  test  Pętle  for  while  until  Funkcje  Praca w tle  Pułapki i sygnały  Tablice 3 oskar.wycislak@gmail.com
  • 4. Czym jest powłoka?  Program uruchamiający inne programy  Interfejs między użytkownikiem a systemem (jądrem).  Typy powłok  Tekstowe  Bash, linia poleceń windows  Graficzne  Windows explorer, fluxbox, xfce, kde, gnome 4 oskar.wycislak@gmail.com
  • 5. Bash <xxx> Pomorze ktos? <Unf> Niestety, mazowsze. <kubaaa> co robisz ? <kambys> nic <kambys> w pracy jestem 5 oskar.wycislak@gmail.com
  • 6. Bash – Bourne again shell Brian Fox Stworzył bash’a jak miał 30 lat. To znaczy, że mamy jeszcze czas! Jedna z najpopularniejszych powłok systemów Unixowych. Standard w większośći dystrybucji Linux’a oraz w OS X. 6 oskar.wycislak@gmail.com
  • 7. Praca interaktywna - emacs  bash/set –o emacs – standardowo  C(ctrl)-a – początek linii  C-e – koniec linii  C-f –znak do przodu  C-b –znak do tyłu  A(alt)-f – słowo do przodu  Słowo – litery i cyfry, znak specjalny przerywa słowo  A-b – słowo do tyłu  C-l – czyści ekran (clear)  C-k – kasuje wszystkie znaki za kursorem oraz znak pod kursorem  C-u – kasuje wszystkie znaki przed kursorem  C-w – kasuje jedno słowo przed kursorem  A-d – kasuje jedno słowo za kursorem  C-x C-u – cofnij  C-x C-e – otwiera edytor do edycji komend  A-# – komentuje linię i rozpoczyna nową 7 oskar.wycislak@gmail.com
  • 8. Praca interaktywna – vi  bash/set –o vi (tryb wprowadzania – input mode)  esc – tryb poleceń  i – wstaw znak przed kursorem  a – wstaw znak za kursorem  x – skasuj znak pod kursorem  h, l – lewo prawo, jeden znak  w, b – początek poprzedniego, kolejnego słowa  0, ^, $ - bezwzględny początek, pierwszy niebiały znak, koniec linii  % - pasujący nawias  D – kasuje wszystkie znaki za kursorem oraz znak pod kursorem  C-u – kasuje wszystkie znaki przed kursorem  u – cofnij  U – cofnij wszystkie  A(alt)-# - komentuje linię i rozpoczyna nową Można też # w trybie poleceń 8 oskar.wycislak@gmail.com
  • 9. Pliki i katalogi  ls – wyświetla listę plików oraz katalogów  -l – wyświetla informacje w postaci listy  -a – pokazuje również ukryte pliki i katalogi  pwd – pokazuje w jakim znajdujemy się aktualnie katalogu  cd – zmienia aktualny katalog na inny  chmod – zmienia uprawnienia  chown – zmienia właściciela  mkdir – tworzy katalog  -p – tworzy od razu całą ścieżkę  cp – kopiuje plik lub katalog  mv – przenosi plik lub katalog  rm – usuwa plik lub katalog 9 oskar.wycislak@gmail.com
  • 11. Historia  history  ~/.bash_history  shopt -s histverify  Zmienne środowiskowe  HISTFILE, HISTLIFE, HISTSIZE  HISTCONTROL  ignorespace:ignoredups  !, !!, !n, !-2  !!:gs/foo/bar/ - substytucje jak w sedzie  sudo !!  cd - to też historia ;-) 11 oskar.wycislak@gmail.com
  • 13. Pliki konfiguracyjne  .bashrc Wykonuje się z każdym odpaleniem powłoki zmienne, funkcje, etc  /etc/bashrc  ~/.bashrc  .bash_profile Wykonuje się za każdym interaktywnym logowaniem uptime, motd, etc  /etc/profile  ~/.bash_profile  Często załącza .bashrc http://tldp.org/LDP/abs/html/sample-bashrc.html 13 oskar.wycislak@gmail.com
  • 14. Zmienne  Czym jest zmienna?  Deklaracja zmiennych w Bash’u  bash$ zmienna=“wartość”;  bash$ unset zmienna;  export – zmienne lokalne oraz globalne  env i set  Wynik komendy w zmiennej  Średni sposób – bash$ zmienna=`ls`; - ``  Dobry sposób – bash$ zmienna=$(ls); - $() 14 oskar.wycislak@gmail.com
  • 15. Zmienne specjalne  $1, $2, $3 … $(10), $(11), … - parametry  $# - liczba przekazanych parametrów  $@ - tablica ze wszystkimi parametrami  Bardzo ważne – używając zmiennej $@ koniecznie brać ją w cudzysłów ( “$@” ). W przeciwnym wypadku przy iteracji np. w pętli mogą wystąpić problemy z przekazanymi parametrami.  $* - wszystkie parametry jako string  $0 – nazwa skryptu  $$ - PID procesu  $? – kod wyjścia ostatniej komendy  $! – PID ostatniego procesu odpalonego w tle 15 oskar.wycislak@gmail.com
  • 16. Zmienne systemowe  $HOME – katalog domowy  $HOSTNAME – nazwa hosta  $IFS – osobny slajd  $OLDPWD (cd -) – poprzedni katalog  $PATH – ścieżka wyszukiwania  $PPID – PID procesu matki  $PS1 – osobny slajd  $PWD – aktualny katalog  $RANDOM – losowa liczba całkowita http://tldp.org/LDP/abs/html/internalvariables.html 16 oskar.wycislak@gmail.com
  • 17. IFS – wewnętrzny separator pól IFS jest używany przez Bash do rozpoznawania słów (lub linii). Standardowo jest to znak biały, spacja, tabulator oraz znak nowej linii. mbp:~ canto$ IFS=“:" && for i in $(echo ”a:b:c:d"); do echo $i; done a b c d mbp:~ canto$ IFS=$’n’ && for i in $(cat); do echo $i; done a b c d aD b c d 17 oskar.wycislak@gmail.com
  • 18. IFS cd.  Dlaczego $’n’ a nie po prostu “n”?  $’n’ – jeden bajt mbp:~ canto$ echo -n $'n' | hexdump 0000000 0a 0000001  “n” – dwa bajty mbp:~ canto$ echo -n "n" | hexdump 0000000 5c 6e 0000002 18 oskar.wycislak@gmail.com
  • 20. Strumienie  Strumienie  stdin – standardowe wejście, fd 0  stdout – standardowe wyjście, fd 1  stderr – strumień błędów, fd 2  Przekierowanie strumienia  Wejścia <  Wyjścia >  Wyjścia do fd >&n 20 oskar.wycislak@gmail.com
  • 21. Potoki  Potok, pipe, |  Mechanizm komunikacji między procesami  Najczęściej łączy stdout pierwszego procesu z stdin drugiego cat plik | sed coś | grep coś | sort 21 oskar.wycislak@gmail.com
  • 22. Przydatne komendy i przełączniki  man  echo  touch  cat  grep  seq  cut  sort  uniq  paste  less  more Find head Tail tee Awk sed tr ps which wc wget/curl md5sum/digest 22 oskar.wycislak@gmail.com
  • 23. man, info, whatis/apropos  man man  -s - Sekcje  1 komendy  2 wywołania systemowe (syscall)  3 funkcje bibliotek  4 pliki specjalne  5 format plików  6 gry i wygaszacze ekranu  7 różne  8 komendy i demony administracyjne  9 wewnętrzne funkcje jądra  /usr/share/man, /usr/share/man/whatis  /usr/share/info 23 oskar.wycislak@gmail.com
  • 24. echo, touch, cat  echo – wyświetla dany tekst  -n  -e  Echo… echo… Wbudowane oraz /bin/echo  touch – uaktualnia ostatni czas dostępu oraz modyfikacji  Zwykle używany do tworzenia nowego pustego pliku  cat – łączy oraz wyświetla pliki  -v – wyświetla także znaki kontrolne  tac – odwrotność cat 24 oskar.wycislak@gmail.com
  • 25. grep  grep – Jedno z najczęściej używanych narzędzi, wyświetla linie pasujące do wzorca  -R – wyszukiwanie rekursywne  -A – pokaż n lini za znalezionym wzorcem  -B - pokaż n lini przed znalezionym wzorcem  -C - pokaż n lini za i przed znalezionym wzorcem  -c – pokaż ilość znalezionych lini  -i – ignoruje wielkość liter  -v – pokaż linie niepasujące do wzorca  -q – tryb cichy, nie wyświetla nic. Wychodzi z kodem błędu 0 jeśli wzorzec pasował lub 1 jeśli nie znaleziono pasujących linii bash$ netstat -an | grep -i listen bash$ grep –v –e ^# -e ^$ /etc/apache2/httpd.conf 25 oskar.wycislak@gmail.com
  • 26. seq, cut  seq – tworzy sekwencję liczb  -s – string pomiędzy liczbami, standardowo jest to nowa linia bash$ for i in $(seq 1 255); do ping -c 1 192.168.1.$i & done  cut – wycina zdefiniowane fragmenty pliku  -d – znak rodzielający  -f – pola, które zostaną wyświetlone  n, n,m, n-m bash$ cut -d : -f 1,5 /etc/passwd bash$ for i in $(seq 1 255); do ping -c 1 192.168.1.$i | grep “bytes from” | cut -d " " -f4 | cut -d : -f1 & done 26 oskar.wycislak@gmail.com
  • 27. sort  sort – sortuje plik tekstowy  -n - sortowanie numeryczne  -r - odwraca wynik sortowania  -f - ignoruje wielkość liter  -T - katalog na plik tymczasowy, bardzo przydatne przy sortowaniu plików większych niż ilość pamięci RAM  -u - nie wyświetla duplikatów  -k - ustaw klucz sortowania na pozycji n  -t - separator pól, często używane razem z –k bash$ sort –u –n –t. –k1,1 –k2,2 –k3,3 –k4,4 ip 27 oskar.wycislak@gmail.com
  • 28. uniq  uniq – filtruje unikalne linie w pliku. Plik musi być posortowany  -u – pokaż tylko unikalne linie  -d – pokaż tylko zduplikowane linie  -c – pokaż ilość wystąpień każdej linii  -i – ignoruj wielkość liter bash$ sort –n –t. –k1,1 –k2,2 –k3,3 –k4,4 ip | uniq -c 28 oskar.wycislak@gmail.com
  • 29. paste, less, more  paste – wyświetla linie plików obok siebie  less – pozwala przeglądać zawartość pliku  -f, działa jak tail –f, podąża za zmianami w pliku  more – uboga wersja less’a 29 oskar.wycislak@gmail.com
  • 30. find  find – wyszukuje pliki lub foldery  -type – typ  b - urządzenie blokowe  c – urządzenie “wskazujące”  d – katalog  f – plik  l – link symboliczny  p – kolejka fifo  s – gniazdo (socket)  -name – nazwa  -iname – nazwa bez rozróżniania wielkości liter  --maxdepth – “głębokość” wyszukiwania  -mtime, -atime, -ctime – czas od ostatniego zmodyfikowania, dostępu, stworzenia pliku  -exec – uruchomienie komendy, {} przekazuje ścieżkę  -ls – wykonuje ls na każdym znalezionym pliku/katalogu  -size – określa wyszukiwaną wielkość pliku  Logika - -and, -not, -or bash$ find /var/log -type f -mtime +30d -ls bash$ find /var/log -type f -mtime +30d -exec ls -la {} ; bash$ find / -type f ( -perm 4000 -or -perm 2000 ) -ls 30 oskar.wycislak@gmail.com
  • 31. head, tail, tee  head – wyświetla n pierwszych linii pliku  tail – wyświetla n ostatnich linii pliku  -f – tail będzie czekał aż na końcu pliku pojawią się nowe dane I je wyświetli  -F – lepsza wersja –f, nie wszędzie dostępna  tee – przyrządza herbatę kopiuje stdin do stdout oraz do pliku. Bardzo przydatne przy logowaniu bash$ netstat -an| tee /tmp/tee.out 31 oskar.wycislak@gmail.com
  • 32. awk  AWK – interpretowany język programowania bash$ cat /etc/passwd | awk –F ‘:’ ‘{print $1 “ “ $5}’ bash$ awk 'length > 64’ /etc/passwd bash$ awk NF plik bash$ awk 'FS=":" { if ($3 == 0) {print $0} }' /etc/passwd 32 oskar.wycislak@gmail.com
  • 33. sed  sed – edytor strumieniowy, używany do edycji tekstu bash$ sed s/jedno/drugie/ plik bash$ sed s/jedno/drugie_zawsze/g plik bash$ sed s/jedno/drugie/g plik1 > plik2 bash$ sed –i s/jedno/drugie/g plik1 bash$ sed ‘/^$/d’ plik bash$ sed ‘5d’ ~/.ssh/known_hosts 33 oskar.wycislak@gmail.com
  • 34. tr  tr – zamienia znak w strumieniu  -d – usuwa znak  [:class:] – zestaw znaków  alnum – znaki alfanumeryczne  alpha – znaki alfabetu  blank – białe znaki  cntrl – znaki kontrolne  digit – cyfry  lower – małe litery  upper – wielkie litery bash$ tr ‘[:lower:]’ ‘[:upper:]’ bash$ tr ‘n’ ‘ ‘ 34 oskar.wycislak@gmail.com
  • 35. ps  ps – wyświetla status procesów  -a – pokaż procesy innych użytkowników  -x – pokaż procesy bez terminali  -u – pokaż formacje o procesach  -o – opcje  user, pid, ppid, pgid, sess, jobc, state, tt, time, comm 35 oskar.wycislak@gmail.com
  • 36. Wczytywanie danych  read – wczytuje stdin do zmiennej/zmiennych while IFS=: read name passwd uid gid fullname ignore do echo "$name $fullname" done < /etc/passwd 36 oskar.wycislak@gmail.com
  • 37. Czym jest skrypt?  Listą komend dla interpretera  Narzędziem pracy administratora 37 oskar.wycislak@gmail.com
  • 38. Po co nam skrypty?  Automatyzować powtarzalne zadania  Udostępniać funkcjonalność dla innych użytkowników systemu  Upraszczać skomplikowane zadania  Planować pracę 38 oskar.wycislak@gmail.com
  • 39. Pierwszy skrypt #!/bin/bash #mój pierwszy super skrypt! - komentarz echo “Witaj świecie”; 39 oskar.wycislak@gmail.com
  • 40. Prosty skrypt wykonujący kopie zapasowe #!/bin/bash #To jest pierwsza bardzo prosta wersja skryptu do kopii zapasowych. #W kolejnej części będziemy ten skrypt ulepszać i dodawać nowe funkcjonalności echo "Kopiuje pliki starsze niz 30 dni z /var/log do /var/backup"; mkdir -p /var/backup; find /var/log/ -type f -mtime +30 | xargs tar -zcvf /var/backup/bak-$(date "+%d%m%y").tar.gz find /var/log/ -type f -mtime +30 –exec rm -f {} ; echo "Koniec." 40 oskar.wycislak@gmail.com
  • 41. Dopełnianie i rozwijanie  TAB  Komend  Nazw plików  Nazw zmiennych  Nawiasy klamrowe [canto@localhost ~]$ echo {a..z} a b c d e f g h i j k l m n o p q r s t u v w x y [canto@localhost ~]$ echo /var/tmp/{oskar,zdzisiek,marta.*} /var/tmp/oskar /var/tmp/zdzisiek /var/tmp/marta.* 41 oskar.wycislak@gmail.com
  • 42. Zamiany zmiennych (-.-)  ${foo:-bar}  Jeśli foo puste lub nie istnieje wyświetl bar, w przeciwnym wypadku wyświetl foo – zamiana  ${foo:=bar}  Tak jak powyżej z tą różnicą, iż zamiast zamiany następuje przypisanie (permamentne)  ${foo:?bar}  Jeśli foo jest puste lub nie istnieje zwróć błąd (stderr) i bar, w przeciwnym wypadku zwróć foo  ${foo:+bar}  Jeśli foo jest puste lub nie istnieje nie rób nic. Jeśli istnieje lub niepuste zamień na bar (zamiana)  ${#foo}  Zwraca długość foo lub ilość elementów jeśli foo jest tablicą  ${foo:ofset:długość}  Wyświetl długość znaków foo zaczynając od ofset 42 oskar.wycislak@gmail.com
  • 43. Ciekawsze zamiany zmiennych (-.-)  ${foo#bar}  Jeśli bar (regex) pasuje do początku foo wtedy zwróć foo pozbawiony tekstu do pierwszego dopasowania  ${foo##bar}  To samo co powyżej jednak zwraca foo pozbawione tekstu aż do ostatniego dopasowania [canto@localhost ~]$ export foo=/var/tmp/jacek.txt.bak.old [canto@localhost ~]$ echo ${foo#*.} txt.bak.old [canto@localhost ~]$ echo ${foo##*.} old  ${foo%bar}  Podobnie jak w przypadku „#” lecz zwraca foo pozbawione tekstu do pierwszego dopasowania od końca foo  ${foo%%bar}  Jak wyżej lecz po ostatnim dopasowaniu od końca foo [canto@localhost ~]$ echo ${foo%.*} /var/tmp/jacek.txt.bak [canto@localhost ~]$ echo ${foo%%.*} /var/tmp/jacek 43 oskar.wycislak@gmail.com
  • 44.  ${foo/wzorzec/bar}  Zamień (jeden) wzorzec w foo na bar  Jeśli wzorzec zaczyna się od  / - zamień wszystkie wystąpienia  # - dopasuj od początku foo  % - dopasuj od końca foo [canto@localhost ~]$ echo $foo a b c d e f g h i j k l m n o p q r s t u v w x y z+n [canto@localhost ~]$ echo ${foo//n/Z} a b c d e f g h i j k l m Z o p q r s t u v w x y z+Z [canto@localhost ~]$ echo ${foo/n/Z} a b c d e f g h i j k l m Z o p q r s t u v w x y z+n 44 oskar.wycislak@gmail.com
  • 45. Arytmetyka  $((2+2*2))  ++foo, --foo, foo++, foo--  &&, ||  Operacje logiczne (I i LUB)  &, |, ^  Operacje bitowe (I, LUB, XOR)  <=, >=, <, >, ==, != 45 oskar.wycislak@gmail.com
  • 48. [canto@localhost ~]$ if [ -f /var/log/messages1 ] > then > echo "Plik istnieje"; > else > echo "Plik NIE istnieje"; > fi Plik NIE istnieje 48 oskar.wycislak@gmail.com
  • 49. [ vs [[  [[, lepsze, nowsze, ciekawsze, więcej funkcji  Dostępne tylko w bashu  &&, ||, =~  [, dobre, przenośne 49 oskar.wycislak@gmail.com
  • 50. test  !, negacja wyrażenia  WYRAŻENIE -a WYRAŻENIE, „AND”, „i” oba wyrażenia są prawdziwe  WYRAŻENIE -o WYRAŻENIE, „OR”, „lub” jedno z wyrażeń jest prawdziwe Powyższe są niezalecane, nie powinno się ich używać a zamiast nich używać [[.  -b, plik istnieje i jest urządzeniem blokowym  -c, plik istnieje i jest urządzeniem znakowym  -d, plik istnieje i jest katalogiem (w linuxie wszystko jest plikiem ;-)  -e, plik istnieje  -f, plik istnieje i jest „normalnym” plikiem  -h, plik istnieje i jest linkiem symbolicznym  -k, plik istnieje i ma ustawiony sticky bit  -r, plik istnieje i mamy prawa do jego odczytu  -s, plik istnieje i ma wielkość większą niż 0  -w, plik istnieje i mamy prawo do zapisu w nim  -x, plik istnieje i mamy prawo do wykonania  TEXT == TEXT, prawda jeśli teksty są takie same  TEXT != TEXT, prawda jeśli teksty są różne  -eq, -ne, -ge, -gt, -le, -lt, porównywanie liczb, prawda jeśli, równe, różne, większe równe, większe, mniejsze równe, mniejsze 50 oskar.wycislak@gmail.com
  • 51. case case "$1" in start) # $1 == „start” start ;; stop) # $1 == „stop” stop ;; status) # $1 == „status” status ;; *) # $1 =~ „*”, czyli reszta echo $"Usage: $0 {start|stop|restart}" exit 1 esac 51 oskar.wycislak@gmail.com
  • 52. Przykład #!/bin/bash if [ -w "$1" ] then echo "Plik istnieje i mozemy do niego pisac"; wielkosc=$(du $1 | awk '{print $1}'); echo "Jego wielkosc to $wielkosc bajt/y/ow"; elif [ -f "$1" ] then echo "Plik istnieje ale nie mozemy do niego pisac"; else echo "Plik nie istnieje - $1"; fi 52 oskar.wycislak@gmail.com
  • 53. Przykład nr 2 #!/bin/bash if [ $1 == "costam" ] then echo "OK" else echo "NOK" fi 53 oskar.wycislak@gmail.com
  • 54. Przykład nr 2 lepiej #!/bin/bash if [ x$1 == "xcostam" ] then echo "OK" else echo "NOK" fi 54 oskar.wycislak@gmail.com
  • 55. Przykład nr 3 #!/bin/bash if [ x$1 == "x" ] then echo "Uzycie $0 nazwa_uzytkownika"; exit 1 fi grep -q $1 /etc/passwd if [ $? -eq 0 ] then echo "Uzytkownik $1 istnieje"; else echo "Uzytkownik $1 nie istnieje"; fi 55 oskar.wycislak@gmail.com
  • 56. backup.sh #!/bin/bash co=${1:-"/var/log"}; gdzie=${2:-"/var/backup"}; if [ ! -d $co ] then echo "Katalog $co nie istnieje"; exit 1 fi echo "Kopiuje pliki starsze niz 30 dni z $co do $gdzie"; mkdir -p $gdzie; find $co -type f -mtime +30 | xargs tar -zcvf $gdzie/bak-$(date "+%d%m%y").tar.gz find $co -type f -mtime +30 .exec rm -f {} ; echo "Koniec." 56 oskar.wycislak@gmail.com
  • 57. Pętle  for  while  until 57 oskar.wycislak@gmail.com
  • 58. for for ZMIENNA in LISTA do PRACA; done 58 oskar.wycislak@gmail.com
  • 59. for [canto@localhost ~]$ for i in a b c d; do echo $i; done a b c d 59 oskar.wycislak@gmail.com
  • 60. for, ciekawszy przykład [canto@localhost ~]$ for i in *; do echo $i; done backup.sh d.sh f.sh hardcopy.2 nltk_data space.sh s.sh veelobot 60 oskar.wycislak@gmail.com
  • 61. for, jeszcze ciekawszy przykład for i in $(netstat -an | grep ^tcp | grep -v LISTEN | awk '{print $5}' | awk -F ":" '{print $1}'); do whois $i; done 61 oskar.wycislak@gmail.com
  • 62. for [canto@localhost ~]$ for host in $(cat plik_z_hostami); do ping -c1 $host; done [canto@localhost ~]$ for host in $(cat plik_z_hostami); do scp /var/log/{messages,authlog,syslog, costam_jeszcze} –i ~/.ssh/mój_tajny_klucz ja@$host:/backup/logs/; done 62 oskar.wycislak@gmail.com
  • 63. while  while WARUNEK_JEST_PRAWDZIWY do coś coś coś done  W praktyce najczęściej używane do pętli nieskończonych while true do ping -c1 host.domain; sleep 10; done 63 oskar.wycislak@gmail.com
  • 64. until  until WARUNEK_BĘDZIE_PRAWDZIWY do coś coś coś; done  until działa podobnie jak while z tą różnicą, że zawartość wykonuję się dopóki warunek nie będzie prawdziwy włącznie num=1; until [ $num -eq 3 ] do ((num++)); echo $num; done 2 3 64 oskar.wycislak@gmail.com
  • 65. break i continue  break przerywa pętlę  continue przechodzi do kolejnej iteracji  Działa dla pętli for, while, until i select 65 oskar.wycislak@gmail.com
  • 66. Funkcje  Funkcja, zbiór komend  function NAZWA { CIAŁO_FUNKCJI; } NAZWA() { CIAŁO_FUNKCJI; }  Parametry, działają tak samo jak w skrypcie, tj $1..$n 66 oskar.wycislak@gmail.com
  • 67. Praca w tle  jobs, wyświetla liczbę zadań  bg, wznawia zadanie w tle  fg, wznawia zadanie  kill, wysyła sygnał  &, praca w tle  Ctrl+z, przerwij 67 oskar.wycislak@gmail.com
  • 68. Pułapki i sygnały  Sygnał, co to jest sygnał  Lista sygnałów w linuxie  1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP  6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1  11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM  16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP  21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ  26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR  31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3  38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8  43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13  48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12  53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX- 7  58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX- 2  63) SIGRTMAX-1 64) SIGRTMAX 68 oskar.wycislak@gmail.com
  • 70. backup.sh oskar.wycislak@gmail.com 70 #!/bin/bash #Prosty skrypt do backupow # # version 0.1 - 06.5.2013 - Oskar Wycislak #funkcja szukajaca i pakujaca pakuj() { if [ ! -d $1 ] then echo "Katalog $1 nie istnieje"; exit 1 fi echo "Kopiuje pliki starsze niz 30 dni z $1 do $2"; mkdir -p $2; find $1 -type f -mtime +30 2>/dev/null | xargs tar -zcvf $2/bak-$(date "+%d%m%y")- $RANDOM.tar.gz; }
  • 71. backup.sh oskar.wycislak@gmail.com 71 #kasowanie plikow kasuj() { find $1 -type f -mtime +30 -exec rm -f {} ; 2>/dev/null } co=${1:-"/var/log"}; gdzie=${2:-"/var/backup"};
  • 72. backup.sh oskar.wycislak@gmail.com 72 #ignoruj sygnal INT (ctrl+c) trap "" SIGINT; #dla kazdego katalogu podanego jako 1 parametr for katalog in $co do #wykonaj funkcje pakujaca pakuj $katalog $gdzie; done echo "Koniec."
  • 73. Tablice  tablica=(raz dwa trzy)  echo ${tablica[1]}  unset ${tablica[1]} [canto@localhost ~]$ for i in ${tablica[@]}; do echo $i; done raz dwa trzy 73 oskar.wycislak@gmail.com
  • 74. Dodatki  alias ls='echo "Segmentation Fault”’ mbp:~ canto$ ls –la Segmentation Fault -la  alias ls='echo "Segmentation Fault"; echo > /dev/null’ mbp:~ canto$ ls –la Segmentation Fault 74 oskar.wycislak@gmail.com

Editor's Notes

  1. 0 – przechodzi na początek lini ^ - pierwszy niebiały znak linii
  2. shopt -s histverify – nie wykonuje automatycznie komendy przy eventach (!) tylko czeka na enter/wkleja do konsoli !-2 – przed ostatnia komenda sudo !!
  3. env – pokazuje zmienne globalne set – pokazuje zmienne globalne i lokalne export zmienna – eksportuje export –n zmienna – czyni zmienną lokalną Brak $ (dolara) przy deklaracji zmiennej
  4. Najczęściej używane parametry
  5. Wspomnieć, że przekierowanie najpierw tworzy plik, czyli np. cat plik1 > plik1 nie zadziała.
  6. Whatis szuka całego stringa a apropos dopasowuje man –s5 passwd man –s3 printf
  7. -e – znaki specjalne echo –e hello /bin/echo –e hello
  8. A,b,C tylko gnu grep
  9. cut -d : -f 1,5 /etc/passwd
  10. sort -u -n -t. -k1,1 -k2,2 -k3,3 -k4,4 Można napisać szybciej bo zamiast 1,1 czy 2,2 dać 1 I 2 ale wtedy komenda będzie wykonywać się dłużej, zauważalne tylko przy dużych plikach
  11. 4000 – setuid 2000 – setgid 1000 – sticky bit
  12. tee standardowo tworzy za każdym razem nowy plik więc aby nadpisać dane trzeba użyć opcji -a
  13. awk NF – wyświetla plik bez pustych linii, tak naprawdę NF wyświetli ilość pół w linii, jeśli ilość pól będzie 0 (false) awk nie wyświetli linii
  14. Zamienia znaki a nie ciągi znaków!!!
  15. she-bang !# - magic /bin/bash – ścieżka
  16. Znajdź wyrażenie we wzorcu
  17. Anegdotka o sprawdzaniu wolnego miejsca poprzez zapełnianie dysku ;-)
  18. Dlaczego * a nie ls