bash 1 ----- wykład2i3
TRANSCRIPT
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
Bash
• BASH (ang. Bourne Again SHell) to stworzony przezBriana Foxa i Cheta Rameya zgodny z sh interpreterpoleceń, łączący w sobie zalety shella Korna (ksh) i C-
shella (csh).
• BASH to najbardziej popularna powłoka używana nasystemach unixowych, jest też skryptowym językiemprogramowania, umożliwiającym efektywne zarządzaniesystemem.
• Skrypt – to niekompilowany tekstowy plik wykonywalny,zawierający pewne polecenia systemowe oraz poleceniasterujące jego wykonaniem (instrukcje, pętle itp.).Wykonywany jest tylko i wyłącznie przez interpreter(np. /bin/bash), który tłumaczy polecenia zawarte wskrypcie 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
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
Echo
• $ echo Angielskie I’m
• $ echo ‘Angielskie I’\’’m’
• W tym przypadku zapis ‘\’’ (apostrof, backslash, apostrof,apostrof) zadziała tak jakby apostrof znajdował się wciągu znaków objętych apostrofami. Pierwszy znak ‘ wciągu ‘\’’ kończy pierwszy ciąg objęty apostrofami(‘Angielskie I’), \’ dodaje znak apostrofu, a następnyapostrof rozpoczyna kolejny ciąg znaków objętyapostrofami, 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
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
read
• Polecenie read – czyta ze standardowego wejściapojedynczy 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ławcześniej, to jej zawartość zostanie zastąpiona tym cowpisaliśmy.
Wprowadzenie danych do zmiennej
imie
read – cd.
Przykład:
#!/bin/bash
echo „Wpisz coś:”
answer=„napis”
read
echo „$answer”
Sposób zapisu!!!
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
Cytowanie
Znaki cytowania służą do usuwania interpretacjiznakó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 dzwonek\a„
echo "Polecenie date pokaże: `date`"
9
Cytowanie – cd.
• apostrof (ang. single quote): ' '
– Wszystko co ujęte w znaki apostrofutraktowane jest jak łańcuch tekstowy, apostrofwyłącza interpretowanie wszystkich znakówspecjalnych, znaki traktowane są jak zwykłeznaki.
• Przykład:
#!/bin/bash
echo '$USER' #nie wypisze loginu!!!
Cytowanie – cd.
• odwrotny apostrof (ang. backquote): ` `
– umożliwia zacytowanie polecenia, bardzo przydatne jeśli chcesię 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
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 wskrypcie powtarza się jakaś grupa poleceń.
• Do danej funkcji odwołujemy się podając jej nazwę, awykonane zostanie wszystko, co wpisaliśmy międzynawiasy { }.
• Funkcje skracają znacznie długość skryptu.
• Składnia:
function nazwa_funkcji
{
polecenie1
polecenie2
…
}
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 uczyninasz skrypt bardziej przejrzystym i wygodnym, tworzysię 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
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órymwywoł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
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
Zmienne specjalne(ang. special variables, special parameters)
To najbardziej prywatne zmienne powłoki, są udostępnianeuż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żemodyfikować 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ą żadneparametry $@ 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
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 wszystkichprocesó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
Zmienne środowiskowe – cd.
• Inicjacja zmiennej globalnej:
export x="napis"
– Teraz zmienna x będzie widoczna w podshellach. Polecenieexport nadaje wskazanym zmiennym atrybut zmiennychglobalnych.
– Polecenie export -p pozwala uzyskać listę aktualnieeksportowanych 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
Zmienne tablicowe
• BASH pozwala na stosowanie zmiennych tablicowychjednowymiarowych.
• Tablica? Zmienna, która przechowuje listę pewnychwartoś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
Zmienne tablicowe – cd.
Można też uzyskać długość (liczba znaków) danegoelementu 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 linuxz dwoma
elementami.
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
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
Strumienie danych
• stdin (ang. standard input), standardowe wejście, skądproces pobiera dane, domyślnie jest to klawiatura
• stdout (ang. standard output) to standardowe wyjście,wysyłany jest tam wynik działania procesu, domyślnieekran
• stderr (ang. standard error), standardowe wyjściebłędów, tam trafiają wszystkie komunikaty o błędach,domyślnie ekran
Deskryptory plików
• Linux wszystko traktuje jako plik, niezależnie od tego czyto jest plik zwykły, katalog, urządzenie blokowe(klawiatura, ekran) itd.
• Tak samo jest ze strumieniami, BASH identyfikuje je zapomocą 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żnamanipulować strumieniami, poprzez przypisaniedeskryptorów: 0, 1, 2 innym plikom, niż tymreprezentującym klawiaturę i ekran.
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: slackawareredhatdebiancaldera
Przełączanie standardowego wyjścia
• Wynik jakiegoś polecenia można wysłać do pliku (znadpisaniem 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 zostanieutworzony, 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
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ę