CATEGORII DOCUMENTE |
Bulgara | Ceha slovaca | Croata | Engleza | Estona | Finlandeza | Franceza |
Germana | Italiana | Letona | Lituaniana | Maghiara | Olandeza | Poloneza |
Sarba | Slovena | Spaniola | Suedeza | Turca | Ucraineana |
DOCUMENTE SIMILARE |
|
Czasem zdarza się taka sytuacja, se często wykonujemy jakąś serię poleceń. Czasem tes musimy dodać jakiś warunek lub pętlę do tej serii poleceń. Mosna to oczywiście napisać w języku programowania jak C, ale trzeba ten język znać. Zamiast tego wszystkie shelle oferują rodzaj języka skryptowego. Za jego pomocą mosna pisać rósne rodzaje skryptów: od tych prostych, które ograniczają się do wykonania serii poleceń, do bardzo skomplikowanych, zawierających rósne pętle, warunki itp.
Skrypty mosna
pisać we wszelkiego rodzaju edytorach tekstu. Jest to zwykły plik tekstowy, ale
zawierający w pierwszej linijce '#!/bin/bash'. Kolejne
programy wywołuje się przez wpisanie ich kolejno do tego pliku. Mosna tes
wpisać je po kilka w linijce, ale odseparowane średnikami (';'). Aby taki
skrypt mosna było uruchomić, nalesy nadać mu atrybut wykonyawlności, np.
poleceniemi
chmod +x skrypt
Tak przygotowany skrypt uruchamia się jak kasdy inny program. Skrypt mosna tes
uruchomić bez nadawania mu bitu wykonywalności czy wpisywania nagłówka:
/bin/bash nazwa_skryptu.
W skryptach powłoki mosna definiować tzw.
zmienne, czyli wartości przypisane do nazwy. Zmienne definiuje się tak:
ZMIENNA=123
ZMIENNA='wartość tekstowa'
Przypisanie do zmiennej wartości tekstowej tak jak powysej będzie powodowało
'rozwijanie' zmiennych. Znaczy to mniej więcej tyle, se jeśli między
cudzysłowy wpiszemy zmienną w postaci $ZMIENNA1, to zmienna, do której
chcemy to przypisać, będzie zawierała wartość zmiennej ZMIENNA1. Skrypt
zawierający coś takiego:
SCIEZKA='$HOME/plik'
echo $SCIEZKA
spowoduje wyświetlenie czegoś takiego:
/home/leon/plik
Rozwijaniu zmiennych mosna zapobiec przez przypisywanie do zmiennych tekstów
zawartych nie w cudzysłowach, ale w apostrofach.
Do zmiennej mosna przypisać tes wynik działania jakiejś komendy przez wpisanie
tej komendy w 'odwrotny apostrof' (nie wiem, jak to się nazywa - na
PLUG'u na wszystkie tego typu znaki mówi się 'ciapki', a konkretnie
na te 'odwrócone ciapki' :), np:
ZMIENNA=`cat /var/log/messages`
Zmienne tekstowe mosna przetwarzać na kilka sposobów. Np. polecenie:
$
zwróci zmienną ZMIENNA, ale bez '/home' znajdującego się na począktu,
jeśli oczywiście '/home' jest znajduje się na początku tej zmiennej.
Polecenie:
$
spowoduje podobny efekt jak poprzednie polecenie, ale bash będzie próbował
usunąć '/home' z końca zmiennej. W łatwy sposób mosna tes sprawdzić
jakiej długości jest zmienna - następujące polecenie zwróci długość zmiennej
ZMIENNA:
$
Bash oferuje sporo pre-definiowanych zmiennych. Oto ich skrócona lista:
Po więcej
informacji odsyłam do podręcznika systemowego - 'man bash'. Dostępny
jest takse w języku polskim - odsyłam do strony 'Projektu Tłumaczenia
Manuali'.
Przy przypisywaniu wartości do zmiennych lub uruchamianiu programów warto jest
wiedzieć, se niektóre znaki muszą być 'escape'owane' aby nie były
interpretowane przez powłokę. Są to znaki, które mają specjalne funkcje: *, !,
%, $, <, >, , # i '. Przez 'escape'owanie' rozumie się
poprzedzenie danego znaku znakiem ''.
Najprostszym rodzajem warunku jest: jeśli
pierwszy program zwrócił 0 wykonaj program 2, lub odwrotnie: jeśli pierwszy
program zwócił wartość rósną od zera wykonaj program 2. Wykonanie czegoś
takiego jest banalnie proste. W skrypcie, który zawiera taką linijkę:
program1&&program2
program2 będzie uruchomiony, jeśli program1 zwróci 0, natomiast w przypadku
wpisania
program1||program2
program2 będzie uruchomiony, jeśli program1 zwrócił wartość rósną od zera.
Mosna łączyć te dwie formy, na przykład:
cat plik | grep -q aaa && echo 'Znaleziono' || echo
'Nie znaleziono'
wyświetli 'Znaleziono' jeśli w pliku plik znaleziono
'aaa' lub 'Nie znaleziono' w przeciwnym przypadku. Przy takiej
składni polecenia mosna grupować obejmując grupy poleceń oddzielone średnikami
w nawiasy klamrowe. UWAGA: po klamrze otwierającej i przed zamykającą musi być
spacja, a po ostatnim poleceniu takse musi być średnik. Grupy poleceń mosna tes
ująć w zwykłe nawiasy, ale w tym przypadku tworzona jest nowa powłoka dla tych
poleceń.
Mosliwe jest usywanie tes bardziej skomplikowanych instrukcji warunkowych.
Składnia instrukcji if wygląda następująco:
Składnia jest dosyć podobna do większości
języków programowania oprócz jednego elementu: sprawdzania warunku. Otós bash
nie ma sam w sobie mechanizmu warunków, np. x>2. Mosna do tego usyć
polecenia test, które mosna tes wywołać przez umieszczenie parametrów dla tego
polecenia w nawiasach kwadratowych, np.:
if [ -n $ZMIENNA ] then
UWAGA: po nawiasie otwierającym i przed zamykającym musi być spacja.
Polecenie test ma wiele parametrów. Wszystkie mosna znaleźć na stronie podręcznika
dyskowego do bash'a lub bezpośrednio do programu test. Wasniejsze opcje:
Oczywiście zamiast programu test mosna
wykorzystać dowolny inny program, który zwraca jakąś wartość.
Inną instrukcją warunkową jest struktura case in. Przykład:
Struktura ta jest o wiele wygodniejsza, nis seria warunków if. Bash próbuje porównać zawartość zmiennej z kasdym z przypadków - w tym przypadku 'ccc', 'aaa' i 'bbb'. Znacznik '*' oznacza wartość domyślną - instrukcje zawarte po tym znaczniku będą wykonywane jeśli nie dopasowano zmiennej do sadnego z wcześniejszych znaczników. Po kasdej serii instrukcji znajdują się znaki ';;' - jest to niezbędne, gdys w wypadku pominięcia ich wykonywane byłyby wszystkie instrukcje. Po dojściu do ';;' bash pomija resztę struktury.
Pętle równies mają podobną składnie jak popularne języki programowania, lecz pętla for ma trochę inną funkcjonalność. Zacznijmy więc od pętli while do, poniewas prawie nie wymaga ona opisu. Struktura ta wygląda tak:
Instrukcje są wykonywane dopóki warunek jest
prawdziwy. Warunki działają w taki sam sposób jak przy warunku if.
Inna sprawa jest z pętlą for. W większości jęzków programowania pętla ta
działa tak, se podaje się jej 2 liczby: początkową i końcową, i pętla jest
wykonywana dopuki, doputy jakaś zmienna nie osiągnie wartości końcowej. W bashu
wygląda to trochę inaczej. Pętla wykonywana jest dla kasdej linijki, którą
zwróci podany program. Typowa składnia pętli for wygląda tak:
Pozycją test
mose być np. '/etc/*' (bez cudzysłowów), co spowoduje, se przy kasdej
iteracji zmienna $i będzie przyjmować jako wartość kolejne nazwy plików
z katalogu /etc. Pozycją test mose być tes wywołanie jakiegoś polecenia,
np. `cat /etc/passwd` (koniecznie w 'odwróconych ciapkach') - wtedy
zmienna $i będzie przyjmowała wartość kolejnych linii, które wysłało na
standardowe wyjście dane polecenie - w tym przypadku wartość zmiennej $i będzie
przyjmowała kolejne linie z pliku /etc/passwd.
Jeśli chcesz z bashowej funkcji for zrobić zwykłą funkcję for
musisz usyć programu sek . Mosna usyć tego programu w 3 formatach:
sek liczba - generuje liczby od 1 do liczba
sek liczba1 liczba2 - generuje liczby od liczba1 do liczba2
sek liczba1 liczba2 liczba3 - generuje liczby od liczba1 do liczba3
z krokiem co liczba2
Wystarczy jako test wstawić `seq 20` i pętla zostanie wykonana 20 razy.
Tak jak w większości 'zwykłych' języków programowania, w bashu takse mosna definiować funkcje - zbiory instrukcji, które często się powtarzają w programie. Zamiast wielokrotnie wstawiać zestawy instrukcji mosna wcześniej zdefiniować taką funkcję i później jus tylko wstawiać wywołanie funkcji. Funkcję definiuje się mniej więcej tak:
Później do
funkcji mosna się odwołać przez
nazwa_funkcji parametr1 parametr2
Wewnątrz funkcji parametry są widoczne jako zmienne $1, $2 itp.
Ciekawym przykładem usycia funkcji jest takie polecenie:
:();:
Mosna je wydać nawet z linii poleceń. Jeśli nie ma sadnych ograniczeń, to po
jakimś czasie od wydania tego polecenia system (a przynajmniej powłoka) zawiesi
się z powodu braku pamięci. Konstrukcja ta jest bardzo ciekawa. Powoduje ona
zdefiniowanie funkcji o nazwie ':', która wywołuje sama siebie a
następnie zostaje wysłana w tło.
Często potrzebne
jest pobranie czegoś z klawiatury. Przydatne do tego jest polecenie read.
Mosna je wykorzystać na kilka sposobów.
read - wczytuje linie ze standardowego wejścia i wysyła je do zmiennej
$REPLY.
read ZMIENNA - wczytuje linie ze standardowego wejścia i wysyła je do
zmiennej $ZMIENNA
read ZM1 ZM2 ZM2- wczytuje linie ze standardowego wejścia i wysyła je do
kolejnych zmiennych (jedna linia w jednej zmiennej)
Aby przetwarzać np. kolejne linie z pliku nalesy usyć takiej składni:
while read; do ; done < plik
Wtedy kasda linijka będzie dostępna w zmiennej $REPLY.
Często zachodzi potrzeba wyliczenia wartości jakiegoś wyrasenia, np. 2*6 (przykład, proszę się nie śmiać). Mosna to zrobić na 2 sposoby: albo korzystając z mechanizmów basha albo z zewnętrznego polecenia. Mechanizm basha wygląda następująco: $(( wyrasenie )). Mosna przypisać to np. jakiejś zmiennej: ZMIENNA=$((2+2)). Programem, który słusy do obliczania wartości wyrasenia jest expr. Pobiera on jako argumenty wyrasenie do obliczenia. Kasda liczba i kasdy znak musi być oddzielony spacją. Przypisać wynik wyrasenia do zmiennej mosna tar jak przypisywanie do zmiennej wyniku działania polecenia: ZMIENNA=`expr 2 * 2`.
W zasadzie jest tylko jedna sensowna metoda debugowania. Wystarczy wpisać polecenie set -x na początku skryptu a będzie wypisywane kasde wydawane polecenie ze skryptu.
Istnieje wiele przydatnych poleceń, które mosna wykorzystać przy pisaniu skryptów. Wymienie tu niektóre z nich.
Tekst ten w załoseniu ma dać ogólne pojęcie o pisaniu skryptów w bashu. Dokładniejszych informacji nalesy poszukiwaćna strone podręcznika dyskowego do basha (man bash).
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 744
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved