SO powloka


Wprowadzenie
Shell jest podstawowym narzędziem administratora systemów takich jak:
" Berkley UNIX (BSD)
" AT&T System V Release 4
" SunOS/Solaris
" XENIX
" SCO
" LUNIX
Służy do upraszczania zadań codziennych, okresowych jak i rzadszych np. backup
o ustalonej godzinie. Shell może być użyty do mniej wymagających zadań jak na
przykład powiadamianie użytkowników o plikach czy zadaniach.
Możliwości skryptów w shellu zależą od wyobrazni programisty jak i narzędzi
dostępnych w powłoce.
Shelle systemu UNIX
Nazwa Znak
Shell Autor
programu gotowości
S. R. Bourne
Bourne sh $
David Korn
Korn ksh $
Bill Joy
C csh %
Free Software
Foundation
Bash bash $
Shelle systemu UNIX
Oryginalny shell został przepisany przez S R. Bourne a około 1975 roku. W
efekcie postała wersja shella znana jako shell Bourne a, która działa w
większości systemów UNIX.
Bill Joy wraz ze studentami z uniwersytetu w Berkley stworzył inną wersję
shella, znaną jako shell C, króra jest użyteczna dla programistów jezyka C.
David Korn z AT&T stworzył shell Korna, który zachowuje funkcjonalność
shella Bourne a i zawiera wiele dodatkowych, silnych rozszerzeń.
Shell Bash (którego nazwa jest skrótem od Bourne again shell) został
opracowany prze Free Software Foundation, na czele którego stoi Richard
Stallman. Shell ten jest standardowo wyposażany w systemie LINUX. Posiada
mnóstwo usprawnień w stosunku do innch.
Shelle systemu UNIX
Funkcja Bourne Korn Bash C
Dostępność Wszystkie Prawie Dostępny dla UNIX Berkley,
systemy wszystkie większości niektóre
komercyjne systemy systemów Systemy V
komercyjne (wymaga
instalacji)
Zmienne Lokalne Lokalne Lokalne Lokalne (set)
Globalne Globalne Globalne Globalne
(export) (export) (export) (setenv)
Obliczanie test, expr Bezpośrednio Bezpośrednio Bezpośrednio
warunków
Interakcyjne history, history, history
Edycja Edycja
Aliasy Alias Funkcje, Funkcje, alias
alias alias
Sygnały trap trap trap
Wydajność Szybki Średni Średni Średni
Shelle systemu UNIX
Funkcja Bourne Korn Bash C
Bourne Korn Bash C
Instrukcje if-then-else-fi if-then-else-fi if-then-else-fi if-then-else-
sterujące endif
case-esac case-esac case-esac
switch-case-
endsw
select select
for-do-done for-do-done for-do-done
foreach-
xargs xargs Xargs
repeat
while-do-done while-do-done while-do-done
while-end
until-do-done until-do-done
Polecenia wbudowane
Polecenia wbudowane
Shell ze względów wydajnościowych ma wiele poleceń wbudowanych. Shell
Bourne'a ma tych poleceń najmniej i wiele czynności jest wykonywanych tu za
pomocą poleceń zewnętrznych. Z tego względu jest on najmniejszy i najszybszy
z omawainych shelli.
Shell Shell Shell Bash działanie
Bourne'a Korna
: : : polecenie puste
. . . wykonaj polecenia z pliku
alias alias utwórz aliaz polecenia
bg bg umieść zadanie do wykonania w drugim planie
bind dowiąż sekwencję klawiszy do funkcji biblioteki
readline; wykorzystuje się to do edycji wiersza
polecenia
break break break wyjdz z pętli FOR lub WHILE
builtin wykonaj polecenie wbudowane z tej tabeli, w tenm
sposób unkia się wykonania funkcji o takiej samej
nazwie, jak wbudowane polecenie
cd cd cd zmień katalog bierzący
command wykonaj polecenia z pominięciem sprawdzania
funkcji
Polecenia wbudowane
Shell Bourne'a Shell Korna Shell Bash działanie
continue continue continue wykonaj kolejną iterację pętli FOR lub WHILE
declare deklaracja zmiennej i podanie jej atrybutów
dirs wyświetl nazwy katalogów zapamiętane za pomocą
polecenia pushd
echo echo echo wpisz argumenty na standardowe wyjście (stdout)
enable zezwalanie/zabranianie wykonywania poleceń
wbudowanych
eval eval eval podstaw wartości argumentów i wykonaj
exec exec exec wykonaj argument
exit exit exit wyjdz z programu shellowego (skryptu)
export export export utwórz zmienną globalną
fc fc wywołaj mechanizm edycji poleceń
fg fg przesuń zadanie do pierwszego planu
getopts getopts getopts przetwarzanie parametrów pozycyjnych przekazanych do
shella
hash hash pamiętaj pełną ścieżkę argumentów
help wyświetl informację na temat wbudowanych poleceń
Polecenia wbudowane
Shell Bourne'a Shell Korna Shell Bash działanie
history wyświetl historię wykonanych poleceń
jobs jobs wyświetl listę aktywnych zadań
kill kill wyślij sygnał kończoncy zadanie
let let oblicz wartość wyrażenia arytmetycznego
local utwórz zmienną lokalną o ograniczonym zasięgu
logout zakończ wykonywanie shella obsługującego sesję
newgrp newgrp zmień grupę użytkownika
popd usuń katalog ze stosu
print wyświetl na standardowym wyjściu
priv ustaw lub wyświetl przywileje
pushd umieść katalog na stosie
pwd pwd pwd wyświetl pełną nazwę bieżącego katalogu roboczego
read read read wczytaj wiersz ze standardowego wejścia
readonly readonly readonly ustaw tryb zmiennej "tylko do odczytu"
return return return wyjście z funkcji z określoną wartością
set set set ustaw opcje i parametry pozycyjne skryptu
Polecenia wbudowane
Shell Bourne'a Shell Korna Shell Bash działanie
przesuń parametry pozycyjne skryptu
shift shift shift
zawieś wykonywanie bieżącego shella
suspend
oblicz wartości wyrażenia warunkowego
test test
wyświetl czasy wykonywania
times times times
zarządzanie sygnałami związanymi z wykonywaniem poleceń
trap trap trap
wyświetl pełną nazwę ścieżkową polecenia do wykonania
type type
ustaw atrybuty zmiennej, podobnie do polecenia declare w
typeset typeset
shellu Bash
ustaw ograniczenia dla zasobów
ulimit ulimit ulimit
ustaw domyślnych prawa dostępu do plików i katalogów
umask umask umask
usuń alias
unalias unalias
usuń ustawienie zmiennej lokalnej
unset unset unset
czekaj na zakończenie procesu drugoplanowego
wait wait wait
wyświetl pełną nazwę ścieżkową polecenia do wykonania,
whence
działanie podobne do polecenia type w innych shellach
Metaznaki
Metaznaki
Shell zakłada, że w wierszu polecenia wszystko co nie jest poleceniem lub opcją,
jest plikiem zwykłym, katalogiem lub plikiem specjalnym. Aby można było łatwiej
posługiwać się nazwami plików i katalogów shlell posiada metaznakie które:
" pozwalają oszczędnie pisać
" zachęcają do stosowania pewnych konwencji nazw
" upraszczają programowanie w języku shell.
Metaznaki generowania nazw plików/katalogów:
Metaznak Opis
* dopasuj dowolny łańcuch znaków (włączając pusty)
? dopasuj pojedyńczy znak alfanumeryczny
[& ] dopasuj poledyńczy znak lub zestaw znaków z
nawiasów
?(lista_wzorców) dopasuj dowolny wzorzec z listy; lista to zestaw jednego
lub więcej wzorców rozdzielonych znakiem |
*(lista_wzorców) dopasuj zero lub więcej wzorców z listy
+(lista_wzorców) dopasuj jeden lub więcej wzorców z listy
Metaznaki
Metaznak Opis
@(lista_wzorców) dopasuj tylko jeden wzorzec z listy
!(lista_wzorców) dopasuj dowolny znak oprócz znaków zawartych we wzorcach
listy
~ zastąp znak katalogiem osobistym
~- zastąp znaki poprzednim katalogiem roboczym
~+ zastąp znaki bieżącym katalogiem roboczym
~id_użytkownika zastąp znaki katalogiem domowym użytkownika o podaniej
nazwie
Przykłady wykorzystywania meta znaków:
ls test*
ls test?
ls test[123]
ls /home/document*/*doc
ls /homedocument*/chapter?.doc
Metaznaki
Przykłady wykorzystywania meta znaków:
ls /home/document*/chapter_[179]_*.doc - gdy chcemy pracować tylko z
plikami o nazwach na przykład chapter_1, chapter_7 i chapter_9
ls /home/document*/chapter_[2-6]_*.doc - szukamy numerów od 2 do 6
ls /home/document*/chapter_[1-689]_*.doc - z wszystkimi od 1 do 9 oprócz 7
ls /home/document*/chapter_[!5]_*.doc -negacja na 5 oznacza wykluczenie
Zmienne shella
Zmienne shella
Istnieją trzy główne typy zmiennych shella:
1. zmienne specjalne - przypisywane w momencie uruchomienia shella
2. zmienne środowiska - niezbędne do nadzoru środowiska użytkownika
3. zmienne programowe - tworzone prze użytkownika do nadzorowania jego
środowiska
Zmienne specjalne:
Zmienne specjalne dostarczają użytkownikowi informacji o procesie shella. Są
one zawsze ustawiane przez shell. Ich zawartość jest dostępna po
odwołaniu się do nich za pomocą znaku $.
Jednakże wszystkie te zmienne są własnością shella i nie można ich zmieniać za
pomocą zwykłych poleceń. Najczęściej korzysta się z tych zmiennych w
programach shellowych.
Na przykład zmiennym $0 do $9 przypisywane są parametry przekazywane do
skryptu. W ten sposób użytkownik ma dostęp do argumentów wpisanych w
wierszu wywołania.
Zmienne shella
Zmienne środowiska:
1. Zmienne środowiska wykorzystywane są przez shell do
przechowywania danych pomocnych do nadzorowania sesji
shella.
2. Użytkownik ma dostęp do tych zmiennych i może je
zmieniać. Głównym zadaniem zmiennych jest
nadzorowanie środowiska sesji użytkownika.
3. Niektórym z nich wartości są przypisywane przez shell,
inne musi ustawić użytkownik.
4. Zmienne środowiska tym różnią się od zmiennych
specjalnych, że ich wartość można ustawiać za pomocą
instrukcji przypisania.
Zmienne shella - standardowe
Shell Bourne'a Shell Korna Shell Bash Opis
CDPATH CDPATH CDPATH ścieżka przeszukiwań dla polecenia cd
HOME HOME HOME ścieżka katalogu domowego
użytkownika ustawiona w momencie
otworzenia sesji
MAIL MAIL MAIL nazwa pliku pocztowego użytkownika
PATH PATH PATH ścieżka przeszukiwanych przez shell
katalogów z poleceniami
PS1 PS1 PS1 podstawowy znak gotowości po otwarciu
sesji:
$ dla wszystkich użytkowników
# dla superużytkownika
PS2 PS2 PS2 pomocniczy znak gotowości wyświetlany
po uruchomieniu podshella:
domyślnie znak >
HISTFILE HISTFILE nazwa pliku z historią poleceń
Zmienne shella - standardowe
Shell Bourne'a Shell Korna Shell Bash Opis
HISTSIZE HISTSIZE liczba pamiętanch poleceń
IFS IFS IFS wewnętrzny separator pól (spacja,
tabulacja, nowa linia) wykorzystywany do
dzielenia polecenia na części składowe
PWD PWD PWD pełna nazwa ścieżkowa bieżącego katalogu
roboczego
EDITOR edytor wykorzystywany do edycji wiersza
polecenia; np. emacs, gmacs lub vi
MAILCHECK MAILCHECK MAILCHECK czas w sekundach między dwoma
sprawdzeniami przez shell mowo
nadesłanej poczty
TMOUT TMOUT TMOUT czas w sekundach nieaktywności, po
upływie którego shell zakończy sesję
Wszystkim zmiennym środowiskowym przypisane są wartości, które pozwalają
nadzorować postać i działanie środowiska. Wartości wszystkich zmiennych
można zmieniać podczas sesji za pomocą prostego przypisania nowej wartości.
Inne zmienne można zobaczyć wypisując polecenie env.
Zmienne shella - programowe
Shell pozwala ustawiać zmienne, których zadaniem jest przechowywanie wartości
potrzebnych podczas przetwarzania. Sam dostarcza wielu standardowych
zmienncych, które są zawsze dostępne i mają przez niego przypisane wartości. W
uzupełnieniu zmiennych specjalnych i zmiennych środowiska, które stanowią
integralną część shella, użytkownik może tworzyć własne zmienne potrzebne e
pisanych przez niego programach. Nazwy zmiennych mogą być dowolnej, rozsądnej
długości, muszą rozpoczynać się literą lub znakiem podkreślenia i mogą
występowaćw nich dowolne ze znaków: a-z,
A-Z, 0-9.
Zmiennej można przypisać w programie wartość raz lub wiele razy. Można również
się do niej odwoływać w celu odczytanie przechowywanej wartości wiele razy.
Użytkownik może tworzyć własne zmienne za pomocą prostego przypisania
wartości do nazwy zmiennej:
temp_name=/usr/tmp
month=01
Zmienne shella - programowe
Dostęp do wartości przechowywanej w zmiennej uzyskuje
się po wpisaniu nazwy zmiennej poprzedzonej znakiem $:
#skopiuj plik pod nazwę przechowywaną w zmiennej temp_name
cp file $temp_name
#wyświetl wartość zmiennej month (numer miesiąca)
echo "Bieżący miesiąc to $month"
Przykłady
temp=/tmp/
echo $temp
/tmp/
temp_name=/usr/tmp
echo $temp_name
/usr/tmp
Zmienne shella
echo $(temp)_name
/tmp/_name
echo $(temp_name)
/usr/tmp
Zmienne shella -
nadawanie wartości zmiennym programowym
Cudzysłów  
Między cudzysłowami umieszcza się tekst, wartości zmiennych
zawierające 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.
Zmienne shella -
nadawanie wartości zmiennym programowym
Cudzysłów  
#!/bin/bash
x=2
echo  Wartość zmiennej x to $x
Wartośc zmiennej x to 2
Zmienne shella -
nadawanie wartości zmiennym programowym
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:
#!/bin/bash
Alfa=10
echo  $USER $Alfa
$USER $Alfa
Zmienne shella -
nadawanie wartości zmiennym programowym
Odwrotny Apostrof ` `
Umożliwia zacytowanie polecenia  napis objęty odwrotnym
apostrofem przez interpreter powłoki jest traktowany jak
polecenie.
W miejsce napisu objętego znakami odwrotnych apostrofów
będzie wstawiony rezultat wykonania polecenia.
Przykład:
#!/bin/bash
PWD=`pwd`
x=`ls -l $PWD`
echo $x #pokaże rezultat polecenia
Polecenie read
Czyta ze standardowego wejścia pojedynczy wiersz.
Składnia:
read -opcje nazwa_zmiennej
Przykład:
#!/bin/bash
echo -n "Wpisz coś:\a"
read wpis
echo "$wpis"
Napis wprowadzony z klawiatury (ze strumienia wejściowego)
zostanie wpisanie zapamiętany w zmiennej wpis.
Zmienna nie musi być wcześniej tworzona, jeśli istniała
wcześniej, jej zawartość zostanie zastąpiona przez nowo
wprowadzoną wartość
Polecenie read
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
Nie przypadkiem w powyższym przykładzie pojawiło się polecenie
wpisania czterech wartości, pierwsza wartość trafi do zmiennej a, druga
do zmiennej b, natomiast trzecia i czwarta oraz rozdzielające je znaki
separacji przypisane zostaną zmiennej c.
Polecenie read
Wybrane opcje:
-p Pokaże znak zachęty bez kończącego znaku nowej linii.
#!/bin/bash
read -p "Pisz:" odp
echo "$odp"
-a Kolejne wartości przypisywane są do kolejnych indeksów zmiennej
tablicowej.
Przykład:
#!/bin/bash
echo "Podaj elementy zmiennej tablicowej:"
read  a tablica
echo "${tablica[*]}"
-e Jeśli nie podano żadnej nazwy zmiennej, wiersz trafia do $REPLY.
Przykład:
#!/bin/bash
echo "Wpisz coś:" read -e
echo "$REPLY"
Struktura skryptu
Struktura skryptu
znaczenie znaku  #
Znak # (hasz) oznacza komentarz, wszystko co znajduje się za
nim w tej samej linii, jest pomijane przez interpreter. Pierwsza
linia skryptu zaczynająca się od znaków: #! ma szczególne
znaczenie - wskazuje na rodzaj shella w jakim skrypt ma być
wykonany.
Przykład:
#!/bin/bash
#Tu jest komentarz
Struktura skryptu
Oto przykładowy skrypt wypisujący tekst na ekranie:
#!/bin/sh
echo  To jest przykładowy skrypt \n ;
read
exit 0
#!/bin/sh  wywołanie interpretera powłoki
echo  To jest przykładowy skrypt \n  wyświetlenie tekstu i przejście do
nowej linii
read  odczyt znaku z klawiatury (tutaj pusty ajko pauza)
exit 0  wyjście z bieżącego skryptu i zwrot kodu zakończenia
Struktura skryptu
Aby napisać skrypt należy otworzyć dowolny edytor ASCII wpisać polecenia i
zachować najlepiej z nazwą nazwa_skryptu.sh. Trzeba dodać mu atrybut
wykonywalny pisząc w linii poleceń:
chmod g+x nazwa_skryptu.sh
lub
chmod 700 nazwa_skryptu.sh
Skrypt uruchamiamy pisząc w linii poleceń:
./nazwa_skryptu.sh
Nie można zapominać znaku ./ ponieważ pokazuje on interpreterowi że
uruchamia skrypt.
Struktura skryptu  polecenie  echo
" Polecenie echo służy do wyprowadzanie informacji na standardowym
wyjściu (stdout  domyślnie jest to ekran) napisu.
Składnia
#!/bin/bash
echo  ne  jakiś napis
echo  jakiś napis #wydrukuje tekst na ekranie
" 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, zostanie utworzony.
echo  jakiś napis > plik
Struktura skryptu  polecenie  echo
Parametry:
-n nie jest wysyłany znak nowej linii
-e włącza interpretacje znaków specjalnych takich jak:

\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ść ósemkową

\xnnn znak, którego kod ASCII ma wartość szesnastkową
Struktura skryptu  słowa kluczowe
Słowa kluczowe odgrywają istotną role w w strukturze programu- skryptu,
który jest wykonywany. Z tego też powodu słów tych nie można używać jako
identyfikatorów funkcji, zmiennych, ponieważ wtedy zostanie błędnie
zinterpretowana struktura całego programu
" !
" select
" case
" then
" do
" until
" done
" elif
" while
" else
" {
" esac
" }
" fi
" for
" time
" function
" [
" if
" ]
" in
Konstrukcje sekwencyjne
Konstrukcje sekwencyjne
Do nadzorowania wykonywania sekwencji poleceń używane są następujące
symbole:
; - ogranicznik polecenia
() - grupowanie poleceń do wykonania w podshellu
{} - grupowanie poleceń do wykonania w bieżącym shellu
`` - podstawianie poleceń
&& - sprawdzenie kodu powrotu i w tym przypadku prawdy wykonanie polecenia
|| - sprawdzenie kodu powrotu i w tym przypadku fałszu wykonanie polecenia
Ogranicznik ; pozwala na następujące przetwarzanie:
polecenie1; polecenie2; polecenie 3
Nawiasy pozwalają na przetwarzanie strumieniowe:
(polecenie1; polecenie2 | grep) | wc #wykonaj w podshellu
{ poleecenie1; polecenie2 | grep;} | wc #wykonaj w shellu, uwaga na nawiasy !
Konstrukcje sekwencyjne
Mechanizm podstawiania poleceń pozwala na przypisywanie zmiennym
wyników sekwencji polączonych ze sobą:
var=`grep "line chapter? | line`
Dwa operatowy && oraz || pozwalają sprawdzić kod powrotu i na jego
podstawie określić czy następne polecenie ma być wykonane:
#wykonaj polecenie2, a jeśli polecenie1 zakończone powodzeniem
polecenie1 && polecenie2
#wykonaj polecenie2, jeśli polecenie1 zakończone niepowodzeniem
polecenie1 || polecenie2
Operatory można łączyć z konstrukcjami grupującymi:
poecenie1 || { polecenie2; polecenie3;}
Polecenie test
Polecenie test
Za pomocą polecenia test można stwierdzić, czy dana nazwa jest nazwą pliku
czy katalogu, czy jest to plik z prawami do czytania, pisania lub wykonywania, czy
dwa napisy lub dwie liczby całkowite są sobie równe lub jeden lub jedna z nich
jest większa albo mniejsza od drugiej. Proste wyrażenia można łączyć
operatorami AND (parametr -a), OR(-o), NOT(!).
Podstawowe warunki testujące:
Warunek Zwraca
-r plik prawda, jeżeli plik istnieje i ma prawa do czytania
-w plik prawda, jeżeli plik istnieje i ma prawa do pisania
-x plik prawda, jeżeli plik istnieje i ma prawa do wykonania
-f plik prawda, jeżeli plik istnieje i jest zwykłym plikiem
-d plik prawda, jeżeli plik istnieje i jest katalogiem
-p plik prawda, jeżeli plik istnieje i jest nazwanym potokiem (fifo)
-s plik prawda, jeżeli plik istnieje i ma rozmiar większy od zera
-z s1 prawda, jeżeli długość napisu s1 wynosi 0
-n s1 prawda, jeżeli długość napisu s1 jest różna od zera
Polecenie test
s1 = s2 prawda, jeżeli napisy s1 i s2 są identyczne
s1 != s2 prawda, jeżeli napisy s1 i s2 są nie identyczne
s1 prawda, jeżeli napis s1 nie jest pusty
n1 -eq n2 prawda, jeżeli liczby są sobie równe; zamiast -eq można użyć -ne,
-gt (niększa niż), -ge(większa niż równa), lt (mniejsza niż), -le
(mniejsza lub równa)
Polecenie test zwraca wartość prawda (0) lub fałsz(1) w zmiennej $?. Wszystkie
polecenia shella zwracają wartość 0, kiedy wykonanie ich zakończy się
powodzeniem lub wartość różną od zera (zazwyczaj 1 lub -1) w przypadku
niepowodzenia.
Jeżeli plik filename istnieje i ma prawa do czytania, wynikiem powyższego
polecenia będzie prawda(0):
test -r filename
echo $?
Polecenie test
Polecenie expr
Polecenie expr
Polecenie expr jest podobne do polecenia test i także zwraca wartości: prawda,
fałsz. Polecenie to użyte do wyznaczenia wartości wyrażenia arytmetycznego
zwraca obliczoną wartość.
Operator polecenia expr:
Operator Opis Zwracana wartość
* mniżenie całkowitoliczbowe liczba typu całkowitego
/ dzielenie całkowitoliczbowe liczba typu całkowitego
% reszta z dzielenia liczba typu całkowitego
całkowitoliczbowego
+ dodawanie całkowitoliczbowe liczba typu całkowitego
- odejmowanie liczba typu całkowitego
całkowiteliczbowe
= równa się prawda/fałsz
!= nie równa się prawda/fałsz
> prawda/fałsz prawda/fałsz
>= większa lub równa prawda/fałsz
< mniejsza niż prawda/fałsz
<= mniejsza lub równa prawda/fałsz
Polecenie expr
Przykłady:
if expr $a -$b
if expr "$my_name" = "Jan Kowalski"
dodawanie:
a=`expr $a + 1`
Symbol dzielenia musi być zasłonięty przez shellem albo za pomocą otoczenia
go apostrofami albo za pomocą lewego ukośnika:
i = `$i \* 15`
Polecenie expr
Przykłady:
ile=5
ile= expr Sile + 5
ile=$(expr $ile + 5)
echo $ile
15
Konstrukcje warunkowe
Konstrukcje warunkowe If
IF-THEN-ELSE
składnia:
if [ warunek testu ]
then
lista poleceń
else
lista poleceń
fi
Część else jest opcjonalna.
Można sprawdzić warunek i jeżeli nie jest on spełniony, nie wykonywać
żadnego działania. Polecenie fi oznacza koniec pętli.
Lista poleceń może być jednym lub wieloma poleceniami.
W shellu bash dodatkowym poleceniem jest elif wykonywany po else.
Konstrukcje warunkowe If
Przykład:
#!/bin/bash
if [ -x /opt/kde/bin/startkde ]
then
echo  Masz KDE w katalogu /opt
elif [ -x /usr/bin/startkde ]
echo  Masz KDE w katalogu /usr
elif [ -x /urs/local/bin/startkde ]
echo  Masz KDE w katalogu /usr/local
else
echo  Nie wiem gdzie masz KDE
fi
Ten skrypt sprawdza gdzie są zainstalowane KDE, sprawdzane są trzy warunki,
najpierw czy plik wykonywalny srartkde znajduje się w katalogu /opt/kde/bin
jeśli tam nie ma, szukany jest w /usr/bin, gdy i tu nie występuje sprawdzany jest
katalog /usr/local/bin.
Konstrukcje warunkowe If
Konstrukcje warunkowe Case
CASE
Często w skrypcie tworzy się zmienne lub otrzymuje parametry, które mogą
przyjmować różne wartości. Jeżeli wartość zmiennej jest równa któremuś z
wzorców, wtedy wykonywana jest odpowiednia czynność.
składnia:
case dopasowywanie_wyrażenie_tekstowe in
[dopasowywany_wzorzec [ | dopasowywany_wzorzec ] ..)
lista_poleceń_do_wykonania ;;
.
.
.
esac
Konstrukcje warunkowe case
Bardziej praktyczna składnia:
case $zmienna is
wartość1)
czynność1
;;
wartość2)
czynność2
;;
wartość3)
czynność2
;;
*)
czynność domyślna
;;
esac
Ostatni test *) dotyczy czynności domyślnej; jeżeli wartość zmiennej nie
odpowiada żadnemu ze wzorców, wtedy wykonywana jest czynność domyślna
jest to przydatne na przykład wtedy, kiedy zmienna nie zostanie dopasowana do
żadnego ze wzorców i chcemy wysłać komunikat o błędzie oraz wyjść ze
skryptu.
Konstrukcje warunkowe case
Przykład:
#!/bin/bash
echo  Podaj cyfrę dnia tygodnia
read d
case  $d in
 1 ) echo  Poniedziałek ;;
 2 ) echo  Wtorek ;;
 3 ) echo  Środa ;;
 4 ) echo  Czwartek ;;
 5 ) echo  Piątek ;;
 6 ) echo  Sobota ;;
 7 ) echo  Niedziela ;;
