DZWONEK

Są tacy, którzy czytają te wiadomości przed tobą.
Subskrybuj, aby otrzymywać świeże artykuły.
E-mail
Imię
Nazwisko
Jak chcesz przeczytać Dzwon
Bez spamu

Co to jest skorupa i dlaczego jest potrzebna

Powłoka poleceń w systemach uniksopodobnych, w tym GNU / Linux, jest zwykłym programem, który działa zarówno w konsoli tekstowej (która jest coraz rzadziej używana), jak i w środowisku graficznym - w oknie emulatora terminala dostępnym w dowolnym systemie Linux .

Jego zadanie jest proste i oczywiste: zaakceptować linię (linie) danych wejściowych, przeanalizować je i, w oparciu o wyniki tej analizy, odpowiednio zareagować - wykonać polecenie, uruchomić program, wyświetlić komunikat diagnostyczny itp.

W prawie wszystkich dystrybucje systemu Linux bash jest domyślną powłoką dla użytkowników (Bourne Again SHell to kolejna powłoka poleceń Burn; Steve Burn jest autorem pierwszej powłoki uniksowej - sh). W rzeczywistości stała się nieoficjalnym standardem i poprawą dla niej funkcjonalność kontynuuje w sposób ciągły. Istnieją inne powłoki - tcsh (wersja C-shell), ksh (Korn Shell), zsh itp. - każdy ma swoje zalety i wady, a także własne grupy fanów. Niemniej jednak bash jest bardziej znany masom użytkowników o różnym poziomie wyszkolenia, dlatego zdecydowałem się na to. Warto również zauważyć, że bez względu na możliwości różnych pocisków, wszystkie one są kompatybilne z ich ideologicznym protoplastą - Bourn Shell (sh). Innymi słowy, skrypt napisany dla sh będzie działał poprawnie w każdej nowoczesnej powłoce (odwrotnie, ogólnie mówiąc, jest niepoprawny).

Korzyści z wiersza poleceń

Może pojawić się pytanie: po co zawracać sobie głowę linią poleceń, jeśli istnieją wygodne i piękne interfejsy graficzne? Jest wiele powodów. Po pierwsze, nie wszystkie operacje są wygodniejsze i szybsze do wykonania przy użyciu interfejsu graficznego. Po drugie, każdy program działa zgodnie z podstawową zasadą systemów uniksowych: wykonywać dobrze zdefiniowaną pracę i wykonywać ją dobrze. Innymi słowy, zawsze rozumiesz, co się dzieje, kiedy uruchamiasz określone narzędzie (jeśli coś nie jest całkowicie jasne, powinieneś zapoznać się z instrukcją obsługi). Po trzecie, opanowując polecenia, wypróbowując ich kombinacje i kombinacje ich parametrów, użytkownik uczy się systemu, zdobywając cenne praktyczne doświadczenie. Uzyskujesz dostęp do tak skutecznych narzędzi, jak potoki, które pozwalają organizować łańcuch poleceń do przetwarzania danych, narzędzia przekierowujące wejścia / wyjścia, a ponadto możesz programować bezpośrednio w powłoce poleceń. Być może powinieneś zastanowić się nad programowaniem bardziej szczegółowo, zwłaszcza że wiele skryptów systemowych w Linuksie (na przykład skrypty do uruchamiania usług systemowych) jest napisanych dla powłoki.

Shell jako język programowania

Powłokę poleceń można więc traktować jednocześnie jako język programowania i środowisko wykonawcze oprogramowania. Oczywiście ten język nie jest kompilowany, ale interpretowany. Pozwala na użycie zmiennych: systemowego lub własnego. Kolejność wykonywania poleceń programu jest zmieniana za pomocą konstrukcji warunkowego sprawdzania i wyboru odpowiedniej opcji: if-then-else i case. Pętle while, till i for pozwalają zautomatyzować powtarzające się działania. Możliwe jest łączenie grup poleceń w logiczne bloki. Możesz nawet pisać prawdziwe funkcje, przekazując im parametry. Tak więc istnieją wszystkie znaki i cechy pełnoprawnego języka programowania. Spróbujmy czerpać z tego podwójną korzyść - wraz z nauką podstaw programowania automatyzujemy naszą codzienną pracę.

Witaj świecie! Prosty system tworzenia kopii zapasowych

O potrzebie regularności zarezerwuj kopię Wszyscy znają dane, ale użytkownicy zawsze nie mają wystarczająco dużo czasu na nudną operację. Rozwiązanie jest proste - organizuj automatyczne kopie zapasowe. To będzie nasze pierwsze zadanie programistyczne w powłoce.

#! / bin / bash # # Tworzenie kopii zapasowych katalogów i plików z katalogu domowego # Ten skrypt poleceń można uruchomić automatycznie przy użyciu cron # cd $ HOME, jeśli [! -d archiwa], a następnie mkdir archiwa fi cur_date \u003d `data +% Y% m% d% H% M` jeśli [$ # -eq 0]; następnie archiwum tar czf $ (cur_date) .tar.gz projekty bin inne tar czf archiwum $ (cur_date) .tar.gz $ * fi jeśli [$? \u003d 0]; następnie mv archive $ (cur_date) .tar.gz $ HOME / archives echo „$ cur_date - Kopia zapasowa zakończona pomyślnie.” w przeciwnym razie echo „$ cur_date - BŁĄD podczas tworzenia kopii zapasowej.” fi

Każdy skrypt poleceń (skrypt - skrypt, tak zwany program powłoki) zaczyna się od linii identyfikatora, w której interpreter poleceń jest jawnie określony z pełną ścieżką do niego. Pełna ścieżka to sekwencyjna lista wszystkich katalogów, zaczynająca się od katalogu głównego, którą należy wprowadzić, aby dotrzeć do pliku docelowego, i oczywiście nazwę tego pliku. Zapisanie pełnej ścieżki jest niezwykle ważne, aby jednoznacznie zidentyfikować każdy plik w hierarchii systemu plików.

Następują cztery linie komentarzy. Gdy tylko powłoka napotka znak „#”, traktuje wszystkie kolejne znaki jako komentarze i całkowicie ignoruje je do końca bieżącego wiersza. Dlatego możesz rozpocząć komentarz nie od samego początku wiersza, ale towarzyszyć mu dowolną komendą.

