Bash

37

description

Bash. Bourne Again SHell. Co to jest bash?. bash – powłoka systemowa UNIX napisana dla projektu GNU. Nazwa jest akronimem od Bourne-Again Shell (ang. znowu powłoka Bourne'a ). Jest to jedna z najpopularniejszych powłok systemów - PowerPoint PPT Presentation

Transcript of Bash

Page 1: Bash
Page 2: Bash

Co to jest bash?bash – powłoka systemowa UNIX napisana dla projektu GNU. Nazwa jest akronimem od Bourne-Again Shell (ang. znowu powłokaBourne'a). Jest to jedna z najpopularniejszych powłok systemów uniksowych. Wywodzi się od powłoki Bourne'a sh, która była jedną z pierwszych i najważniejszych powłok systemu UNIX, i zawiera pomysłyzawarte w powłokach Korna i csh. Pierwotna powłoka Bourne'a była tworzona przez Stephena Bourne'a. Bash był pisany głównie przez Briana Foxa i Cheta Rameya w roku 1987. Bash jest domyślną powłoką w większości dystrybucji systemu GNU/Linux oraz w systemie Mac OS X w wersji 10.4 Tiger. Istnieją także wersje dla większości Systemów Unixowych. Bash jest także domyślną powłoką w środowisku Cygwin dla systemów Win32. Program jest rozprowadzanyna licencji GPL.

Page 3: Bash

Podstawy#!/bin/bash

#Tu jest komentarz.

echo "Hello world"

#! – wskazuje rodzaj powłoki w jakiej skrypt ma być

wykonany, ten przykładowy będzie wykonywany przez

interpreter poleceń /bin/bash niezależnie od tego jakiego

rodzaju powłoki w danej chwili używamy.

# – oznacza komentarz, wszystko co będzie stało za tym

znakiem samej linii, jest pomijane przez interpreter

echo "Hello world" – Wydrukuje na standardowym wyjściu

Page 4: Bash

Uruchamianie skryptu

Aby móc uruchomić skrypt należy mu nadać atrybut wykonywalności za pomocą polecenia:

chmod +x naszskrypt

Jeśli katalog bieżący w którym znajduje się skrypt nie jest dopisany do zmiennej PATH, to nasz skrypt możemy uruchomić w ten sposób:

./naszskrypt

Page 5: Bash

Polecenie echo Składnia:#!/bin/bash echo -ne "jakiś napis" # -ne to parametry formatujące

Można też pisać do pliku. W tym wypadku echo wydrukuje tekst do pliku, ale zmaże całą jego wcześniejszą zawartość, jeśli plik podany na standardowym wyjściu nie istnieje, zostanieutworzony:

echo "jakiś napis" > plik

Tutaj napis zostanie dopisany na końcu pliku, nie zmaże jegowcześniejszej zawartości:

echo "jakiś napis" >> plik

Page 6: Bash

Parametry echo

• \a czyli alert, usłyszysz 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 7: Bash

Słowa zastrzeżone

! case do done elif else esac fi for function if in select then until while { }

[ ] time

Page 8: Bash

CytowanieZnaki cytowania służą do usuwania interpretacji znaków specjalnychprzez powłokę. Wyróżniamy nastepujące znaki cytowania: • cudzysłów " " Między cudzysłowami umieszcza się tekst, wartości zmiennychzawierające spacje. Cudzysłowy zachowują znaczenie specjalne trzechznaków: 1. $ - wskazuje na nazwę zmiennej, umożliwiając podstawienie jej

wartości 2. \ - znak maskujący 3. ` ` - odwrotny apostrof, umożliwia zacytowanie polecenia

Przykład: #!/bin/bash x=2 echo "Wartość zmiennej x to $x" #wydrukuje Wartość zmiennej x to 2echo -ne "Usłyszysz dzwonek\a" echo "Polecenie date pokaże: `date`"

Page 9: Bash

• apostrof ' ' Wszystko co ujęte w znaki apostrofu traktowane jest jak łańcuch tekstowy, apostrof wyłącza interpretowanie wszystkich znaków specjalnych, traktowane są jak zwykłe znaki.

Przykład: #!/bin/bash echo '$USER' #nie wypisze twojego loginu • odwrotny apostrof ` ` umożliwia zacytowanie polecenia, bardzo przydatne jeśli chce się podstawić pod zmienną wynik jakiegoś polecenia

Przykład: #!/bin/bash x=`ls -la $PWD` echo $x

pokaże rezultat polecenia alternatywny zapis, który ma takiesamo działanie wygląda tak: #!/bin/bash echo $(ls -la $PWD)

Page 10: Bash

• backslash czyli znak maskujący \ Jego

działanie najlepiej wyjaśnić na przykładzie

Skryptu wymuszającego pojawienie się

napisu $HOME

Przykład:

echo "$HOME" #wydrukuje /home/ja

aby wyłączyć interpretacje przez powłokę tej

zmiennej, trzeba napisać:

echo \$HOME #i jest napis $HOME

Page 11: Bash

Zmienne programowe To zmienne definiowane samodzielnie przez użytkownika. nazwa_zmiennej="wartość"

Na przykład: x="napis"

Na co należy uważać? Nie może być spacji po obu stronach znaku równości!

Do zmiennej odwołujemy się poprzez podanie jej nazwy poprzedzonej znakiem $ i tak dla zmiennej x może to wyglądaćnastępująco:echo $x

Page 12: Bash

Pod zmienną możemy podstawić wynik jakiegośpolecenia, można to zrobić na dwa sposoby: 1) Poprzez użycie odwrotnych apostrofów – `polecenie`

Przykład: #!/bin/bash GDZIE_JESTEM=`pwd` echo "Jestem w katalogu $GDZIE_JESTEM„ Wartością zmiennej GDZIE_JESTEM jest wynik działania polecenia pwd, które wypisze nazwękatalogu w jakim się w danej chwili znajdujemy.

Page 13: Bash

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

Zmienne specjalne To najbardziej prywatne zmienne powłoki,są udostępniane użytkownikowi tylko doodczytu (są wyjątki). Oto kilka przykładów:

1) $0 nazwa bieżącego skryptu lub powłoki

#!/bin/bash echo "$0" #Polecenie pokaże nazwę naszego skryptu.

2) $1, $2 … $9Parametry przekazywane do skryptu (wyjątek, użytkownik może modyfikować ten rodzaj zmiennych specjalnych. #!/bin/bash echo "$1 $2 $3"

Jeśli wywołamy skrypt z jakimiś parametrami to przypisane zostaną zmiennym: od $1 do $9.

Page 15: Bash

3) $@ Pokaże wszystkie parametry przekazywane do skryptu, równoważne $1, $2…$9. Jeśli nie podane są żadne parametry $@ interpretowana jest jako nic.

Przykład: #!/bin/bash echo "Skrypt uruchomiono z parametrami: $@"

Po wywołaniu skrypty zawierające powyższą linijkę jakimiśparametrami, np.:

./plik -a d

Otrzymamy następujący efekt: Skrypt uruchomiono z parametrami -a d

Page 16: Bash

4) $?

kod powrotu ostatnio wykonywanego polecenia

5) $$

PID procesu bieżącej powłoki

Page 17: Bash

Zmienne środowiskoweDefiniują środowisko użytkownika, dostępne dla wszystkich procesów potomnych.

Możnaje podzielić na:• globalne - widoczne w każdym podshellu • lokalne - widoczne tylko dla tego shella w którym został ustawione

Inicjacja zmiennych globalnych:export nazwa_zmiennej= " wartosc„

Samo polecenie export powoduje uzyskanie listy wszystkich zmiennych globalnych. Na tej liście przed nazwą każdej zmiennej znajduje sięzapis: declare-x czyli wewnętrzne polecenie BASH-a, służące do definiowania zmiennych i nadawania im atrybutów.-x to atrybut eksportu (czyli samo co polecenie export).

Niektóre przykłady zmiennych środowiskowych:

• $HOME - ścieżka do twojego katalogu domowego• $USER - twój login• $HOSTNAME -nazwa twojego hosta• $OSTYPE -rodzaj systemu operacyjnego

Page 18: Bash

Zmienne tablicowe

BASH pozwala na stosowanie zmiennych tablicowychjednowymiarowych. Przechowują one listę jakichś 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)

Page 19: Bash

Składnia:${nazwa_zmiennej[wskaźnik]}

Przykład:#!/bin/bashtablica=(element1 element2 element3)echo ${tablica[*]} #spowoduje wyświetlenie wszystkich elementów tablicyecho ${#tablica[0]} #wyświetli długość danego elementu tablicyecho ${#tablica[@]} #wyświetli ilość elementów tablicy

Inne schematy składniowe:Dodawanie elementów tablicy nazwa_zmiennej[wskaźnik]=wartość

Usuwanie elementów tablicy:unset nazwa_zmiennej[wskaźnik]

Usuniecie całej zawartości tablicy:unset tablica[*]

Page 20: Bash

Strumienie danychKażdy uruchomiony w Linuxie proces skądś pobiera dane, gdzieś wysyła wyniki swojego działania i komunikaty o błędach. Tak więc procesowi przypisane są trzystrumienie danych:1) stdin (ang. standard input) czyli standardowe wejście, skąd proces pobiera dane,

domyślnie jest to klawiatura 2) stdout (ang. standard otuput) to standardowe wyjście, gdzie wysyłany jest wynik

działania procesu, domyślnie to ekran 3) stderr (ang. standard error) standardowe wyjście błędów, tam trafiają wszystkie

komunikaty o błędach, domyślnie ekran

BASH identyfikuje je za pomocą przyporządkowanych im liczb całkowitych (od 0 do 2) tak zwanych 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

Zamiast klawiatury jako standardowe wejście można otworzyć plik następującą komendą: < plik. Podobnie można uczynić z wyjściem za pomocą komend: > plik - zapis do pliku, powodujący usunięcie wcześniejszych danych lub >> plik - dopisanie danych na końcu pliku

Page 21: Bash

Instrukcja warunkowa if

Składnia: if [warunekA]then

polecenie1elif [warunekB]

polecenie2elif [warunekC]

polecenie3else

polecenie4fi

Warunek ma postać[ wyrażenie1 operator wyrażenie2 ]

Page 22: Bash

Instrukcja case

Pozwala na dokonanie wyboru spośród kilku wzorców.

Składnia:case zmienna in

"wzorzec1") polecenie1 ;;"wzorzec2") polecenie2 ;;"wzorzec3") polecenie3 ;;*) polecenie_domyślne

esac

Page 23: Bash

Przykłady operatorów• -a plik istnieje • -b plik istnieje i jest blokowym plikiem specjalnym • - plik istnieje i jest plikiem znakowym • -e plik istnieje • -h plik istnieje i jest linkiem symbolicznym • = sprawdza czy wyrażenia są równe • != sprawdza czy wyrażenia są różne • -n wyrażenie ma długość większą niż 0 • -d wyrażenie istnieje i jest katalogiem • -z wyrażenie ma zerową długość • -r można czytać plik • -w można zapisywać do pliku • -x można plik wykonać • -f plik istnieje i jest plikiem zwykłym • -p plik jest łączem nazwanym • -N plik istnieje i był zmieniany od czasu jego ostatniego odczytu • plik1 -nt plik2 plik1 jest nowszy od pliku2 • plik1 -ot plik2 plik1 jest starszy od pliku2 • -lt mniejsze niż • -gt większe niż • -ge większe lub równe • -le mniejsze lub równe

Page 24: Bash

Pętla forWykonuje polecenia zawarte wewnątrz pętli, na każdym

składniku listy

Składnia:for zmienna in listado poleceniedone

Przykład – zmiana nazw plików pisaneych DUZYMI literami na pisane małymi literami:

#!/bin/bashfor nazwa in *do mv $nazwa `echo $nazwa tr '[A-Z]' '[a-z]'`done

Page 25: Bash

Pętla select

Generuje z listy słów proste ponumerowane menu, każdej pozycji odpowiada kolejna liczba od 1 wzwyż. Poniżej menu znajduje się znak zachęty gdzie wpisujemy cyfrę odpowiadającą wybranej pozycji.

To co wpisaliśmy zachowywane jest w zmiennej REPLYPętla działa dotąd dopóki nie wykonane zostaje polecenie break

lub return

Składnia:

select zmienna in listado poleceniedone

Page 26: Bash

Przykład – instrukcja case wewnątrz pętli:

#!/bin/bashecho "Co wybierasz?"select y in X Y Z Quitdo case $y in "X") echo "Wybrałeś X" ;; "Y") echo "Wybrałeś Y" ;; "Z") echo "Wybrałeś Z" ;; "Quit") exit ;; *) echo "Nic nie wybrałeś" esacbreakdoneWyświetli:

Co wybierasz?1) X2) Y3) Z4) Quit#?

Page 27: Bash

Pętla while

Sprawdza, czy warunek jest prawdziwy, jeśli tak – wykonywane są polecenia wewnątrz pętli

Składnia:while warunekdo poleceniedone

Przykład:

#!/bin/bashx=1;while [ $x -le 10 ]; do echo "Napis pojawił się po raz: $x" x=$[x + 1]done

Page 28: Bash

Pętla until

Sprawdza czy warunek jest prawdziwy, gdy jest fałszywy wykonywane są polecenia wewnątrz pętli.

Pętla until kończy swoje działanie w momencie gdy warunek stanie się prawdziwy.

Składnia:until warunekdo poleceniedone

Page 29: Bash

Pobieranie danych – polecenie readSkładnia:read -opcje nazwa_zmiennej

Można przypisać wartości kilku zmiennym:read zmienna1 zmienna2

Opcje:

•-p - wyświetli opis tego, co należy wprowadzić, np:read -p "Wprowadź coś: " zmienna

•-a - kolejne wartości rozdzielane przez znak spacji będązapisane w zmiennej tablicowej

•-e - można nie podawać nazwy zmiennej,wprowadzony tekst trafi do $REPLY

read -e

Page 30: Bash

Funkcje

Stosuje się je 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 { }

Składnia:function nazwa_funkcji{polecenie1polecenie2}

Funkcje mogą się znajdować w oddzielnym pliku, aby wywołać taką funkcję należy wpisać:

. ~/plik_z_funkcjaminazwa_funkcji

Page 31: Bash

Obliczenia arytmetyczneSkładnia: $((wyrażenie)) lub $[wyrażenie]

Przykład: #!/bin/bashecho $((8/2))wynik=$[4*5/2]echo "$wynik"

Obliczenia wykonywane są na liczbach całkowitych.

Inny sposób – polecenie let:

#!/bin/bashliczba1=5liczba2=6let wynik=liczba1*liczba2echo $wynik

Page 32: Bash

Okna dialogoweSkładnia:dialog opcje rodzaj_okna

Rodzaje okien dialogowych:

yesno wybór między tak lub niemenu pokazuje menu, można wybrać tylko jeden elementchecklist pokazuje menu, można wybrać wiele elementówradiolist pokazuje menu, można wybrać tylko jeden elementinputbox wpisuje się do niego danemsgbox wyświetla komunikatinfobox informuje o stanie operacjitextbox wyswietla zawartość pliku tekstowegogauge pokazuje miarkę

Opcje: --clear czyści ekran --title Tytuł, na górze okna dialogowego. --backtitle Podtytuł, w tle okna dialogowego, znajduje się w lewym

górnym rogu ekranu.

Page 33: Bash

Okno yesnoSkładnia:--yesno tekst wysokość szerokość

Przykład:#!/bin/bashdialog --title "Okno yesno" \--backtitle "Tytuł w tle" \--yesno "Wybierz tak lub nie." 5 30

Page 34: Bash

Okno menuSkładnia:--menu tekst wysokość szerokość wysokość_menu element opis

Przykład:#!/bin/bashdialog --title "Okno menu" \--menu "Menu" 9 50 3 \1 jeden \2 dwa \3 trzy \4 cztery

Page 35: Bash

Okno checklistSkładnia:--checklist tekst wysokość szerokość wysokość_listy

Przykład:#!/bin/bashdialog --clear --separate-output --title "Okno checklist" \

--checklist \"Tu można zaznaczać wiele wpisów naraz:" 10 70 4 \

"1" "pierwszy element" "off" \"2" "drugi element" "off" \"3" "trzeci element" "off" \"4" "tu zaznaczone domyślnie" "on" \2>/tmp/input.$$echo `cat /tmp/input.$$`

Page 36: Bash

Okno radiolistTo samo co checklist, ale można wybrać jeden element

Składnia:--radiolist tekst wysokość szerokość wysokość_listy

Page 37: Bash

Okno inputboxSkładnia:

--inputbox tekst wysokość szerokość

Przykład:#!/bin/bashdialog --title "Okno inputbox" \--inputbox "Pobieranie danych od użytkownika" 8 40 "Tu wpisz dane"

Exit Status - $?0 OK1 Cancel255 Escape