*) echo  Nic nie wybrałeś
esac
Konstrukcje warunkowe case
Konstrukcje iteracyjne
Konstrukcje iteracyjne For
FOR
Polecenie for pozwala powtarzać sekwencję czynności podczas gdy zmienia się
wartośc zmiennej określonej w wierszu polecenia for. Najczęściej stosowaną
formą konstrukcji for jest:
for nazwa_zmiennej in wartość1 wartość2 &
do
czynność związana ze zmienną $nazwa_zmiennej
done
Polecenie for powtarza związane z nim polecenia określoną liczbę razy  raz dla
każdej wartości umieszczonej w wykazie wartość1 wartość2 & . Wykaz ten jest
opcjonalny i miżna go utworzyć za pomocą dowolnego wyrażenia, które daje w
wyniku zestaw napisów (generowanie nazw plików, podstawianie poleceń i
inne). Pominięcie wykazu wartości oznacza przyjęcie przez shell wartości
domyślnych, czyli zmiennej $*, która zawiera wszystkie parametry przekazane
do skryptu.
Konstrukcje iteracyjne For
Przykład:
for x in jeden dwa trzy
do
echo  To jest $x
done
Zmiennej x przypisana jest lista, która składa się z trzech elementów:
jeden dwa trzy. Wartością zmiennej x staje się po kolei element listy, na
wszystkich wykonywane jest polecenie: echo  To jest $x .
Konstrukcje iteracyjne For
Przykład:
#!/bin/bash
for x in ` ls *html`
do
echo  To jest plik $x
done
Jeśli chcemy zmienić nazwy plików pisane DUŻYMI literami na nazwy pisane
małymi literami:
#!/bin/bash
for nazwa in *
mv $nazwa `echo $nazwa tr  [A-Z]  [a-z] `
done
Za zmianę DUŻYCH liter na małe (i na odwrót) służy polecenie tr
Konstrukcje iteracyjne For
Konstrukcje iteracyjne while
WHILE
Konstrukcja WHILE na postać podobną do konstrukcji FOR:
while lista_poleceń
do
czynności
done
Polecenie while jest prostsze do pętli for. Jeśli nie potrzebujemy takiego
narzędzia jak for użyjmy while. Czasem potrzebna jest pętla
nieskończona.Można wykorzystać polecenie test, które rozpoznaje zawsze
każdą stałą jako PRAWD.
while [ 1 ]
do
przetwarzaj coś
done
Konstrukcje iteracyjne while
Przykład:
#!/bin/bash
x=1;
while [ $x -le 10 ] ; do
echo  Napis pojawił się po raz: $x
x=`expr $x + 1`
done
Konstrukcje iteracyjne while
Konstrukcje iteracyjne while
Konstrukcje iteracyjne until
UNTIL
W tej pętli polecenia są wykonywane co najmniej raz i dopiero wtedy
sprawdzany jest warunek zakończenia:
until [ warunek zakończenia ]
do
przetwarzanie
done
Różnica pomiędzy pętlą while a until polega na sposobie sprawdzania warunku
zakończenia. W pętli while wajpierw sprawdzany jest warunek, aby określić, czy
pętla ma być wykonana. Jeżeli warunek jest spełniony (PRAWDA), wtedy pętla
zostaje wykonana. Warunek może być określony za pomocą polecenia test lub
dowolnego innego polecenia. W tym drugim przypadku sprawdzany jest kod
zakończenia polecenia. W pętli until warunek jest sprawdzany na końcu. Zatem
przetwarzanie określone w pętli będzie wykonane co najmniej raz.
Konstrukcje iteracyjne until
Przykład:
#!/bin/bash
x=1;
until [ $x -ge 10 ];
do
echo "Napis pojawił się po raz: $x"
x=`expr $x + 1`
done
Mamy zmienną x, która przyjmuje wartość 1, następnie sprawdzany jest warunek
czy wartość zmiennej x jest większa lub równa 10, jeśli nie to wykonywane są
polecenia zawarte wewnątrz pętli. W momencie gdy zmienna x osiągnie wartość,
10 pętla zostanie zakończona.
Konstrukcje iteracyjne
XARGS oraz FIND
Shell posiada jeszcze dwa polecenia za pomocą których można powtarzać
działania. Polecenie xargs upraszcza implementację pętli wtedy, kiedy potrzeba
wykonać jedno polecenie na wielu plikach. Zadanie jest bardziej złożone wtedy,
kiedy każdy plik danego użytkownika musi być zbadany lub kiedy chcemy
zmienić cały system plików. Możliwość przeglądania całego drzewa katalogów w
poszukiwaniu określonych plików lub katalogów i wykonanie określonego
polecenia na znalezionych plikach lub katalogach zapoewnia polecenie find.
Polecenie xargs pobiera na wejściu kolejne wiersze i wykonuje polecenia,
dokonując ewentualnych podstawień. Polecenie xargs można przyrównać do
konstruktora i wykonawcy poleceń. Polecenie find przeszukuje system plików w
dół począwszy od określonego katalogu, może również wykonywać polecenia
podstawiając w nich jako argumenty wyszukane nazwy plików lub katalogów.
Polecenie xargs jest bardzo użyteczne wtedy, kiedy chcemy interakcyjnie
wykonać to samopolecenie na wielu plikach w jednym katalogu. Polecenie find
jest bardziej przydatne do badania i wykonywania pleceń związanych z całą
strukturą katalogów.
Konstrukcje iteracyjne
SELECT
Polecenie select występuje jedynie w shellu Korna i Bash. Za jego pomocą
użytkownik może w łatwy sposób tworzyć menu. Składnia polecenia jest
następująca:
select zmienna_sterująca in [ słowo & ]
do
lista poleceń
done
Shell Korna ma dwie standardowe zmienne związane z poleceniem select: PS3 i
REPLY. Tekst pytania jest pamiętany w zmiennej PS3. Odpowiedz użytkownika
wpisywana jest do zmiennej REPLY. Kiedy użytkownik coś wpisze w odpowiedzi
na pytanie ustawiana jest zmienna sterująca (może to być wartośc pusta) i
zmienna REPLY oraz wykonywana jest lista poleceń. Po wykonaniu poleceń z
listy użytkownik jest ponownie proszony o dokonanie wyboru.
Listy opcji i argumentów
Listy opcji i argumentów
W większości przypadków użytkownik będzie chciał mieć możliwość
podawania w wierszu wywołania skryptu zestawu opcji i argumentów,
podobnie jak w przypadku wywołania typowego polecenia shella:
polecenie -opcje argument1 argument1
Można chcieć przekazać nazwę jednego lub kilku plików lub też inne
informacje, które mogą wpływać na przetwarzania. Wywołanie skryptu z
opcjami i argumentami ma postać:
shell_program -a file1 file2 file3
shell_program -k "jan Kowalski "abd"
Shell rozpoznaje każdy z tych argumentów i przypisuje im zmienne o
specjalnych nazwach - $1, $2, $3. Do zmiennych tych można się
odwoływać w skrypcie. Jeśli potrzebne są zmienne o numerze 10 i wyżej
należy wypisać w nawiasach klamowych: ${32} itd.
Listy opcji i argumentów
Jeżeli wydamy polecenie:
shell_program -a file1 file2 file3
shell wykona następujące przypisanie:
1. zmiennej $0 przypisana zostanie wartość shell_program (nazwa
skryptu)
2. zmienna $1 przyjmie wartość opcji -a
3. zmienna $2 przyjmie wartość argumentu file1
4. zmienna $3 przyjmie wartość argumentu file2
5. zmienna $4 przyjmie wartość argumentu file3
Wartością zmiennej $# jest liczba argumentów przekazywanych do
skryptu, w omawianym przypadku zmienna $# przyjmuje wartość 4
Zmienna $* zawiera listę wartości wszystkich argumentów wejściowych
Wyrażenia regularne
Wyrażenia regularne
Wyrażenia regularne są tworzone za pomocą liter i cyfr w połączeniu ze
specjalnymi znakami, które działają podobnie do operatorów. Czynią
łatwiejszymi odnajdywanie i filtrowanie informacji w plikach. Najbardziej
powszechnymi narzędziami UNIX-a, które korzystają z wyrażeń regularnych, są
ed, sed, awk, różne wersje grep oraz edytor emacs.
Każdy inny znak, który nie znajduje się w tabeli poniżej oznacza sam siebie i nic
więcej.
Znak Opis
. dopasuj dowolny pojedyczy znak
$ dopasuj poprzedzające operator wyrażenie regularne do końca
wiersza
^ dopasuj występujące po operatorze wyrażenie regularne do
początku wiersza
* dopasuj zero lub więcej wystąpień poprzedzającego operator
wyrażenia
\ użyte przed dowolnym ze znamów w tej tabeli oznacza
pominięcie specjalnego znaczeniaznaku; gdy \ występuje przed
dowolnym innym znakiem, oznacza sam siebie
Wyrażenia regularne
Znak Opis
[] dopasuj dowolny znak z zestawu między nawiasami. Za pomocą tego
operatora można utworzyć klasę lub zbiór znaków, które mają być
dopasowywane. Znak [0-9] jest tym samym co [0123456789]
[^ ] dopasuj dowolny znak, który nie znajduje się w nawiasach. Operator ^ działa
jak operator dopełnienia dla zbioru lub klasy znaków.
\\ puste wyrażenia reguralne, które przyjmuje wartość ostatniego wyrażenia
regularnego
\ (wyr_reg\) zapamiętaj wyrażenie regularne () do dalszego wykorzystania. Można się do
niego odwoływać za pomocą numeru pozycji licząc od lewej strony
wyrażenia regularnego
\ {m,n\} konstrukcja nadzoruje liczbę dopasowań poprzedzającego wyrażenia
regularnego, gdzie m oznacza minimum i n maksimum, Jeżeli wyrażenie
\ {m\}
regularne wystąpi co najmniej m razy i co najwyżej n razy, wtedy zakłada
\ {m,\}}
się, że wystąpiło dopasowanie. Warianty tej konstrukcji pokazano w tabeli.
Jeżeli występuje tylko m(tak jak w \ {m\}), oznacza to, że wyrażenie musi
być dopasowane dokładnie m razy. Jeżeli m występuje, zaś n jest
pominięte(tak jak w \ {m,\}), oznacza to, że wyyrażenie musi być
dopasowane co najmniej m razy


Wyszukiwarka

Podobne podstrony:
so 3
SO instrukcja 1
Film Noir Fascination Outside History, but Historically so oliver harris
SO Upper Intermediate WR U1
so wyk5 prezentacja
Tata Steel 5015 11 So acorta distancias
Powłoka BASH
36 so
so lab3
Lab 10 SO
Kocham cię od tak dawna I ve Loved You So Long (2008) Napisy Pl
22 so
SO Upper Intermediate WR U4
SO Intermediate Writing Reference U8
so 1

więcej podobnych podstron