Po komentarzach jest pusta linia. Dla powłoki nic to nie znaczy i nie są podejmowane żadne działania. W skryptach zwykle wstawiane są puste wiersze, aby kod był czytelny.

W końcu dotarliśmy do pierwszego „prawdziwego” zespołu. Pozwala zmienić katalog (Zmień katalog), tj. przejść z bieżącego katalogu do innego, przekazany do polecenia jako argument. W większości przypadków katalog docelowy jest jawnie określony, na przykład projekty cd / tmp lub cd, ale w naszym przypadku używana jest predefiniowana zmienna systemowa HOME - zawiera pełną ścieżkę do katalogu domowego bieżącego użytkownika, w imieniu którego wykonywany jest skrypt poleceń. W ten sposób pozbywamy się potrzeby wprowadzania zmian w kodzie za każdym razem, gdy zmieniamy użytkownika, ponieważ polecenie zwraca każdego do jego osobistego katalogu. Znak dolara „$” przed nazwą zmiennej oznacza, że \u200b\u200bmusisz wyodrębnić wartość zawartą w tej zmiennej i zastąpić ją w wierszu poleceń zamiast jej nazwy. Należy szczególnie zauważyć, że w języku poleceń ważne są powłoki liter, tj. DOM, Dom i Dom to trzy różne zmienne. Zgodnie z konwencją wielkie litery oznaczają nazwy zmiennych systemowych: HOME, ŚCIEŻKA, EDYTOR itd. Ta umowa nie zabrania użytkownikom tworzenia własnych zmiennych o nazwach pisanych wielkimi literami, ale po co komplikować ich życie, naruszając ogólnie przyjęte normy i reguły? Nie jest również zalecane zmienianie wartości zmiennych systemowych, chyba że jest to absolutnie konieczne. Ogólnie rzecz biorąc, przestrzegamy prostej zasady: używamy zmiennych systemowych tylko do odczytu, a jeśli potrzebujemy własnej, zapisujemy jej nazwę małymi literami.

Nasze pierwsze polecenie można napisać w skrócie:

cd ~

Tutaj symbol „~” oznacza także katalog domowy bieżącego użytkownika. Weterani linii poleceń są jeszcze bardziej zwięzli:

Płyta CD

Chodzi o to, że gdy nie podano argumentu dla polecenia cd, przechodzi on do katalogu domowego.

Kolejnym krokiem jest klasyczny projekt oprogramowania do sprawdzania warunków i podejmowania właściwej decyzji. Ogólny schemat wygląda następująco:

gdyby<условие> następnie<одна или несколько команд> fi

Ostatnie słowo konstrukcji (jeśli w odwrotnej kolejności) służy jako nawias zamykający, tj. granice listy poleceń wykonywanych, gdy warunek jest spełniony. Obecność fi jest obowiązkowa, nawet jeśli na liście jest tylko jedno polecenie.

Aby sprawdzić ten warunek, z reguły stosuje się polecenie testowe lub jego alternatywną formę pisania w nawiasach kwadratowych. Innymi słowy, rekordy

gdyby [! -d archiwa] jeśli test! -d archiwa

absolutnie równoważny. wolę nawiasy kwadratowe, ponieważ bardziej precyzyjnie określają granice sprawdzanego warunku. Zarówno prawy, jak i lewy nawias kwadratowy muszą być oddzielone od warunku spacjami.

Kryteria sprawdzania warunków są określone przez różne flagi. Polecenie testowe rozpoznaje bardzo dużą ich listę. W naszym przykładzie użyto flagi -d, która pozwala nam sprawdzić, czy nazwa określona po flagi pasuje do istniejącego katalogu. Najpopularniejsze flagi używane podczas pracy z plikami to:

F - czy istnieje zwykły plik o podanej nazwie;

R - czy dla danego pliku ustawiono prawo do odczytu;

W - czy dla danego pliku ustawiono prawo do zapisu;

X - czy dla danego pliku ustawiono prawo do jego wykonania;

S - czy dany plik ma niezerowy rozmiar.

W naszym przypadku stan jest poprzedzony wykrzyknikiem oznaczającym działanie logicznej negacji, więc znaczenie badanego stanu staje się całkowicie przeciwne. Spróbujmy zapisać znaczenie tych poleceń w zwykłym rosyjskim:

gdyby [! -d archiwa] Jeśli katalog archiwów (w bieżącym katalogu) nie istnieje, zacznij wykonywanie bloku poleceń: mkdir archiwa utwórz katalog archiwów (w bieżącym katalogu) i zakończ blok poleceń.

Jak widać, wszystko okazało się mniej skomplikowane. Trochę praktyki, a sam możesz łatwo czytać i tworzyć takie projekty. Polecenie tworzenia katalogu jest tak oczywiste, że nie jest wymagane dalsze wyjaśnienie.

W następnym wierszu tworzymy własną lokalną zmienną cur_date. W zdecydowanej większości przypadków zmienne są tworzone po prostu przez przypisanie określonej wartości, na przykład:

ten \u003d 10 string \u003d "To jest wiersz tekstu"

Ale w naszym przykładzie użyto małej sztuczki. Zauważ, że po znaku równości - symbolu przydziału - polecenie jest zapisywane w cudzysłowach. Ta forma zapisu pozwala nam przypisać do zmiennej nie sam łańcuch, ale wynik jego wykonania. Oto dane wyjściowe polecenia date, które zwraca bieżącą datę i godzinę w formacie zdefiniowanym przez listę parametrów:

% Y - bieżący rok w pełna forma, tj. cztery cyfry (np. 2009);

% m - numer bieżącego miesiąca (na przykład 09 - dla września);

% d - numer bieżącego dnia;

% H - bieżąca godzina w formacie 24-godzinnym;

% M - bieżąca minuta.

Zatem jeśli wykonasz polecenie

cur_date \u003d `data +% Y% m% d% H% M`

10 września 2009 r. o godz. 22.45 do zmiennej cur_date zostanie przypisana wartość ciągu „200909102245”. Celem tej sztuczki jest utworzenie unikalnej, nie duplikowanej nazwy pliku archiwum. Jeśli zamierzasz uruchomić kilka instancji programu w ciągu jednej minuty, możesz poprawić unikalność nazw, dodając bieżące sekundy. W jaki sposób? Sprawdź instrukcję narzędzia date (data mężczyzny) - nie ma nic skomplikowanego.

