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.” fiKaż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 CDChodzi 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<одна или несколько команд> fiOstatnie 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 archiwaabsolutnie 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ępnieSprawdzają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ówPolecenie 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ówTrzecia 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 / archivesi 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 bckpi biegnij:
./bckpwykonać kopię zapasową domyślnych katalogów oraz
./bckp docs progs działaaby 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 -eInstrukcje 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 / bckpOznacza 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 / bckpTutaj 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 dzielnikDnd \u003d $ dywidenda # zmienimy zmienne dywidenda i dzielnik,
# zapisać swoją wiedzę w innych zmiennych, jak oni są my
# potrzeba
dvs \u003d dzielnik $
reszta \u003d 1Do [„$ pozostała” -eq 0]
zrobić
niech „reszta \u003d dzielnik% dywidendy”
dywidenda \u003d dzielnik $
dzielnik \u003d $ reszta
gotowyEcho „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 bNiech „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łęducyfra 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_listdane 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łowiea \u003d `echo" qwerty "`
echo $ aWynik 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ę.