23
1 PODSTAWY INFORMATYKI dr inż. Krzysztof Malecki Bash – literatura Wyklad zostal opracowany na podstawie materialów: http://www.ournet.pl/kursbasha/main.html

Bash 1 ----- wykład2i3

  • Upload
    kkk112

  • View
    559

  • Download
    1

Embed Size (px)

Citation preview

Page 1: Bash 1   -----     wykład2i3

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

Page 2: Bash 1   -----     wykład2i3

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

Page 3: Bash 1   -----     wykład2i3

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

Page 4: Bash 1   -----     wykład2i3

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… �

Page 5: Bash 1   -----     wykład2i3

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?

Page 6: Bash 1   -----     wykład2i3

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!!!

Page 7: Bash 1   -----     wykład2i3

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[*]}”

Page 8: Bash 1   -----     wykład2i3

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`"

Page 9: Bash 1   -----     wykład2i3

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)

Page 10: Bash 1   -----     wykład2i3

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

}

Page 11: Bash 1   -----     wykład2i3

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 !!!!

Page 12: Bash 1   -----     wykład2i3

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 !!!

Page 13: Bash 1   -----     wykład2i3

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"

Page 14: Bash 1   -----     wykład2i3

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

Page 15: Bash 1   -----     wykład2i3

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!!!

Page 16: Bash 1   -----     wykład2i3

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

Page 17: Bash 1   -----     wykład2i3

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

Page 18: Bash 1   -----     wykład2i3

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.

Page 19: Bash 1   -----     wykład2i3

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?

Page 20: Bash 1   -----     wykład2i3

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"

Page 21: Bash 1   -----     wykład2i3

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.

Page 22: Bash 1   -----     wykład2i3

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.

Page 23: Bash 1   -----     wykład2i3

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ę