Przed przystąpieniem do tworzenia pliku archiwum należy ustalić, które katalogi będziemy w nim przechowywać. Aby zwiększyć elastyczność, możesz określić zestaw katalogów, które mają być domyślnie archiwizowane, ale możesz rozważyć zastąpienie tego zestawu listą katalogów przekazywanych jako argument do naszego skryptu poleceń. W tym celu stosuje się specjalne zmienne powłoki: $ # - liczba parametrów przekazanych do skryptu i $ * - wszystkie przesłane parametry zapisane w formacie jednowierszowym.

jeśli [$ # -eq 0]; następnie

Sprawdzając warunek „jeśli liczba przekazanych parametrów wynosi zero”, uruchom następującą komendę. Zauważ, że słowo kluczowe then można zapisać w wierszu warunku, oddzielając je od wyrażenia warunkowego średnikiem.

tar czf archive $ (cur_date) .tar.gz bin projektów

Polecenie utworzenia pliku archiwum i skompresowania tego pliku. Sam program tar nie wykonuje kompresji, ale gromadzi tylko wszystkie określone pliki i katalogi w jednym pliku tar. Pierwsza flaga jest do tego przeznaczona - c (create - to create). Kompresja jest wykonywana przez program zewnętrzny - tutaj jest to gzip, wywoływany przez drugą flagę - z. Jeśli w systemie jest zainstalowany bardziej wydajny program do kompresji bzip2, możesz go użyć, zmieniając polecenie w następujący sposób:

tar cjf archive $ (cur_date) .tar.bz2 bin projektów

Trzecia flaga f wskazuje, że następuje nazwa pliku archiwum, dlatego zawsze znajduje się na liście flag. Należy pamiętać, że podczas podstawiania nazwa zmiennej jest ujęta w nawiasy klamrowe. Ma to na celu wyraźne podkreślenie zmiennej w otaczającej ją linii, eliminując w ten sposób wiele potencjalnych problemów. Rozszerzenia pliku archiwum nie są automatycznie przypisywane, sam dodajesz wszystko, czego potrzebujesz. Podałem projekty i bin jako domyślne zarchiwizowane katalogi, ale możesz tutaj wpisać nazwy swoich najcenniejszych katalogów.

Słowo kluczowe else otwiera gałąź alternatywnego wykonania. Polecenia tego bloku zaczynają działać, jeśli sprawdzenie warunku daje wynik „false” (w naszym przykładzie: „liczba przekazanych parametrów jest niezerowa”, to znaczy użytkownik podał nazwy katalogów). W takim przypadku polecenie będzie wyglądać następująco:

tar czf archive $ (cur_date) .tar.gz $ *

Tutaj katalogi są domyślnie zastępowane ciągiem nazw katalogów akceptowanych z zewnątrz. Możliwe jest akceptowanie i przetwarzanie każdego zewnętrznego parametru osobno, ale wygodniej jest nam przekazać cały ciąg.

Pod koniec programu przeprowadzana jest kolejna kontrola. W środowiskach unix wszystkie polecenia zwracają kod stanu ukończenia. Jeśli polecenie zadziałało pomyślnie, wówczas zwraca kod 0, w przeciwnym razie kod zakończenia będzie niezerowy. Aby zweryfikować powodzenie poprzedniego polecenia archiwizacji, używamy innej specjalnej zmiennej $ ?, która zawsze zawiera wartość kodu zakończenia najnowszego polecenia. Jeśli w zmiennej $? zawiera 0, tj. Plik kopii zapasowej został pomyślnie utworzony, a następnie przenosimy go do katalogu archiwum:

mv archive $ (cur_date) .tar.gz $ HOME / archives

i wyślij odpowiedni komunikat:

echo „$ cur_date - Kopia zapasowa zakończona pomyślnie.”

Jeśli kontrola wykazała, że \u200b\u200bkod zakończenia operacji archiwizacji nie jest równy zero, wyświetlany jest komunikat o błędzie:

echo „$ cur_date - BŁĄD podczas tworzenia kopii zapasowej.”

To kończy pracę naszego skryptu zespołu.

Aby sprawdzić działanie naszego programu, musisz zapisać powyższe źródło w pliku, na przykład o nazwie bckp, a następnie dla wygody uczyń go wykonywalnym:

chmod 750 bckp

i biegnij:

./bckp

wykonać kopię zapasową domyślnych katalogów oraz

./bckp docs progs działa

aby utworzyć kopię zapasową wymienionych katalogów (określ nazwy katalogów, które faktycznie istnieją w twoim systemie, w przeciwnym razie pojawi się komunikat o błędzie).

Możesz umieścić plik bckp w jednym z katalogów określonych w zmiennej systemowej PATH. Najbardziej preferowane miejsca docelowe to / usr / local / bin lub $ HOME / bin, jeśli takie masz. Następnie możesz uruchomić bckp jako polecenie systemowe.

Jak zautomatyzować zaplanowane operacje tworzenia kopii zapasowych

Kilka słów o automatyzacji tworzenia kopii zapasowych. W tym celu wykorzystywany jest harmonogram systemu cron, który odczytuje instrukcje robocze ze specjalnego pliku crontab. Aby zdefiniować takie instrukcje, musisz utworzyć i edytować plik crontab za pomocą polecenia:

crontab -e

Instrukcje są napisane w ściśle określonym formacie (pola są oddzielone spacjami):

minut godziny dzień_miesiąc miesiąc dzień_dzień tygodnia zespół

Jedna z opcji harmonogramu operacji tworzenia kopii zapasowych może wyglądać następująco:

30 23 10,20,30 * * / usr / local / bin / bckp

Oznacza to, że skrypt kopii zapasowej (należy podać pełną ścieżkę do tego pliku) zostanie wykonany o godzinie 23:30 10, 20 i 30 dnia każdego miesiąca, niezależnie od dnia tygodnia. (Gwiazdki oznaczają cały dopuszczalny zakres wartości, w tym przypadku: co miesiąc w czwartym polu, każdego dnia tygodnia w piątym polu)

Jeśli wolisz podsumowywać tygodniami, a Twój system działa przez całą dobę, warto zaplanować tworzenie kopii zapasowych w godzinach przy minimalnym obciążeniu:

0 5 * * 3.5 / usr / local / bin / bckp

Tutaj kopie zapasowe zostanie utworzony o 5:00 w środy i piątki każdego miesiąca (gwiazdka w 4 polu), niezależnie od numeru (gwiazdka w 3 polu).

Możesz przeczytać o wszystkich zawiłościach planowania w podręczniku man 5 crontab.

Podsumowanie i wnioski

Skrypt kopii zapasowej omówiony w tym artykule ma skromne właściwości funkcjonalne. Ale to nie było jego główne zadanie, ale to, że czytelnik zrozumiał, co można zrobić wiersz poleceń, i nie tylko skopiował i wykonał proponowany plik wsadowy, ale zainteresował się rozszerzeniem jego funkcji, zajmując się badaniem ogromnych możliwości oferowanych przez powłoki poleceń. A jeśli ktoś, po przeczytaniu tego artykułu, spróbuje poprawić podany tutaj kod, napisze własną wersję lub wdroży swój niezależny pomysł, to uznam, że główny cel został osiągnięty.

Pobierz zasoby

static.content.url \u003d http: //www.site/developerworks/js/artrating/

ID artykułu \u003d 458335

ArticleTitle \u003d Podstawy programowania powłoki

  • Instruktaż

Podstawy BASH. Część 2.
Przepraszam za tak duże opóźnienie między artykułami, ale sesja czuje się w najbardziej nieodpowiednim momencie :)
Dziękuję wszystkim za komentarze, krytykę i uzupełnienia, które zostały wyrażone w komentarzach do poprzedniego artykułu.
Ta część, zgodnie z obietnicą, będzie poświęcona cyklom, operacjom matematycznym i wykorzystaniu zewnętrznych poleceń.
Zacznijmy.

Cykle Pętla wejściowa

Operator for-in służy do uzyskiwania dostępu do wartości wymienionych na liście jeden po drugim. Każda wartość na liście jest przypisana do zmiennej.
Składnia jest następująca:
dla zmiennej w value_list
zrobić
zespoły
gotowy

Rozważ mały przykład:

#! / bin / bash
dla i w 0 1 2 3 4 # zmienna $ i naprzemiennie przypisuje wartości od 0 do 4 włącznie
zrobić
echo „Numer konsoli to $ i” \u003e\u003e / dev / pts / $ i # Napisz wiersz „Numer konsoli to $ i” do pliku / dev / pts / $ i (plik terminala wirtualnego)
wykonano # zapętlenie
wyjście 0

Po wykonaniu przykładu linia z jej numerem pojawi się w pierwszych 5 konsolach wirtualnych (terminalach). Wartości z listy są podstawiane do zmiennej $ i jedna po drugiej, a pętla działa z wartością tej zmiennej

Cykle Podczas pętli.

Pętla while jest bardziej złożona niż pętla for-in i służy do powtarzania poleceń, dopóki pewne wyrażenie nie będzie prawdziwe (kod powrotu \u003d 0).
Składnia operatora jest następująca:
podczas wyrażenia lub polecenia zwracającego kod powrotu
zrobić
zespoły
gotowy

Przykład działania cyklu omówiono w następującym przykładzie:

#! / bin / bash
again \u003d yes # ponownie przypisz wartość „yes” do zmiennej
while ["$ again" \u003d "yes"] # Wykonamy pętlę, dopóki $ ponownie nie będzie równe „yes”
zrobić
echo „Wpisz nazwę:”
przeczytaj imię
echo „Wpisane imię to $ name”

Echo „Czy chcesz kontynuować?”
Przeczytaj ponownie
gotowy
echo „Cześć”


A teraz wynik skryptu:
[chroniony e-mailem]: ~ $ ./bash2_primer1.sh
Proszę podać imię:
ite
Wpisane imię to ite
Czy chcesz kontynuować?
tak
Proszę podać imię:
mihail
Wpisane imię to mihail
Czy chcesz kontynuować?
Nie
PA pa

Jak widać, pętla jest wykonywana, dopóki nie wprowadzimy czegoś innego niż „tak”. Pomiędzy zrobić i gotowe możesz opisać dowolne struktury, operatory itp. Wszystkie zostaną wykonane w pętli, ale powinieneś być ostrożny z tą pętlą, jeśli uruchomisz w niej dowolne polecenie, bez zmiany zmiennej wyrażenia, możesz dostać się w niekończącą się pętlę.
Teraz o stanie prawdy. Po chwili, podobnie jak w instrukcji warunkowej if-then-else, możesz wstawić dowolne wyrażenie lub polecenie, które zwraca kod powrotu, a pętla będzie wykonywana do momentu, aż kod powrotu \u003d 0! Operator „[” jest analogiem polecenia testowego, które sprawdza poprawność przesłanego warunku.

Rozważmy inny przykład, wziąłem go z książki Advanced Bash Scripting. Naprawdę go lubiłem :), ale trochę to uprościłem. W tym przykładzie wprowadzimy inny rodzaj pętli UNTIL-DO.. Jest to prawie kompletny analog cyklu WHILE-DO, do tej pory wykonywane jest tylko pewne wyrażenie.
Oto przykład:

#! / bin / bash
echo „Wprowadź licznik:”
czytaj dywidendę
echo „Wprowadź mianownik:”
przeczytaj dzielnik

Dnd \u003d $ dywidenda # zmienimy zmienne dywidenda i dzielnik,
# zapisać swoją wiedzę w innych zmiennych, jak oni są my
# potrzeba
dvs \u003d dzielnik $
reszta \u003d 1

Do [„$ pozostała” -eq 0]
zrobić
niech „reszta \u003d dzielnik% dywidendy”
dywidenda \u003d dzielnik $
dzielnik \u003d $ reszta
gotowy

Echo „GCD $ dnd i $ dvs \u003d $ dywidenda”


Wynik skryptu:
[chroniony e-mailem]: ~ $ ./bash2_primer3.sh
Wpisz licznik:
100
Wpisz mianownik:
90
GCD o liczbach 100 i 90 \u003d 10

Operacje matematyczne

Pozwól rozkazowi.
Komenda let wykonuje arytmetykę liczb i zmiennych.
Rozważmy mały przykład, w którym wykonujemy obliczenia na wprowadzonych liczbach:
#! / bin / bash
echo „Wpisz a:”
czytać
echo „Wpisz b:”
czytaj b

Niech „c \u003d a + b” # dodanie
echo „a + b \u003d $ c”
niech „c \u003d a / b” # podział
echo „a / b \u003d $ c”
niech „c<<= 2" #сдвигает c на 2 разряда влево
echo „c po zmianie 2 cyfr: $ c”
Niech „c \u003d a% b” # znajdzie resztę dzielącą a przez b
echo „$ a / $ b. balance: $ c”


Wynik wykonania:
[chroniony e-mailem]: ~ $ ./bash2_primer2.sh
Wprowadź a:
123
Wpisz b:
12
a + b \u003d 135
a / b \u003d 10
c po zmianie 2 cyfr: 40
123/12. Pozostałe: 3

Cóż, jak widać, nic skomplikowanego, lista operacji matematycznych jest standardowa:
+ - dodanie
- - odejmowanie
* - mnożenie
/ - podział
** - potęgowanie
% - moduł (podział modulo), pozostała część podziału
pozwala na stosowanie skrótów poleceń arytmetycznych, zmniejszając w ten sposób liczbę używanych zmiennych. Na przykład: a \u003d a + b jest równoważne a + \u003d b itp.

Praca z programami zewnętrznymi podczas pisania skryptów powłoki

Po pierwsze, trochę użyteczna teoria.
Przekierowanie przepływów.
W bash (podobnie jak w wielu innych powłokach) są wbudowane deskryptory plików: 0 (stdin), 1 (stdout), 2 (stderr).
stdout - Standardowe wyjście. Dostaje wszystko, co wyświetla program
stdin - Standardowe wejście. To wszystko, co użytkownik wpisuje w konsoli
stderr - Standardowe wyjście błędu.
Dla operacji z tymi deskryptorami dostępne są znaki specjalne:\u003e (przekierowanie wyjścia),< (перенаправление ввода). Оперировать ими не сложно. Например:
przekieruj wyjście cat / dev / random do / dev / null (operacja absolutnie bezużyteczna :))) lub
zapisz zawartość bieżącego katalogu do pliku listingu (już bardziej przydatne)
Jeśli zachodzi potrzeba dołączenia do pliku (przy użyciu „\u003e” jest on zastępowany), należy użyć „\u003e\u003e” zamiast „\u003e”
po prośbie sudo o hasło, zostanie ono pobrane z pliku my_password, tak jakbyś wprowadził je z klawiatury.
Jeśli musisz zapisać do pliku tylko błędy, które mogły wystąpić podczas działania programu, możesz użyć:
./program_with_error 2\u003e plik_błędu
cyfra 2 przed „\u003e” oznacza, że \u200b\u200bmusisz przekierować wszystko, co mieści się w uchwycie 2 (stderr).
Jeśli musisz zmusić stderr do napisania na standardowe wyjście, możesz to prześledzić. droga:
znak „&” oznacza wskaźnik do obsługi 1 (standardowe wyjście)
(Domyślnie, stderr zapisuje na konsoli, w której pracuje użytkownik (wcześniej zapisuje na wyświetlaczu)).
2. Przenośniki.
Rurociąg jest bardzo potężnym narzędziem do pracy z konsolą Bash. Składnia jest prosta:
zespół 1 | polecenie 2 - oznacza, że \u200b\u200bwyjście polecenia 1 zostanie przesłane na wejście polecenia 2
Rurociągi można grupować w łańcuchy i generować za pomocą przekierowania do pliku, na przykład:
ls -la | grep "hash" | sort\u003e sortilg_list
dane wyjściowe polecenia ls -la są przekazywane do polecenia grep, które wybiera wszystkie linie zawierające słowo mieszające i przekazuje sort do polecenia sort, które zapisuje wynik do pliku listy sortowania. Wszystko jest dość jasne i proste.

Najczęściej skrypty Bash są używane do automatyzacji niektórych rutynowych operacji w konsoli, dlatego czasami konieczne jest przetworzenie standardowego wejścia jednej komendy i przeniesienie jej do standardowego drugiego polecenia, podczas gdy rezultat wykonania jednego polecenia musi być w jakiś sposób obsługiwany. W tej sekcji postaram się wyjaśnić podstawowe zasady pracy z poleceniami zewnętrznymi w skrypcie. Myślę, że podałem wystarczającą liczbę przykładów i teraz możemy napisać tylko główne punkty.

1. Przekazywanie danych wyjściowych do zmiennej.
Aby zapisać wynik polecenia w zmiennej, wystarczy na przykład zawrzeć polecenie w cudzysłowie
a \u003d `echo" qwerty "`
echo $ a

Wynik pracy: qwerty


Jeśli jednak chcesz zapisać listę katalogów w zmiennej, musisz poprawnie przetworzyć wynik, aby umieścić dane w zmiennej. Rozważ mały przykład:
LIST \u003d `find / svn / -type d 2\u003e / dev / null | awk "(FS \u003d" / ") (print 4 $)" | sort | uniq | tr "\\ n" ""
dla ONE_OF_LIST w $ LIST
zrobić
svnadmin hotcopy / svn / $ ONE_OF_LIST / svn / temp4backup / $ ONE_OF_LIST
gotowy

W tym przypadku używamy pętli „do zrobienia” do zarchiwizowania wszystkich katalogów w folderze / svn / za pomocą polecenia hotvopy svnadmin (co w naszym przypadku nie ma znaczenia dla nikogo, na przykład). Najbardziej interesująca jest linia: LIST \u003d `find / svn / -type d 2\u003e / dev / null | awk "(FS \u003d" / ") (print 4 $)" | sort | uniq | tr "\\ n" "" W tym zmiennej LIST przypisane jest wykonanie polecenia find przetworzonego przez polecenia awk, sort, uniq, tr (nie rozważymy wszystkich tych poleceń, ponieważ jest to osobny artykuł). Zmienna LIST będzie zawierać nazwy wszystkich katalogów w folderze / svn / znajdującym się w tym samym wierszu (w celu usunięcia jej z pętli.

Jak widać, wszystko nie jest skomplikowane, po prostu zrozum zasadę i napisz kilka swoich skryptów. Podsumowując, życzę powodzenia w nauce BASH i ogólnie Linuksa. Krytyka jak zwykle jest mile widziana. Następny artykuł prawdopodobnie poświęcony będzie wykorzystaniu programów takich jak sed, awk.

Degtyarev E.K. Shell - interpreter poleceń wydawanych z terminala lub z pliku wsadowego. to regularny program (tj. nieuwzględnione w rdzeniu system operacyjny UNIX). Można go zastąpić innym lub mieć kilka. Dwie najbardziej znane wersje to: - Shell (UNIX wersja 7) lub Bourne Shell (od nazwiska autora S.R. Bourne z Bell Labs); - C-Shell (wersje Berkley UNIX). Są podobne, ale są pewne różnice: C-Shell ma większą moc w trybie dialogowym, podczas gdy zwykły Shell ma bardziej eleganckie struktury kontrolne. Shell jest językiem programowania, ponieważ ma: - zmienne; - struktury kontrolne (takie jak if); - procedury (w tym pliki wsadowe); - przeniesienie parametrów; - przerwać obsługę.

7.2 Plik startowy sesji (plik logowania)

Niezależnie od wersji powłoki, wchodząc do systemu UNIX, szuka pliku sesji o wstępnie zdefiniowanej nazwie, aby wykonać go jako plik wsadowy; - dla Wersja UNIX 7 jest to: .profile; - dla C-Shell jest to: .login i / lub .cshrc. W tym pliku zwykle umieszczane są następujące polecenia: - ustawianie właściwości terminalu; - powiadomienia takie jak kto, data; - Instalowanie katalogów wyszukiwania poleceń (zwykle: / bin, / usr / bin); - zmień etykietkę z $ na inną postać itp.

7.3 Procedura języka powłoki

To jest plik wsadowy. Dwa sposoby na wywołanie go w celu wykonania: 1. $ sh dothat (gdzie dothat jest plikiem wsadowym); 2. $ chmod 755 dothat (zrób to, tj. -Rwxr-xr-x) $ dothat. Powinieneś znać kolejność wyszukiwania w katalogach poleceń (domyślnie): - current; - system / bin; - system / usr / bin. Dlatego jeśli nazwa pliku wsadowego powiela nazwę polecenia w katalogach systemowych, ten ostatni stanie się niedostępny (chyba że wpiszesz jego pełną nazwę).

7.4 Zmienne powłoki

W wersji Shell 7 definicja zmiennej zawiera nazwę i wartość: var \u003d wartość. Dostęp do zmiennej - według nazwy ze znakiem $ z przodu: fruit \u003d apple (definicja); echo $ fruit (dostęp); jabłko (wynik echa). Zmienna jest więc ciągiem. Możliwe jest łączenie ciągów: $ fruit \u003d jabłko $ fruit \u003d sosna $ fruit $ echo $ fruit ananas $ fruite \u003d jabłko $ wine \u003d $ (fruite) jack $ echo $ wine applejack $ Inne sposoby ustawienia wartości zmiennej - wejście lub wyjście pliku z polecenia (patrz sekcja 7.6), a także przypisywanie wartości do zmiennej - do parametru pętli for z listy wartości określonych jawnie lub domyślnie (patrz sekcja 7.9). Zmienna może być: 1) Część pełnej nazwy pliku: $ d / nazwa pliku, gdzie $ d jest zmienną (na przykład d \u003d / usr / bin). 2) Część polecenia: $ S \u003d "sort + 2n + 1 - 2" (spacje wymagają cudzysłowów "") $ $ S tenis / lpr $ $ S koszykówka / lpr $ $ S pingpong / lpr $ Jednak wewnątrz wartości dla polecenia nie mogą być znakami |,\u003e,

7.5 Predefiniowane zmienne powłoki

Niektóre z nich można odczytać. Najczęściej: HOME - katalog użytkownika „home”; służy jako domyślny argument dla cd; ŚCIEŻKA - wiele katalogów, w których UNIX szuka poleceń; PS1 - podstawowa wskazówka (ciąg) systemu (dla wersji 7 - $). Zmiana PS1 (podpowiedzi) zwykle odbywa się w pliku logowania, na przykład: PS1 \u003d? lub PS1 \u003d „?” (ze spacją, co jest wygodniejsze). Zmień ŚCIEŻKĘ: $ echo $ ŚCIEŻKA - patrz; : / bin: / usr / bin - wartość PATH; $ cd - „dom”; $ mkdir bin - nowy katalog; $ echo $ HOME - patrz; / users / maryann - bieżący katalog; $ PATH \u003d: $ HOME / bin: $ PATH - zmiana ŚCIEŻKI; $ echo $ PATH - patrz; : / users / maryann / bin: / bin: / usr / bin - nowa wartość ŚCIEŻKI.

7.6 Ustawienie zmiennej Shell z wyjściem komendy

Przykład 1: $ teraz \u003d `data` (gdzie`` są poprzednimi cudzysłowami) $ echo $ teraz Nd 14 lutego 12:00:01 PST 1985 $ Przykład 2: (pobranie wartości zmiennej z pliku): $ menu \u003d` karma dla kota` $ echo $ menu jabłka cheddar chardonnay (zwroty karetki są zastępowane spacjami).

7,7 Zmienne powłoki - argumenty procedury

Jest to specjalny typ zmiennej o nazwie liczba. Przykład: $ dothis winogrona jabłka gruszki (procedura). Następnie parametry pozycyjne (argumenty) tego polecenia są dostępne według nazwy: $ 1 \u003d `winogrona` $ 2 \u003d` jabłka` $ 3 \u003d `gruszki itp. do 9 USD. Istnieje jednak polecenie shift, które przenosi nazwy do pozostałych argumentów, jeśli jest ich więcej niż 9 (okno o szerokości 9). Innym sposobem uzyskania wszystkich argumentów (nawet jeśli jest ich więcej niż 9): $ *, co odpowiada 1 $ 2 $ 2 ... Liczba argumentów jest przypisana do innej zmiennej: $ # (ostry). Wreszcie nazwa procedury to 0 USD; zmienna $ 0 nie jest brana pod uwagę przy obliczaniu $ #.

7.8 Shell Structural Operators

Oprócz procedur język powłoki ma operatory strukturalne, takie jak „if-else” i „while-do”. Programowanie powłoki, oprócz procedur pisania, służy do: - testowania algorytmu przed kodowaniem go w językach C lub FORTRAN-77 (brak kompilacji, łączenia, ładowania, łatwości debugowania); - nauczanie zasad programowania nieprogramiści.

7,9 Do instrukcji pętli

Niech będzie plik wsadowy makelist (procedura) $ cat makelist sort +1 -2 osoby | tr -d -9 | pr -h Dystrybucja | lpr. Jeśli zamiast jednego pliku osób jest kilka, na przykład: adminpeople, hardpeople, softpeople, ..., należy powtórzyć procedurę z innymi plikami. Jest to możliwe przy użyciu instrukcji for. Składnia: for in do done Słowa kluczowe dla, do, done wykonane są od początku wiersza. Przykład (zmiana procedury makelist) dla pliku w adminpeople, hardpeople, softpeople do Sortuj +1 -2 $ plik | tr ... | Lpr gotowe. Możesz używać metaznaków Shell na liście wartości. Przykład: dla pliku w * people (dla wszystkich nazw kończących się na people) wykonaj ... gotowe. Jeśli pominięto in, domyślnie lista argumentów procedury zawierającej pętlę jest traktowana jako lista wartości, a jeśli pętla nie znajduje się w procedurze, wówczas lista parametrów wiersza poleceń (tzn. Polecenie działa jak procedura). Przykład: dla pliku do ... zrobione To samo zostanie zrobione, aby wywołać makelist adminpeople hardpeople softpeople.

7.10 Instrukcja warunkowa if

Używamy nazw zmiennych reprezentujących wartości parametrów procedury: sort +1 -2 $ 1 | tr ... | lpr Przykład niepoprawnego wywołania: lista makel (bez parametrów), gdzie $ 1 jest niezdefiniowany. Możesz naprawić błąd, sprawdzając liczbę argumentów - wartość zmiennej $ # za pomocą operatora if -. Przykład: (zmodyfikowana procedura makelist): jeśli test $ # -eq 0 to echo „Musisz podać nazwę pliku” wyjście 1 inaczej sort +1 -2 $ 1 | tr ... | lpr fi Tutaj test i zakończ to test (zobacz rozdział 7.11) i komendy exit. Zatem składnia if: if; następnie; Słowa kluczowe, jeśli, to, else i fi są zapisywane od początku wiersza. Pomyślne wykonanie procedury oznacza, że \u200b\u200bzwraca true \u003d 0 (zero) (błąd - zwracana wartość nie wynosi 0). Instrukcja exit 1 ustawia wartość zwracaną 1 dla makelist na niepowodzenie i kończy procedurę. Zagnieżdżone, jeśli są możliwe. Bo jeśli istnieje skrót elif, który jednocześnie skraca fi.

7.11 Polecenie testowe

Nie jest częścią Shell, ale jest używany w procedurach Shell. Istnieją trzy rodzaje kontroli: - ocena wartości liczbowych; - ocena typu pliku; - linie punktowe. Każdy typ ma swoje własne operacje podstawowe (operacje op). W przypadku liczb składnia jest następująca: N op M, gdzie N, M są liczbami lub zmiennymi numerycznymi; op przyjmuje wartości: -eq, -ne, gt, -lt, -ge, -le (o zwykłym znaczeniu, jak na przykład FORTRAN). Składnia pliku to: op nazwa pliku, gdzie op przyjmuje wartości: -s (plik istnieje i nie jest pusty); -f (plik, nie katalog); -d (katalog-plików (katalog); -w (plik do zapisu); -r (plik do odczytu). W przypadku łańcuchów składnia jest następująca: S op R, gdzie S, R są łańcuchami lub zmiennymi łańcuchowymi, lub op1 S op przyjmuje wartości : \u003d (równoważność) ;! \u003d (nie równoważność); op1 przyjmuje wartości: -z (ciąg o zerowej długości); -n (nie o zerowej długości). Wreszcie operacje logiczne mogą łączyć kilka kontroli różnych typów -a ( AND) i -o (OR) Przykłady: $ if test -w $ 2 -a -r S1\u003e następnie cat 1 \u003e\u003e $ 2\u003e w przeciwnym razie echo „nie można dołączyć”\u003e fi $ W niektórych wersjach systemu operacyjnego UNIX zamiast polecenia testowego, nawiasy kwadratowe, tzn. jeśli [...] zamiast jeśli test ....

7.12 Instrukcja while loop

Składnia: while do done Jeśli „polecenie” zakończy się powodzeniem, wykonaj „polecenia” zakończone słowo kluczowe gotowy. Przykład: jeśli test $ # -eq 0, to echo „Użycie: plik $ 0 ...”\u003e & 2 zakończ fi podczas testu $ # -gt 0 wykonaj jeśli test -s $ 1 to echo „brak pliku $ 1”\u003e i jeszcze 2 sortuj + 1 - 2 $ 1 | tr -d ... (procedury) fi shift (* zmiana numeracji argumentów *) wykonane Procedury są wykonywane na wszystkich argumentach.

7.13 Do oświadczenia

Odwraca warunek powtórzenia w porównaniu z parametrem while Składnia: dopóki nie zostanie wykonane Dopóki polecenie „nie powiedzie się”, wykonaj polecenia zakończone słowem „zrobione”. Przykład: jeśli test S # -eq 0, to echo „Wykorzystanie pliku 0 $ ...”\u003e i 2 wyjście fi, aż test S # -eq 0 zrobi, jeśli test -s $ 1 to echo „brak pliku $ 1”\u003e i 2 inne sortowanie +1 - 2 $ 1 | tr -d ... (procedura) fi shift (przesunięcie argumentów) wykonane Wykonuje się tak samo jak poprzedni.

7.14 Instrukcja wyboru wielkości liter

Składnia: wielkość liter w ciągu1) ;; string2) ;; string3) ... itd. ... esac Przykład: Niech procedura ma opcję -t, która może być podana jako pierwszy parametr: ................. razem \u003d brak przypadku 1 $ w -t) razem \u003d tak Zmiana ;; -?) echo „$ 0: brak opcji $ 1” wyjście ;; esac if test $ razem \u003d tak, to posortuj ... fi gdzie? - metaznak (jeśli -?, czyli „inna” opcja inna niż -t, to błąd). Możesz używać wszystkich metaznaków Shell, w tym?, *, [-]. Łatwo jest dodać (w tym przykładzie) inne opcje, po prostu rozszerzając obudowę.

7.15 Korzystanie z plików tymczasowych w katalogu / tmp

Jest to specjalny katalog, w którym wszyscy użytkownicy mogą zapisywać wszystkie pliki. Jeśli kilku użytkowników tworzy procedurę tworzenia pliku tymczasowego, konieczne jest zapewnienie unikatowości nazw utworzonych plików. Metodą standardową jest nazwa pliku tymczasowego $ 0 $$, gdzie 0 to nazwa procedury, a $$ to standardowa zmienna równa unikalnemu numerowi identyfikacyjnemu procesu wykonującego bieżące polecenie. Chociaż administrator okresowo usuwa pliki tymczasowe w / tmp, dobrą praktyką jest ich jawne usuwanie po użyciu.

7.16 Komentarze w procedurach

Zaczynają się od dwukropka:, który jest uważany za polecenie zerowe, a tekst komentarza jest jego argumentem. Aby zapobiec interpretowaniu przez Shell metaznaków ($, * itd.), Zalecamy umieszczenie tekstu komentarza w pojedynczym cudzysłowie. W niektórych wersjach UNIX uwaga zaczyna się od #.

7.17. Przykład procedury

: „Ta procedura działa z plikami zawierającymi nazwy„: ”i numery telefonów,„: ”sortuje je razem lub osobno i drukuje wynik na ekranie„: ”lub na drukarce”: „Klawisze procedur:”: „- t (razem) - scal i sortuj wszystkie pliki razem ”:” - p (drukarka) - wydrukuj pliki na drukarce ”jeśli test $ # - eq 0 to echo„ Zastosowanie: plik 0 $ ... ”\u003e & 2 exit fi razem \u003d brak wydruku \u003d nie, podczas gdy test $ # -gt 0 do przypadku 1 $ w -t) razem \u003d tak shift ;; -p) print \u003d tak shift ;; -?) echo „$ 0: brak opcji $ 1” wyjście ;; *) jeśli test $ razem \u003d tak, to posortuj -u +1 -2 $ 1 | tr ...\u003e / tmp / $ 0 $$ if $ print \u003d no to cat / tmp / $ 0 $$ else lpr -c / tmp / $ 0 $$ fi rm / tmp / $ 0 $$ wyjdź jeszcze jeśli test -s 1 $ to echo „brak pliku 1 $”\u003e i jeszcze 2 sortuj +1 -2 $ 1 | tr ...\u003e / tmp / $ 0 $$ if $ print \u003d no to cat / tmp / $ 0 $$ else lpr -c / tmp / $ 0 $$ fi rm / tmp / $ 0 $$ fi shift fi ;; esac gotowe. Procedura sprawdza liczbę parametrów $ #, a jeśli wynosi zero, kończy się. W przeciwnym razie przetwarza parametry (instrukcja case). Klawisz (znak poprzedzony minusem) lub nazwa pliku (ciąg reprezentowany przez metaznak *) może działać jako parametr. Jeśli klucz różni się od prawidłowego (metaznak? Różni się od ti p), procedura się kończy. W przeciwnym razie, w zależności od obecności klawiszy t i p, czynności są podejmowane zgodnie z komentarzem na początku procedury.

7.18 Przerwać obsługę procedur

Jeśli podczas procedury zostanie odebrany sygnał przerwania (na przykład z klawisza BREAK lub DEL), wówczas wszystkie utworzone pliki tymczasowe pozostaną nieskasowane (dopóki administrator tego nie zrobi) z powodu natychmiastowego zakończenia procesu. Najlepsze rozwiązanie Operator trap jest przetwarzaniem przerwań w ramach procedury: Składnia: trap sygnały „argumenty poleceń” ... Znaki cudzysłowu tworzą pierwszy argument kilku poleceń oddzielonych średnikami. Zostaną one wykonane, jeśli wystąpi przerwanie wskazane przez argumenty sygnałów (liczby całkowite): 2 - gdy przerwiesz proces; 1 - jeśli jesteś „zamrożony” (odłączony od systemu) itp. Przykład (rozwinięcie poprzedniego): przypadek 1 w ..... *) pułapka „rm / tmp / *; wyjście” 2 1 (usuwanie plików tymczasowych) w przypadku testu -s $ 1 .............. rm / tmp / * Byłoby lepiej: pułapka „rm / tmp / *\u003e / dev / null; wyjście” 2 1, ponieważ przerwanie może nastąpić wcześniej jak tworzony jest plik / tmp / $ 0 $$ i komunikat alarmowy o tej sprawie jest wysyłany do urządzenia zerowego.

7.19 Arytmetyka: expr

Polecenie expr oblicza wartość wyrażenia podanego jako argument i wysyła wynik na standardowe wyjście. Najciekawszą aplikacją jest wykonywanie operacji na zmiennych języka Shell. Przykład sumowania 3 liczb: $ cat sum3 expr $ 1 + 2 $ + 3 $ chmod 755 sum3 $ sum3 13 49 2 64 $ Przykład bezpośredniego użycia polecenia: $ expr 13 + 49 + 2 + 64 + 1 129 $ W expr można użyć następujących operatorów arytmetycznych - ry: +, -, *, /,% (saldo). Wszystkie operandy i operacje muszą być oddzielone spacjami. Zauważ, że znak mnożenia powinien być ujęty w cudzysłów (pojedynczy lub podwójny), na przykład: „*”, ponieważ znak * ma specjalne znaczenie w powłoce. Bardziej złożony przykład wyrażenia w procedurze (fragment): num \u003d "wc -l

7.20 Procedury debugowania powłoki

Istnieją trzy narzędzia do procedur debugowania. 1) Umieszczanie poleceń echa w treści procedury wydawania komunikatów stanowiących ścieżkę do procedury. 2) Opcja -v (verbose \u003d verbose) w poleceniu Shell drukuje polecenie na ekranie przed jego wykonaniem. 3) Opcja -x (wykonanie) w poleceniu Powłoki powoduje wydrukowanie polecenia na ekranie, gdy jest wykonywane ze wszystkimi zmiennymi zastąpionymi ich wartościami; To jest najpotężniejsze narzędzie.

DZWONEK

Są tacy, którzy czytają te wiadomości przed tobą.
Subskrybuj, aby otrzymywać świeże artykuły.
E-mail
Imię
Nazwisko
Jak chcesz przeczytać Dzwon
Bez spamu