Menu
Jest wolny
rejestracja
główny  /  Nawigatorzy/ Kontroluj ubuntu za pomocą skryptu w systemie Windows. Tworzenie własnego skryptu automatycznego uruchamiania przy starcie komputera

Kontrolowanie Ubuntu za pomocą skryptu w systemie Windows. Tworzenie własnego skryptu automatycznego uruchamiania przy starcie komputera

Dzisiaj porozmawiamy o skryptach bash. Są to skrypty wiersza poleceń napisane dla powłoki bash. Istnieją inne powłoki, takie jak zsh, tcsh, ksh, ale skupimy się na bash. Ten materiał przeznaczony jest dla każdego, jedynym warunkiem jest możliwość pracy w wierszu poleceń systemu Linux.



Skrypty wiersza poleceń to kolekcje tych samych poleceń, które można wprowadzać z klawiatury, zebrać w pliki i połączyć w jakimś wspólnym celu. W takim przypadku wyniki pracy zespołów mogą mieć albo wartość samodzielną, albo służyć jako dane wejściowe dla innych zespołów. Skrypty to potężny sposób na zautomatyzowanie często wykonywanych czynności.

Jeśli więc mówimy o wierszu poleceń, pozwala on na wykonanie kilku poleceń jednocześnie, wpisując je oddzielone średnikami:

Pwd; kim jestem
W rzeczywistości, jeśli wypróbowałeś to w swoim terminalu, twój pierwszy skrypt basha, który zawiera dwa polecenia, został już napisany. To działa tak. Najpierw polecenie pwd wyświetla informacje o bieżącym katalogu roboczym, a następnie polecenie whoami wyświetla informacje o użytkowniku, pod którym jesteś zalogowany.

Korzystając z tego podejścia, możesz połączyć dowolną liczbę poleceń w jednym wierszu, ograniczeniem jest tylko maksymalna liczba argumentów, które można przekazać do programu. Możesz określić to ograniczenie za pomocą następującego polecenia:

Getconf ARG_MAX
Wiersz poleceń to świetne narzędzie, ale musisz wprowadzać polecenia za każdym razem, gdy ich potrzebujesz. Co się stanie, jeśli napiszesz kilka poleceń do pliku i po prostu wywołasz ten plik, aby je wykonać? W rzeczywistości plik, o którym mówimy, nazywa się skryptem wiersza poleceń.

Jak działają skrypty bash

Utwórz pusty plik za pomocą polecenia dotykowego. W pierwszym wierszu musimy wskazać, której powłoki będziemy używać. Interesuje nas bash, więc pierwsza linia pliku będzie wyglądać tak:

#! / kosz / bash
W innych wierszach tego pliku znak hash jest używany do oznaczenia komentarzy, których powłoka nie przetwarza. Jednak pierwsza linia to przypadek szczególny, tutaj hash, po którym następuje wykrzyknik (ta sekwencja nazywa się shebang) i ścieżka do bash wskazują systemowi, że skrypt został napisany dla bash.

Polecenia powłoki są oddzielone znakami końca linii, komentarze są oddzielone znakami krzyżyka. Tak to wygląda:

#! / bin / bash # To jest komentarz pwd whoami
Tutaj, podobnie jak w wierszu poleceń, możesz pisać polecenia w jednym wierszu, oddzielone średnikami. Jednak pisanie poleceń w osobnych wierszach ułatwia czytanie pliku. W każdym razie powłoka je przetworzy.

Ustawianie uprawnień do pliku skryptu

Zapisz plik pod nazwą myscript i prawie skończyłeś tworzenie skryptu bash. Teraz pozostaje tylko uczynić ten plik wykonywalnym, w przeciwnym razie, próbując go uruchomić, napotkasz błąd Odmowa uprawnień.


Próba uruchomienia pliku skryptu z nieprawidłowo skonfigurowanymi uprawnieniami

Zróbmy plik wykonywalny:

Chmod + x ./myscript
Teraz spróbujmy to wykonać:

./mojskrypt
Po ustawieniu uprawnień wszystko działa tak, jak powinno.


Pomyślnie uruchomiono skrypt bash

Wyświetlanie wiadomości

Polecenie echo służy do wyprowadzania tekstu do konsoli systemu Linux. Wykorzystajmy wiedzę o tym fakcie i edytujmy nasz skrypt, dodając wyjaśnienia do danych, które są wyświetlane przez znajdujące się w nim polecenia:

#! / bin / bash # nasz komentarz jest tutaj echo "Bieżącym katalogiem jest:" pwd echo "Zalogowany użytkownik to:" whoami
Tak się dzieje po uruchomieniu zaktualizowanego skryptu.


Wyświetlanie wiadomości ze skryptu

Teraz możemy wydrukować notatki wyjaśniające za pomocą polecenia echo. Jeśli nie wiesz, jak edytować plik za pomocą narzędzi systemu Linux lub nie widziałeś wcześniej polecenia echo, spójrz na ten zasób.

Korzystanie ze zmiennych

Zmienne umożliwiają przechowywanie informacji w pliku skryptu, na przykład wyników poleceń, które mają być używane przez inne polecenia.

Nie ma nic złego w wykonywaniu poszczególnych poleceń bez przechowywania wyników ich pracy, ale możliwości tego podejścia są bardzo ograniczone.

W skryptach bash można używać dwóch typów zmiennych:

  • Zmienne środowiska
  • Zmienne użytkownika

Zmienne środowiska

Czasami polecenia powłoki muszą działać z niektórymi danymi systemowymi. Na przykład, oto jak wyświetlić katalog domowy bieżącego użytkownika:

#! / bin / bash # display user home echo "Dom bieżącego użytkownika to: $ HOME"
Zwróć uwagę, że możemy użyć zmiennej systemowej $ HOME w podwójnych cudzysłowach, nie zapobiegnie to rozpoznaniu jej przez system. Tak się dzieje, jeśli uruchomisz powyższy skrypt.


Używanie zmiennej środowiskowej w skrypcie

Co zrobić, jeśli chcesz wyświetlić znak dolara na ekranie? Spróbujmy tego:

Echo „Mam 1 dolar w kieszeni”
System wykrywa znak dolara w cytowanym ciągu i myśli, że odwołujemy się do zmiennej. Skrypt spróbuje wyświetlić wartość niezdefiniowanej zmiennej $1. Nie tego chcemy. Co robić?

Znak ucieczki odwrotnego ukośnika przed znakiem dolara może pomóc w tej sytuacji:

Echo "Mam \$1 w kieszeni"
Skrypt wyświetli teraz dokładnie to, czego oczekujemy.


Używanie sekwencji ucieczki do wyprowadzenia znaku dolara

Zmienne użytkownika

Oprócz zmiennych środowiskowych skrypty bash pozwalają na ustawianie i używanie własnych zmiennych w skrypcie. Zmienne te zachowują swoją wartość do momentu zakończenia wykonywania skryptu.

Podobnie jak w przypadku zmiennych systemowych, dostęp do zmiennych użytkownika można uzyskać za pomocą znaku dolara:
TNW-CUS-FMP - kod promocyjny na 10% rabatu na nasze usługi, dostępny do aktywacji w ciągu 7 dni
#! / bin / bash # testowanie zmiennych grade = 5 osoba = "Adam" echo "$ osoba jest grzecznym chłopcem, jest w klasie $ ocena"
Tak się dzieje po uruchomieniu takiego skryptu.


Zmienne niestandardowe w skrypcie

Zastępowanie poleceń

Jedną z najbardziej przydatnych funkcji skryptów bash jest możliwość wydobywania informacji z wyjścia poleceń i przypisywania ich do zmiennych, co pozwala na wykorzystanie tych informacji w dowolnym miejscu pliku skryptu.

Można to zrobić na dwa sposoby.

  • Z backtickiem „”
  • Korzystanie z $ ()
Korzystając z pierwszego podejścia, pamiętaj, aby nie używać pojedynczego cudzysłowu zamiast znaku wstecznego. Polecenie musi być zawarte w dwóch takich ikonach:

Mydir = `pwd`
W drugim podejściu to samo jest napisane tak:

Mójkatalog = $ (hasło)
Scenariusz może w końcu wyglądać tak:

#! / bin / bash mójkatalog = $ (hasło) echo $ mójkatalog
Podczas jego działania dane wyjściowe polecenia pwd zostaną zapisane w zmiennej mydir, której zawartość za pomocą polecenia echo trafi do konsoli.


Skrypt, który przechowuje wyniki polecenia w zmiennej

Operacje matematyczne

Aby wykonać operacje matematyczne w pliku skryptu, możesz użyć konstrukcji takiej jak $ ((a + b)):

#! / bin / bash zmienna1 = $ ((5 + 5)) echo $ zmienna1 zmienna2 = $ (($ zmienna1 * 2)) echo $ zmienna2


Operacje matematyczne w skrypcie

Konstrukcja kontrolna jeśli-to

Niektóre scenariusze wymagają kontroli przepływu wykonywania poleceń. Na przykład, jeśli jakaś wartość jest większa niż pięć, musisz wykonać jedną akcję, w przeciwnym razie - inną. Ma to zastosowanie w bardzo wielu sytuacjach, a konstrukt kontroli jeśli-to pomoże nam w tym. W najprostszej formie wygląda to tak:

Jeśli wtedy komendy fi polecenia
A oto działający przykład:

#! / bin / bash if pwd then echo "To działa" fi
W takim przypadku, jeśli polecenie pwd zakończy się pomyślnie, w konsoli zostanie wyświetlony tekst „to działa”.

Wykorzystajmy naszą wiedzę i napiszmy bardziej złożony skrypt. Powiedzmy, że musisz znaleźć określonego użytkownika w / etc / passwd, a jeśli możesz go znaleźć, zgłoś, że istnieje.

#! / bin / bash user = likegeeks if grep $ user / etc / passwd then echo "Użytkownik $ użytkownik istnieje" fi
Tak się dzieje po uruchomieniu tego skryptu.


Wyszukaj użytkownika

Tutaj użyliśmy polecenia grep, aby znaleźć użytkownika w pliku /etc/passwd. Jeśli nie znasz polecenia grep, możesz znaleźć jego opis.

W tym przykładzie, jeśli użytkownik zostanie znaleziony, skrypt wyświetli odpowiedni komunikat. Co się stanie, jeśli nie można znaleźć użytkownika? W takim przypadku skrypt po prostu zakończy swoje działanie, nic nam nie mówiąc. Chciałbym, żeby nam o tym również powiedział, więc poprawimy kod.

Konstrukcja kontrolna if-the- else

Aby program mógł raportować zarówno wyniki udanego wyszukiwania, jak i niepowodzenia, użyjemy konstrukcji jeśli-to-inaczej. Oto jak to działa:

Polecenie if then polecenia else polecenia polecenia fi
Jeśli pierwsze polecenie zwróci zero, co oznacza jego pomyślne wykonanie, warunek będzie spełniony i wykonanie nie nastąpi po gałęzi else. W przeciwnym razie, jeśli zostanie zwrócone coś innego niż zero, co oznacza niepowodzenie lub fałszywy wynik, zostaną wykonane polecenia po else.

Napiszmy taki skrypt:

#! / bin / bash user = innyUżytkownik if grep $ user / etc / passwd then echo "Użytkownik $ użytkownik istnieje" else echo "Użytkownik $ użytkownik nie istnieje" fi
Jego wykonanie poszło wzdłuż odgałęzienia else.


Uruchamianie skryptu z konstrukcją jeśli-to-inaczej

No to idźmy dalej i zadajmy sobie trudniejsze warunki. Co zrobić, jeśli musisz sprawdzić więcej niż jeden warunek, ale kilka? Na przykład, jeśli zostanie znaleziony żądany użytkownik, musisz wyświetlić jedną wiadomość, jeśli spełniony jest inny warunek - inna wiadomość i tak dalej. W takiej sytuacji pomogą nam zagnieżdżone warunki. To wygląda tak:

Jeśli polecenie1 to polecenie elif polecenie2 potem polecenia fi
Jeśli pierwsze polecenie zwróci zero, co oznacza jego pomyślne wykonanie, polecenia z pierwszego bloku then zostaną wykonane, w przeciwnym razie, jeśli pierwszy warunek okaże się fałszywy, a drugie polecenie zwróci zero, drugi blok kodu być straconym.

#! / bin / bash user = innyUżytkownik if grep $ user / etc / passwd then echo "Użytkownik $ użytkownik istnieje" elif ls / home then echo "Użytkownik nie istnieje, ale i tak jest katalog w / home" fi
W takim skrypcie możesz na przykład utworzyć nowego użytkownika za pomocą polecenia useradd, jeśli wyszukiwanie nie zwróciło żadnych wyników lub zrobić coś innego przydatnego.

Porównywanie liczb

Wartości liczbowe można porównywać w skryptach. Poniżej znajduje się lista odpowiednich poleceń.
n1 -eq n2 Zwraca prawdę, jeśli n1 jest równe n2.
n1 -ge n2 Zwraca prawdę, jeśli n1 jest większe lub równe n2.
n1 -gt n2 Zwraca prawdę, jeśli n1 jest większe od n2.
n1 -le n2 Zwraca prawdę, jeśli n1 jest mniejsze lub równe n2.
n1 -lt n2 Zwraca prawdę, jeśli n1 jest mniejsze niż n2.
n1 -ne n2 Zwraca prawdę, jeśli n1 nie jest równe n2.

Wypróbujmy jeden z operatorów porównania jako przykład. Zauważ, że wyrażenie jest ujęte w nawiasy kwadratowe.

#! / bin / bash wart1 = 6 if [$ wart1 -gt 5] then echo "Testowana wartość $ wart1 jest większa niż 5" else echo "Testowana wartość $ wart1 jest nie większa niż 5" fi
To właśnie wygeneruje to polecenie.


Porównywanie liczb w skryptach

Wartość zmiennej val1 jest większa od 5, w wyniku czego wykonywana jest gałąź operatora porównania, a na konsoli wyświetlany jest odpowiedni komunikat.

Porównanie ciągów

Możesz także porównywać wartości ciągów w skryptach. Operatory porównania wyglądają dość prosto, ale operacje porównywania ciągów mają pewne cechy szczególne, które omówimy poniżej. Oto lista operatorów.
słowo1 = słowo2 Testuje ciągi pod kątem równości, zwraca prawdę, jeśli ciągi są identyczne.
s tr1!= str2 Zwraca prawdę, jeśli łańcuchy nie są identyczne.
str1< str2 Возвращает истину, если str1 меньше, чем str2 .
słowo1> słowo2 Zwraca prawdę, jeśli słowo1 jest większe niż słowo2.
-n słowo1 Zwraca prawdę, jeśli słowo1 jest większe od zera.
-z słowo1 Zwraca prawdę, jeśli długość słowa1 wynosi zero.

Oto przykład porównywania ciągów w skrypcie:

#! / bin / bash user = "likegeeks" if [$ user = $ USER] then echo "Użytkownik $ user jest aktualnie zalogowanym użytkownikiem" fi
W wyniku wykonania skryptu otrzymujemy co następuje.


Porównywanie ciągów w skryptach

Oto jedna cecha porównania ciągów, o której warto wspomnieć. Mianowicie operatory ">" i "<» необходимо экранировать с помощью обратной косой черты, иначе скрипт будет работать неправильно, хотя сообщений об ошибках и не появится. Скрипт интерпретирует знак «>„Jako polecenie przekierowania wyjścia.

Tak wygląda praca z tymi operatorami w kodzie:

#! / bin / bash val1 = tekst val2 = "inny tekst" if [$ val1 \>
Oto wyniki skryptu.


Porównanie ciągów, wydane ostrzeżenie

Zauważ, że skrypt, chociaż wykonany, generuje ostrzeżenie:

./myscript: linia 5: [: za dużo argumentów
Aby pozbyć się tego ostrzeżenia, umieść $ val2 w podwójnych cudzysłowach:

#! / bin / bash val1 = tekst val2 = "inny tekst" if [$ val1 \> "$ val2"] then echo "$ val1 jest większa niż $ val2" else echo "$ val1 jest mniejsza niż $ val2" fi
Teraz wszystko działa tak, jak powinno.


Porównanie ciągów

Kolejna funkcja operatorów ">" i "<» заключается в том, как они работают с символами в верхнем и нижнем регистрах. Для того, чтобы понять эту особенность, подготовим текстовый файл с таким содержимым:

Likegeek likegeeks
Zapiszmy go, podając nazwę myfile, a następnie wykonaj w terminalu następujące polecenie:

Sortuj mój plik
Posortuje wiersze z pliku w następujący sposób:

Likegeeks Likegeeks
Polecenie sort domyślnie sortuje wiersze w kolejności rosnącej, to znaczy mała litera w naszym przykładzie jest mniejsza niż wielka litera. Teraz przygotujmy skrypt, który będzie porównywał te same ciągi:

#! / bin / bash val1 = Likegeeks val2 = likegeeks if [$ val1 \> $ val2] then echo "$ val1 jest większa niż $ val2" else echo "$ val1 jest mniejsza niż $ val2" fi
Jeśli go uruchomisz, okaże się, że jest odwrotnie - mała litera jest teraz większa niż wielka.


Sortowanie porównywania poleceń i linii w pliku skryptu

Polecenia porównania mają mniej wielkich liter. Porównanie ciągów odbywa się tutaj poprzez porównanie kodów znaków ASCII, a zatem kolejność sortowania zależy od kodów znaków.

Z kolei polecenie sort wykorzystuje porządek sortowania określony w ustawieniach języka systemu.

Kontrole plików

Poniższe polecenia są prawdopodobnie najczęściej używane w skryptach basha. Pozwalają sprawdzić różne warunki dotyczące plików. Oto lista tych poleceń.
-d plik Sprawdza, czy plik istnieje i jest katalogiem.
-e plik Sprawdza, czy plik istnieje.
-f plik Sprawdza, czy plik istnieje i jest plikiem.
-r plik Sprawdza, czy plik istnieje i czy można go odczytać.
-s plik Sprawdź, czy plik istnieje i nie jest pusty.
-w plik Sprawdza, czy plik istnieje i czy jest zapisywalny.
-x plik Sprawdza, czy plik istnieje i jest wykonywalny.
plik1 -nt plik2 Sprawdza, czy plik1 jest nowszy niż plik2.
plik1 -ot plik2 Sprawdza, czy plik1 jest starszy niż plik2.
-O plik Sprawdza, czy plik istnieje i czy należy do bieżącego użytkownika.
-G plik Sprawdza, czy plik istnieje i czy jego identyfikator grupy jest zgodny z identyfikatorem grupy bieżącego użytkownika.

Te polecenia, jak również wiele innych omawianych dzisiaj, są łatwe do zapamiętania. Ich nazwy, będące skrótami od różnych słów, bezpośrednio wskazują na wykonywane przez nich kontrole.

Wypróbujmy jedno z poleceń w praktyce:

#! / bin / bash mojkatalog = / home / likegeeks if [-d $ mojkatalog] then echo "Katalog $ mojkatalog istnieje" cd $ mojkatalog ls else echo "Katalog $ mojkatalog nie istnieje" fi
Ten skrypt, dla istniejącego katalogu, wyświetli jego zawartość.


Wyświetlanie zawartości katalogu

Wierzymy, że możesz samodzielnie eksperymentować z pozostałymi poleceniami, wszystkie działają w ten sam sposób.

Wyniki

Dzisiaj omówiliśmy, jak zacząć pisać skrypty bash i omówiliśmy kilka podstawowych rzeczy. W rzeczywistości temat programowania w bashu jest ogromny. Ten artykuł jest tłumaczeniem pierwszej części obszernej serii 11 artykułów. Jeśli chcesz kontynuować już teraz - oto lista oryginałów tych materiałów. Dla wygody obejmuje to tłumaczenie, które właśnie przeczytałeś.

Dzisiaj porozmawiamy o skryptach bash. Są to skrypty wiersza poleceń napisane dla powłoki bash. Istnieją inne powłoki, takie jak zsh, tcsh, ksh, ale skupimy się na bash. Ten materiał przeznaczony jest dla każdego, jedynym warunkiem jest możliwość pracy w wierszu poleceń systemu Linux.



Skrypty wiersza poleceń to kolekcje tych samych poleceń, które można wprowadzać z klawiatury, zebrać w pliki i połączyć w jakimś wspólnym celu. W takim przypadku wyniki pracy zespołów mogą mieć albo wartość samodzielną, albo służyć jako dane wejściowe dla innych zespołów. Skrypty to potężny sposób na zautomatyzowanie często wykonywanych czynności.

Jeśli więc mówimy o wierszu poleceń, pozwala on na wykonanie kilku poleceń jednocześnie, wpisując je oddzielone średnikami:

Pwd; kim jestem
W rzeczywistości, jeśli wypróbowałeś to w swoim terminalu, twój pierwszy skrypt basha, który zawiera dwa polecenia, został już napisany. To działa tak. Najpierw polecenie pwd wyświetla informacje o bieżącym katalogu roboczym, a następnie polecenie whoami wyświetla informacje o użytkowniku, pod którym jesteś zalogowany.

Korzystając z tego podejścia, możesz połączyć dowolną liczbę poleceń w jednym wierszu, ograniczeniem jest tylko maksymalna liczba argumentów, które można przekazać do programu. Możesz określić to ograniczenie za pomocą następującego polecenia:

Getconf ARG_MAX
Wiersz poleceń to świetne narzędzie, ale musisz wprowadzać polecenia za każdym razem, gdy ich potrzebujesz. Co się stanie, jeśli napiszesz kilka poleceń do pliku i po prostu wywołasz ten plik, aby je wykonać? W rzeczywistości plik, o którym mówimy, nazywa się skryptem wiersza poleceń.

Jak działają skrypty bash

Utwórz pusty plik za pomocą polecenia dotykowego. W pierwszym wierszu musimy wskazać, której powłoki będziemy używać. Interesuje nas bash, więc pierwsza linia pliku będzie wyglądać tak:

#! / kosz / bash
W innych wierszach tego pliku znak hash jest używany do oznaczenia komentarzy, których powłoka nie przetwarza. Jednak pierwsza linia to przypadek szczególny, tutaj hash, po którym następuje wykrzyknik (ta sekwencja nazywa się shebang) i ścieżka do bash wskazują systemowi, że skrypt został napisany dla bash.

Polecenia powłoki są oddzielone znakami końca linii, komentarze są oddzielone znakami krzyżyka. Tak to wygląda:

#! / bin / bash # To jest komentarz pwd whoami
Tutaj, podobnie jak w wierszu poleceń, możesz pisać polecenia w jednym wierszu, oddzielone średnikami. Jednak pisanie poleceń w osobnych wierszach ułatwia czytanie pliku. W każdym razie powłoka je przetworzy.

Ustawianie uprawnień do pliku skryptu

Zapisz plik pod nazwą myscript i prawie skończyłeś tworzenie skryptu bash. Teraz pozostaje tylko uczynić ten plik wykonywalnym, w przeciwnym razie, próbując go uruchomić, napotkasz błąd Odmowa uprawnień.


Próba uruchomienia pliku skryptu z nieprawidłowo skonfigurowanymi uprawnieniami

Zróbmy plik wykonywalny:

Chmod + x ./myscript
Teraz spróbujmy to wykonać:

./mojskrypt
Po ustawieniu uprawnień wszystko działa tak, jak powinno.


Pomyślnie uruchomiono skrypt bash

Wyświetlanie wiadomości

Polecenie echo służy do wyprowadzania tekstu do konsoli systemu Linux. Wykorzystajmy wiedzę o tym fakcie i edytujmy nasz skrypt, dodając wyjaśnienia do danych, które są wyświetlane przez znajdujące się w nim polecenia:

#! / bin / bash # nasz komentarz jest tutaj echo "Bieżącym katalogiem jest:" pwd echo "Zalogowany użytkownik to:" whoami
Tak się dzieje po uruchomieniu zaktualizowanego skryptu.


Wyświetlanie wiadomości ze skryptu

Teraz możemy wydrukować notatki wyjaśniające za pomocą polecenia echo. Jeśli nie wiesz, jak edytować plik za pomocą narzędzi systemu Linux lub nie widziałeś wcześniej polecenia echo, spójrz na ten zasób.

Korzystanie ze zmiennych

Zmienne umożliwiają przechowywanie informacji w pliku skryptu, na przykład wyników poleceń, które mają być używane przez inne polecenia.

Nie ma nic złego w wykonywaniu poszczególnych poleceń bez przechowywania wyników ich pracy, ale możliwości tego podejścia są bardzo ograniczone.

W skryptach bash można używać dwóch typów zmiennych:

  • Zmienne środowiska
  • Zmienne użytkownika

Zmienne środowiska

Czasami polecenia powłoki muszą działać z niektórymi danymi systemowymi. Na przykład, oto jak wyświetlić katalog domowy bieżącego użytkownika:

#! / bin / bash # display user home echo "Dom bieżącego użytkownika to: $ HOME"
Zwróć uwagę, że możemy użyć zmiennej systemowej $ HOME w podwójnych cudzysłowach, nie zapobiegnie to rozpoznaniu jej przez system. Tak się dzieje, jeśli uruchomisz powyższy skrypt.


Używanie zmiennej środowiskowej w skrypcie

Co zrobić, jeśli chcesz wyświetlić znak dolara na ekranie? Spróbujmy tego:

Echo „Mam 1 dolar w kieszeni”
System wykrywa znak dolara w cytowanym ciągu i myśli, że odwołujemy się do zmiennej. Skrypt spróbuje wyświetlić wartość niezdefiniowanej zmiennej $1. Nie tego chcemy. Co robić?

Znak ucieczki odwrotnego ukośnika przed znakiem dolara może pomóc w tej sytuacji:

Echo "Mam \$1 w kieszeni"
Skrypt wyświetli teraz dokładnie to, czego oczekujemy.


Używanie sekwencji ucieczki do wyprowadzenia znaku dolara

Zmienne użytkownika

Oprócz zmiennych środowiskowych skrypty bash pozwalają na ustawianie i używanie własnych zmiennych w skrypcie. Zmienne te zachowują swoją wartość do momentu zakończenia wykonywania skryptu.

Podobnie jak w przypadku zmiennych systemowych, dostęp do zmiennych użytkownika można uzyskać za pomocą znaku dolara:
TNW-CUS-FMP - kod promocyjny na 10% rabatu na nasze usługi, dostępny do aktywacji w ciągu 7 dni
#! / bin / bash # testowanie zmiennych grade = 5 osoba = "Adam" echo "$ osoba jest grzecznym chłopcem, jest w klasie $ ocena"
Tak się dzieje po uruchomieniu takiego skryptu.


Zmienne niestandardowe w skrypcie

Zastępowanie poleceń

Jedną z najbardziej przydatnych funkcji skryptów bash jest możliwość wydobywania informacji z wyjścia poleceń i przypisywania ich do zmiennych, co pozwala na wykorzystanie tych informacji w dowolnym miejscu pliku skryptu.

Można to zrobić na dwa sposoby.

  • Z backtickiem „”
  • Korzystanie z $ ()
Korzystając z pierwszego podejścia, pamiętaj, aby nie używać pojedynczego cudzysłowu zamiast znaku wstecznego. Polecenie musi być zawarte w dwóch takich ikonach:

Mydir = `pwd`
W drugim podejściu to samo jest napisane tak:

Mójkatalog = $ (hasło)
Scenariusz może w końcu wyglądać tak:

#! / bin / bash mójkatalog = $ (hasło) echo $ mójkatalog
Podczas jego działania dane wyjściowe polecenia pwd zostaną zapisane w zmiennej mydir, której zawartość za pomocą polecenia echo trafi do konsoli.


Skrypt, który przechowuje wyniki polecenia w zmiennej

Operacje matematyczne

Aby wykonać operacje matematyczne w pliku skryptu, możesz użyć konstrukcji takiej jak $ ((a + b)):

#! / bin / bash zmienna1 = $ ((5 + 5)) echo $ zmienna1 zmienna2 = $ (($ zmienna1 * 2)) echo $ zmienna2


Operacje matematyczne w skrypcie

Konstrukcja kontrolna jeśli-to

Niektóre scenariusze wymagają kontroli przepływu wykonywania poleceń. Na przykład, jeśli jakaś wartość jest większa niż pięć, musisz wykonać jedną akcję, w przeciwnym razie - inną. Ma to zastosowanie w bardzo wielu sytuacjach, a konstrukt kontroli jeśli-to pomoże nam w tym. W najprostszej formie wygląda to tak:

Jeśli wtedy komendy fi polecenia
A oto działający przykład:

#! / bin / bash if pwd then echo "To działa" fi
W takim przypadku, jeśli polecenie pwd zakończy się pomyślnie, w konsoli zostanie wyświetlony tekst „to działa”.

Wykorzystajmy naszą wiedzę i napiszmy bardziej złożony skrypt. Powiedzmy, że musisz znaleźć określonego użytkownika w / etc / passwd, a jeśli możesz go znaleźć, zgłoś, że istnieje.

#! / bin / bash user = likegeeks if grep $ user / etc / passwd then echo "Użytkownik $ użytkownik istnieje" fi
Tak się dzieje po uruchomieniu tego skryptu.


Wyszukaj użytkownika

Tutaj użyliśmy polecenia grep, aby znaleźć użytkownika w pliku /etc/passwd. Jeśli nie znasz polecenia grep, możesz znaleźć jego opis.

W tym przykładzie, jeśli użytkownik zostanie znaleziony, skrypt wyświetli odpowiedni komunikat. Co się stanie, jeśli nie można znaleźć użytkownika? W takim przypadku skrypt po prostu zakończy swoje działanie, nic nam nie mówiąc. Chciałbym, żeby nam o tym również powiedział, więc poprawimy kod.

Konstrukcja kontrolna if-the- else

Aby program mógł raportować zarówno wyniki udanego wyszukiwania, jak i niepowodzenia, użyjemy konstrukcji jeśli-to-inaczej. Oto jak to działa:

Polecenie if then polecenia else polecenia polecenia fi
Jeśli pierwsze polecenie zwróci zero, co oznacza jego pomyślne wykonanie, warunek będzie spełniony i wykonanie nie nastąpi po gałęzi else. W przeciwnym razie, jeśli zostanie zwrócone coś innego niż zero, co oznacza niepowodzenie lub fałszywy wynik, zostaną wykonane polecenia po else.

Napiszmy taki skrypt:

#! / bin / bash user = innyUżytkownik if grep $ user / etc / passwd then echo "Użytkownik $ użytkownik istnieje" else echo "Użytkownik $ użytkownik nie istnieje" fi
Jego wykonanie poszło wzdłuż odgałęzienia else.


Uruchamianie skryptu z konstrukcją jeśli-to-inaczej

No to idźmy dalej i zadajmy sobie trudniejsze warunki. Co zrobić, jeśli musisz sprawdzić więcej niż jeden warunek, ale kilka? Na przykład, jeśli zostanie znaleziony żądany użytkownik, musisz wyświetlić jedną wiadomość, jeśli spełniony jest inny warunek - inna wiadomość i tak dalej. W takiej sytuacji pomogą nam zagnieżdżone warunki. To wygląda tak:

Jeśli polecenie1 to polecenie elif polecenie2 potem polecenia fi
Jeśli pierwsze polecenie zwróci zero, co oznacza jego pomyślne wykonanie, polecenia z pierwszego bloku then zostaną wykonane, w przeciwnym razie, jeśli pierwszy warunek okaże się fałszywy, a drugie polecenie zwróci zero, drugi blok kodu być straconym.

#! / bin / bash user = innyUżytkownik if grep $ user / etc / passwd then echo "Użytkownik $ użytkownik istnieje" elif ls / home then echo "Użytkownik nie istnieje, ale i tak jest katalog w / home" fi
W takim skrypcie możesz na przykład utworzyć nowego użytkownika za pomocą polecenia useradd, jeśli wyszukiwanie nie zwróciło żadnych wyników lub zrobić coś innego przydatnego.

Porównywanie liczb

Wartości liczbowe można porównywać w skryptach. Poniżej znajduje się lista odpowiednich poleceń.
n1 -eq n2 Zwraca prawdę, jeśli n1 jest równe n2.
n1 -ge n2 Zwraca prawdę, jeśli n1 jest większe lub równe n2.
n1 -gt n2 Zwraca prawdę, jeśli n1 jest większe od n2.
n1 -le n2 Zwraca prawdę, jeśli n1 jest mniejsze lub równe n2.
n1 -lt n2 Zwraca prawdę, jeśli n1 jest mniejsze niż n2.
n1 -ne n2 Zwraca prawdę, jeśli n1 nie jest równe n2.

Wypróbujmy jeden z operatorów porównania jako przykład. Zauważ, że wyrażenie jest ujęte w nawiasy kwadratowe.

#! / bin / bash wart1 = 6 if [$ wart1 -gt 5] then echo "Testowana wartość $ wart1 jest większa niż 5" else echo "Testowana wartość $ wart1 jest nie większa niż 5" fi
To właśnie wygeneruje to polecenie.


Porównywanie liczb w skryptach

Wartość zmiennej val1 jest większa od 5, w wyniku czego wykonywana jest gałąź operatora porównania, a na konsoli wyświetlany jest odpowiedni komunikat.

Porównanie ciągów

Możesz także porównywać wartości ciągów w skryptach. Operatory porównania wyglądają dość prosto, ale operacje porównywania ciągów mają pewne cechy szczególne, które omówimy poniżej. Oto lista operatorów.
słowo1 = słowo2 Testuje ciągi pod kątem równości, zwraca prawdę, jeśli ciągi są identyczne.
s tr1!= str2 Zwraca prawdę, jeśli łańcuchy nie są identyczne.
str1< str2 Возвращает истину, если str1 меньше, чем str2 .
słowo1> słowo2 Zwraca prawdę, jeśli słowo1 jest większe niż słowo2.
-n słowo1 Zwraca prawdę, jeśli słowo1 jest większe od zera.
-z słowo1 Zwraca prawdę, jeśli długość słowa1 wynosi zero.

Oto przykład porównywania ciągów w skrypcie:

#! / bin / bash user = "likegeeks" if [$ user = $ USER] then echo "Użytkownik $ user jest aktualnie zalogowanym użytkownikiem" fi
W wyniku wykonania skryptu otrzymujemy co następuje.


Porównywanie ciągów w skryptach

Oto jedna cecha porównania ciągów, o której warto wspomnieć. Mianowicie operatory ">" i "<» необходимо экранировать с помощью обратной косой черты, иначе скрипт будет работать неправильно, хотя сообщений об ошибках и не появится. Скрипт интерпретирует знак «>„Jako polecenie przekierowania wyjścia.

Tak wygląda praca z tymi operatorami w kodzie:

#! / bin / bash val1 = tekst val2 = "inny tekst" if [$ val1 \>
Oto wyniki skryptu.


Porównanie ciągów, wydane ostrzeżenie

Zauważ, że skrypt, chociaż wykonany, generuje ostrzeżenie:

./myscript: linia 5: [: za dużo argumentów
Aby pozbyć się tego ostrzeżenia, umieść $ val2 w podwójnych cudzysłowach:

#! / bin / bash val1 = tekst val2 = "inny tekst" if [$ val1 \> "$ val2"] then echo "$ val1 jest większa niż $ val2" else echo "$ val1 jest mniejsza niż $ val2" fi
Teraz wszystko działa tak, jak powinno.


Porównanie ciągów

Kolejna funkcja operatorów ">" i "<» заключается в том, как они работают с символами в верхнем и нижнем регистрах. Для того, чтобы понять эту особенность, подготовим текстовый файл с таким содержимым:

Likegeek likegeeks
Zapiszmy go, podając nazwę myfile, a następnie wykonaj w terminalu następujące polecenie:

Sortuj mój plik
Posortuje wiersze z pliku w następujący sposób:

Likegeeks Likegeeks
Polecenie sort domyślnie sortuje wiersze w kolejności rosnącej, to znaczy mała litera w naszym przykładzie jest mniejsza niż wielka litera. Teraz przygotujmy skrypt, który będzie porównywał te same ciągi:

#! / bin / bash val1 = Likegeeks val2 = likegeeks if [$ val1 \> $ val2] then echo "$ val1 jest większa niż $ val2" else echo "$ val1 jest mniejsza niż $ val2" fi
Jeśli go uruchomisz, okaże się, że jest odwrotnie - mała litera jest teraz większa niż wielka.


Sortowanie porównywania poleceń i linii w pliku skryptu

Polecenia porównania mają mniej wielkich liter. Porównanie ciągów odbywa się tutaj poprzez porównanie kodów znaków ASCII, a zatem kolejność sortowania zależy od kodów znaków.

Z kolei polecenie sort wykorzystuje porządek sortowania określony w ustawieniach języka systemu.

Kontrole plików

Poniższe polecenia są prawdopodobnie najczęściej używane w skryptach basha. Pozwalają sprawdzić różne warunki dotyczące plików. Oto lista tych poleceń.
-d plik Sprawdza, czy plik istnieje i jest katalogiem.
-e plik Sprawdza, czy plik istnieje.
-f plik Sprawdza, czy plik istnieje i jest plikiem.
-r plik Sprawdza, czy plik istnieje i czy można go odczytać.
-s plik Sprawdź, czy plik istnieje i nie jest pusty.
-w plik Sprawdza, czy plik istnieje i czy jest zapisywalny.
-x plik Sprawdza, czy plik istnieje i jest wykonywalny.
plik1 -nt plik2 Sprawdza, czy plik1 jest nowszy niż plik2.
plik1 -ot plik2 Sprawdza, czy plik1 jest starszy niż plik2.
-O plik Sprawdza, czy plik istnieje i czy należy do bieżącego użytkownika.
-G plik Sprawdza, czy plik istnieje i czy jego identyfikator grupy jest zgodny z identyfikatorem grupy bieżącego użytkownika.

Te polecenia, jak również wiele innych omawianych dzisiaj, są łatwe do zapamiętania. Ich nazwy, będące skrótami od różnych słów, bezpośrednio wskazują na wykonywane przez nich kontrole.

Wypróbujmy jedno z poleceń w praktyce:

#! / bin / bash mojkatalog = / home / likegeeks if [-d $ mojkatalog] then echo "Katalog $ mojkatalog istnieje" cd $ mojkatalog ls else echo "Katalog $ mojkatalog nie istnieje" fi
Ten skrypt, dla istniejącego katalogu, wyświetli jego zawartość.


Wyświetlanie zawartości katalogu

Wierzymy, że możesz samodzielnie eksperymentować z pozostałymi poleceniami, wszystkie działają w ten sam sposób.

Wyniki

Dzisiaj omówiliśmy, jak zacząć pisać skrypty bash i omówiliśmy kilka podstawowych rzeczy. W rzeczywistości temat programowania w bashu jest ogromny. Ten artykuł jest tłumaczeniem pierwszej części obszernej serii 11 artykułów. Jeśli chcesz kontynuować już teraz - oto lista oryginałów tych materiałów. Dla wygody obejmuje to tłumaczenie, które właśnie przeczytałeś. Jeśli nie wiesz jeszcze o pCloud, możesz to przeczytać.

PCloud for Linux oferuje aplikację do synchronizacji dla systemu Linux jako obraz aplikacji (dostępna jest najnowsza wersja). Rozwiązanie pozornie prostej kwestii automatyzacji procesu „uruchamianie klienta – synchronizacja – wyłączanie klienta” doprowadziło do konieczności rozwiązania kilku problemów związanych ze specyfiką klienta pCloud. Rozwiązanie podano dla środowiska graficznego xfce.

Ostatecznie rozwiązanie automatyzujące proces zaowocowało uruchomieniem dwóch lub trzech zadań zgodnie z harmonogramem (zobacz).

Uruchamianie klienta pCloud

Do uruchomienia klienta używany jest prosty skrypt, na przykład pcloud1.sh

#! / kosz / bash
/ ścieżka_do_pliku / pcloud

A niestandardowe polecenie zadania to

Eksportuj WYŚWIETLACZ =: 0 && /ścieżka/pcloud1.sh

Ścieżka - ścieżka do skryptu pcloud1.sh

Początkowo dodanie linii wyjścia do pcloud1.sh (uzupełnianie pcloud1.sh) nie przyniosło pożądanego rezultatu. W menedżerze zadań zaobserwowano 2 procesy:

Pcloud1.sh
sh -c export DISPLAY =: 0 && /path/pcloud1.sh

Aby zapobiec „zawieszaniu się” pliku pcloud1.sh w menedżerze zadań, utworzono skrypt pcloud2.sh, uruchamiany zgodnie z harmonogramem minutę po uruchomieniu pcloud1.sh Skrypt jest „żądaniem” zakończenia wszystkich istniejących procesów o nazwie pcloud1.sh

#! / kosz / bash
killall -s TERM pcloud1.sh
śpij 1 i wyjdź

Zatrzymywanie klienta pCloud

Ten scenariusz, z punktu widzenia jego tworzenia, był najbardziej czasochłonny, co tłumaczy się dwoma przyczynami.

Pytanie 1. Pracy klienta zaczęło towarzyszyć kilka procesów. Na przykład, gdy uruchomisz klienta, a następnie automatycznie otworzysz wszystkie okna w menedżerze zadań, zobaczysz 6 procesów pcloud:


Po zamknięciu głównego okna klienta i instancji menedżera plików wyświetlającej zawartość chmury pCloudDrive, w menedżerze zadań pozostanie 5 procesów pcloud:


Ponieważ nie ma polecenia terminala do zamykania klienta, możesz zastosować rozwiązanie, aby „miękko” zakończyć proces pcloud za pomocą jego wartości pid, to znaczy za pomocą polecenia kill -15 pid_pcloud

Ale jeśli poprosisz o pid procesu pcloud, wynikiem będzie albo 6 grup liczb odpowiadających pidom procesów pcloud (przykład: 16129 16103 16077 16048 16036 16032), albo 5 grup (przykład: 29419 29398 29352 29324 29320). Te wartości pid będą się zmieniać za każdym razem.

Liczba procesów (5 lub 6) zależy od tego, czy masz otwarte wszystkie okna, które otwierają się automatycznie podczas uruchamiania klienta, czy te okna są zamknięte i tylko ikona stanu na podstawce (panelu systemowym, zasobniku) jest aktywna.

Powstaje naturalne pytanie: który proces należy wyłączyć?

Pytanie 2. Po uruchomieniu klienta pCloud automatycznie otwierają się 2 okna, z których jedno jest oknem klienta, a drugie to instancja menedżera plików odpowiadająca otwartemu katalogowi pCloudDrive, którego zawartość jest zawartością przestrzeni chmurowej konta pCloud zamontowane w nim, na przykład:



Jeśli po wyłączeniu klienta pCloud okno klienta (górny rysunek) zniknie, drugie okno pozostanie otwarte. Zawartość drugiego okna będzie pusta, ponieważ chmura pCloud została odmontowana podczas zamykania klienta.

Pytanie: i jak zamknąć to automatycznie?

Notatka. Pytanie o zamknięcie otwartego okna aplikacji pCloud nie jest postawione, ponieważ w xfce ikona na panelu (taca systemowa, tray) wyświetla tylko stan „zsynchronizowany” lub „zsynchronizowany”. Informacje o liczbie wgranych lub pobranych plików, a także szybkości procesu wyświetlane są na dole otwartego okna aplikacji pCloud.

Na stawiane pytania odpowiemy po kolei.

Odpowiedź 1. Eksperymentalnie stwierdzono, że aby wyjść z klienta pcloud, należy wyłączyć proces pcloud o najmniejszej wartości pid, co odpowiada procesowi pCloud Drive (patrz menedżer zadań). Dlatego najtrudniejszym zadaniem automatyzacji będzie wybranie z uzyskanych wartości najmniejszego pid, aby później przypisać go do zmiennej.

Jak się okazało, problem ten można rozwiązać na co najmniej cztery sposoby. Ponadto „miękkie” zamknięcie wszystkich procesów pcloud można wykonać za pomocą polecenia killall określającego nazwę procesu. Ponieważ wszystkie rozwiązania, z których wpisano 5, prowadzą do tego samego wyniku, są one wymienione poniżej.

Opcja 1: killall -s TERM pcloud

Tutaj wszystko jest jasne. Wydawane jest polecenie zakończenia wszystkich procesów pcloud.

Kolejne trzy metody to seria operacji sekwencyjnych. Najpierw pobierane są wartości pid wszystkich instancji pcloud i zapisywane do pliku (na przykład pcloud.txt). Zawartość pliku to ciąg 5 lub 6 grup liczb (patrz wyjaśnienie powyżej). Następnie ostatnia grupa (5 cyfr) z powstałej serii wartości pid zostaje „złapana” i przypisana do zmiennej (np. VAR). Ostatnim krokiem jest wykonanie polecenia kill -15 $ VAR, co jest równoznaczne z wykonaniem kill -15 z najniższą wartością pid z pliku pcloud.txt.

2, 3, 4 opcje:
pidof pcloud> ~ / pcloud.txt
VAR = `kot ~ / pcloud.txt | grep -o * $ `
zabić -15 $ VAR

Pidof pcloud> ~ / pcloud.txt
VAR = `kot ~ / pcloud.txt | awk "(drukuj $ NF)" `
zabić -15 $ VAR

Pidof pcloud> ~ / pcloud.txt
VAR = `kot ~ / pcloud.txt | obr | wytnij -d "" -f 1 | obrót silnika
zabić -15 $ VAR

Warianty 1-4 zostały zaproponowane przez użytkowników forum Linuxmint.com.ru o pseudonimach slant (2), Chocobo (3 i 4), demonlibra (1). Korzystając z okazji pragnę raz jeszcze wyrazić im swoją wdzięczność.

Opcja 5

Podczas pobierania listy procesów pcloud pid za pomocą polecenia pgrep wynik w pliku pcloud.txt zostanie przedstawiony w kolumnie, to znaczy każda wartość pid zostanie umieszczona w nowej linii w kolejności rosnącej, na przykład:

29320
29324
29352
29398
29419

Następnym krokiem jest przypisanie zmiennej wartości pierwszego wiersza pliku pcloud.txt.

Pgrep pcloud> ~ / pcloud.txt
VAR = `sed -n" 1p "~ / pcloud.txt`
zabić -15 $ VAR

Odpowiedź 2. Pomimo pozornej prostoty polecenia zamknięcia aktywnego okna Thunara za pomocą polecenia thunar -q (uzyskanego po wykonaniu thunar --help w terminalu), w tym przypadku to nie działa.

Po zbadaniu drzewa procesów okazało się, że na liście aktywnych procesów znajduje się Thunar --daemon:


Istnieją trzy sposoby zamknięcia okna Thunara otwartego przez klienta pCloud:

A) zabić wszystkie aktywne procesy Thunara killall -s TERM / usr / bin / Thunar;

B) zdobądź pid procesu Thunara, zapisz go do zmiennej i zakończ poleceniem kill -15 wartość_zmiennej

WYJŚCIE = "$ (pidof / usr / bin / thunar)"
zabić -15 $ (WYJŚCIE)

C) pobierz pid procesu Thunara, zapisz go do pliku, przypisz zmiennej wartość uzyskaną z odczytania pliku i zakończ poleceniem kill -15 wartość_zmiennej

Pidof / usr / bin / Thunar> ~ / thunar.txt
VAR2 = `kot ~ / thunar.txt`
zabić -15 $ VAR2

Wszystkie opcje są równe. Rezultatem ich wykonania jest zakończenie procesów thunar --daemon i Thunar (odpowiada otwartemu oknu z zawartością katalogu pCloudDrive).

W kwestii "znaczenia" procesu thunar --daemon na forum anglojęzycznym znaleziono informacje, że nie wpływa to znacząco na funkcjonalność Thunara i całego systemu. Jedyną wadą jest to, że bez tego procesu podłączony nośnik wymienny (na przykład dysk flash) zostanie automatycznie zamontowany tylko wtedy, gdy okno Thunar będzie otwarte. Jeśli żadna instancja Thunara nie jest uruchomiona, nośnik wymienny nie jest automatycznie montowany. W takim przypadku musisz otworzyć Thunara i zamontować go ręcznie, na przykład:


W każdym razie po następnym uruchomieniu systemu thunar --daemon zostanie uruchomiony automatycznie


co określa zawartość pliku

/etc/xdg/xfce4/xfconf/xfce-perchannel-xml/xfce4-session.xml (patrz --daemon)



W sumie skrypt zamykający klienta pCloud (na przykład pcloud3.sh) może mieć następującą treść (wybrana jest jedna opcja i jedna metoda):

#! / kosz / bash
opcja 1, 2, 3, 4, 5
spać 5
metoda a, b, c
śpij 5 i wyjdź

Polecenie 5-sekundowa pauza spać 5 zostało wprowadzone w celu przetestowania skryptu do monitorowania procesów. Nie musisz go używać w działającym skrypcie.

Przykładowe niestandardowe zadanie cron do codziennej 40-minutowej automatycznej synchronizacji z chmurą pCloud od 21:40 do 22:20

40 21 * * * export DISPLAY =: 0 && /home/user/Tools/scripts/pcloud1.sh
41 21 * * * /home/user/Tools/scripts/pcloud2.sh

Jeśli ograniczymy się tylko do skryptów startowych i zamykających, czyli pcloud1.sh i pcloud3.sh, to skrypt pcloud3.sh powinien wyłączyć pcloud z procesem pid nie najmniejszym, ale jeszcze jednym, czyli od uzyskane serie wartości, np.

28354 28355 28359 28371 28399 28426 28449 28684 ,

Należy wybrać drugi (28355). Wyjaśnienie jest takie, że 28354 odpowiada aktywnemu skryptowi pcloud1.sh.

W związku z tym w tym przypadku do zamknięcia procesów pcloud zostanie użyty następujący kod:

Pgrep pcloud> ~ / pcloud.txt
VAR = `sed -n" 2p "~ / pcloud.txt`
zabić -15 $ VAR

Wówczas zadanie niestandardowe przybiera postać, na przykład:

40 21 * * * export DISPLAY =: 0 && /home/user/Tools/scripts/pcloud1.sh
20 22 * ​​​​* * /home/user/Tools/scripts/pcloud3.sh

Przede wszystkim spójrzmy, co to jest scenariusz i do czego to służy.

Scenariusz przetłumaczone z języka angielskiego - scenariusz... Wszyscy oglądamy filmy, wielu z nas ogląda spektakle. Aby stworzyć film/sztukę, scenarzyści piszą dla nich scenariusze, na podstawie których aktorzy, scena po scenie, odgrywają swoje role na scenie, z której składa się film/sztuka. Praca nad stworzeniem scenariusza jest dość żmudna, gdzie trzeba wziąć pod uwagę wszystko w najdrobniejszym szczególe, aby w końcu artyści mogli zrealizować plan scenarzysty, a widz widział całość.

Podobnie skrypty są pisane w celu wykonania listy zadań, które użytkownik zestawia (kod), aby ułatwić i przyspieszyć je w systemie operacyjnym. Do pisania prostych skryptów wcale nie jest konieczne wykształcenie programisty.

Najpierw stwórzmy najprostsze powłoka skryptu aby zaktualizować system.

Wykonam wszystkie czynności z systemem Ubuntu, ale mają zastosowanie również w innych systemach Linux pochodzi z Ubuntu... Do tego potrzebujemy: Edytor tekstu wypełnić go zadaniami niezbędnymi do stworzenia skryptu (kodu) i Terminal- wykonanie utworzonego skryptu. Te narzędzia są instalowane w dowolnej dystrybucji Linux domyślny.

Więc otwórz edytor tekstu Gedit i wpisz w nim pierwsze wymagane znaki pod nazwą szulernia.
szulernia w programowaniu jest to ciąg dwóch znaków: hash i wykrzyknik ( #! ) na początku pliku skryptu. I dodaj do tych znaków bez spacji / kosz / sh- interpreter, w którym skrypt zostanie wykonany. / kosz / sh- tak jest zwykle Muszla Bourne'a lub kompatybilny interpreter wiersza poleceń, który przechodzi "ścieżka / do / skryptu" jako pierwszy parametr.
Pierwsza wymagana linia skryptu będzie wyglądać tak:

# Mój pierwszy skrypt aktualizacji Ubuntu

Znak hash (#) na samym początku linii wyjaśnia interpreterowi / terminalowi, że ta linia nie musi być czytana i wykonywana. Linia jest potrzebna w kodzie tego skryptu, aby sam twórca skryptu wiedział, co ma zamiar wykonać na tym segmencie / scenie w kodzie, aby nie pomylić się w przyszłości, gdy takich linii będzie dużo. Takie linie ze znakiem hash nazywają się - skomentowane .

aktualizacja sudo apt
aktualizacja sudo apt -y

-y na końcu drugiej komendy wyjaśnia tłumaczowi/terminalowi, że ta akcja/polecenie musi być wykonane automatycznie, bez dodatkowego potwierdzania przez użytkownika, wciśnięcie klawisza Wejście. tak- w skrócie z angielskiego TAk, tj. TAk.

To wszystko. Twój pierwszy skrypt został utworzony. Powinieneś mieć coś takiego jak na obrazku:


Pozostaje zapisać utworzony plik/skrypt i nadać mu Nazwa z wymaganym przedłużeniem na końcu - .CII... Rozbudowa .CII przypisane do pliku wykonywalnego.
dałem mu Nazwa - aktualizacja.sh oszczędzanie w Katalog domowy użytkownik:


Aby utworzony plik/skrypt był wykonywalny, musi mieć do tego uprawnienia. Można to zrobić na dwa sposoby.

1. Uruchom następujące polecenie w terminalu:

sudo chmod + x update.sh

2. Lub otwórz menedżera plików w Katalog domowy(gdzie zapisałeś wygenerowany skrypt), kliknij prawym przyciskiem myszy plik, w menu kontekstowym - Właściwości — Prawa i aktywuj przedmiot - Występ: Pozwól plikowi działać jako program:


Aby wykonać utworzony skrypt należy otworzyć terminal (o którym pisałem na samym początku artykułu, że terminal jest niezbędnym atrybutem/narzędziem do wykonania skryptu), wpisz CII, nazwa skryptu jest oddzielona spacją - aktualizacja.sh i naciśnij klawisz Wejście:


Albo w terminalu wchodzimy CII i przeciągnij utworzony plik ze skryptem z menedżera plików (również oddzielony spacją):


Po wyświetleniu ścieżki pliku po poleceniu CII i spację, po prostu naciśnij klawisz Wchodzić(Enter), aby zaktualizować system:


Teraz w każdej chwili możesz dokonać aktualizacji systemu stworzonej przez własny skrypt.

Tak, ktoś może argumentować, że aktualizacja systemu nie jest trudna do wykonania przez wykonanie tych dwóch poleceń w terminalu, po co pupić i tworzyć jakieś skrypty? W porządku. Ale to jest przykład stworzenia prostego skryptu, który pokaże, że „to nie bogowie palą garnki”

Pisanie skryptów w Linuksie (uczenie się na przykładzie)

———————————————————————————-

1. Wstęp

Czego potrzebujesz do pisania skryptów
Biegłość w narzędziach wiersza poleceń i ich wymaganych opcjach.
Podstawowa znajomość języka angielskiego na poziomie szkoły podstawowej nie zaszkodzi.

Dlaczego potrzebne są skrypty
Po pierwsze, administracja serwerem linuksowym, w takim czy innym stopniu, sprowadza się do systematycznego wykonywania tych samych poleceń. I nie jest konieczne, aby te polecenia były wykonywane przez osobę. Mogą być zaprogramowane do wykonania przez maszynę.
Po drugie, nawet wykonanie zwykłego zadania, które (nagle) wynosi 20-1000… powtarzalne operacje są DUŻO łatwiejsze do zaimplementowania w skrypcie.

Co to jest skrypt
Skrypt to zestaw instrukcji, które komputer musi wykonać w określonej kolejności iw określonym czasie. Instrukcje mogą być albo wewnętrznymi poleceniami powłoki (pętle, warunki, przetwarzanie informacji tekstowych, praca ze zmiennymi środowiskowymi itp.), albo dowolnym programem, który wykonujemy w konsoli z niezbędnymi parametrami.

Jak napisać scenariusz
W naszym przypadku skrypt będzie plikiem tekstowym z atrybutami wykonania. Jeśli plik skryptu zaczyna się od znaku #!, co w świecie UNIXa nazywa się sha-bang, informuje to system, którego interpretera ma użyć do wykonania skryptu. Jeśli jest to trudne do zrozumienia, to pamiętaj tylko, że zaczniemy pisać wszystkie skrypty dokładnie od linii #!/Bin/bash lub #!/Bin/sh, po czym nastąpią do nich polecenia i komentarze.

Pożegnalne słowa
Szczerze radzę napisać jak najwięcej komentarzy do prawie każdej linii w skrypcie. Czas minie i będziesz musiał zmienić lub unowocześnić napisany raz scenariusz. Jeśli nie pamiętasz lub nie rozumiesz, co jest napisane w skrypcie, trudno to zmienić, łatwiej jest pisać od zera.

Jakie skrypty możemy potrzebować:

    ustawianie reguł zapory podczas uruchamiania systemu.
    wykonywanie kopii zapasowej ustawień i danych.
    dodawanie skrzynek pocztowych do serwera pocztowego (a dokładniej do bazy mysql)
    który uruchamia o określonej godzinie (najlepiej co noc) program skanujący logi serwera proxy i generujący wygodny raport internetowy o ilości pobieranego ruchu.
    przesłanie nam drogą mailową informacji o tym, że ktoś uzyskał dostęp do naszego serwera przez ssh, czasie połączenia oraz adresie klienta.

O technikach skryptowych
Tworzymy plik tekstowy, edytujemy go, ustawiamy uprawnienia do wykonywania, uruchamiamy, sprawdzamy błędy, naprawiamy, uruchamiamy, sprawdzamy błędy...
Gdy wszystko jest lizane i działa poprawnie, umieszczamy to w autoloadzie lub w harmonogramie na określony czas.

———————————————————————————-

2. Nauka pisania skryptów w wewnętrznym języku BASH
oryginał: https://www.linuxconfig.org/Bash_scripting_Tutorial

Ten samouczek zakłada brak wcześniejszej znajomości technik skryptów (skryptów) przy użyciu wewnętrznego języka Bash. Dzięki temu samouczkowi szybko przekonasz się, że pisanie skryptów jest bardzo łatwym zadaniem. Zacznijmy nasz samouczek od prostego skryptu, który wyświetla ciąg „Hello World!” (w tłumaczeniu z angielskiego - Witam wszystkich!)

1. Scenariusz „Witam wszystkich”
Oto Twój pierwszy przykładowy skrypt bash:

#! / kosz / bash
echo "Witaj świecie"

Przejdź do katalogu zawierającego nasz plik hello_world.sh i spraw, aby był wykonywalny:

Kod: Zaznacz wszystko $ chmod + x hello_world.sh

Uruchom skrypt do wykonania

Kod: Zaznacz wszystko $ ./hello_world.sh

2. Prosty skrypt do archiwizacji bash

#! / kosz / bash
tar -czf katalog_mojego_domu.tar.gz / home / user

Kod: Zaznacz wszystko $ ./backup.sh

$ du -sh katalog_mojego_domu.tar.gz
41 mln mój katalog_domowy.tar.gz

3. Praca ze zmiennymi
W tym przykładzie deklarujemy prostą zmienną i wyświetlamy ją na ekranie za pomocą polecenia echo

#! / kosz / bash
STRING = "WITAJCIE ŚWIECIE !!!"
echo $ STRING

Kod: Zaznacz wszystko $ ./hello_world.sh
WITAJ ŚWIECIE !!!

Nasz skrypt archiwizujący ze zmiennymi:

#! / kosz / bash
OF = mój katalog_domowy _ $ (data +% Y% m% d) .tar.gz
IF = / dom / użytkownik
tar -czf $ OF $ JEŻELI

Kod: Zaznacz wszystko $ ./backup.sh
tar: Usuwanie początkowego „\" z nazw członków
$ du -sh * tar.gz
41 mln mój katalog_domowy_201000123.tar.gz

3.1 Zmienne globalne i lokalne

#! / kosz / bash
# Zadeklaruj zmienną globalną
# Taka zmienna może być użyta w dowolnym miejscu w tym skrypcie
VAR = "zmienna globalna"
funkcja bash (
# Zadeklaruj zmienną lokalną
# Taka zmienna jest ważna tylko dla funkcji, w której została zadeklarowana
lokalna VAR = "zmienna lokalna"
echo $ VAR
}
echo $ VAR
grzmotnąć
# Zauważ, że zmienna globalna się nie zmieniła
echo $ VAR

Kod: Zaznacz wszystkie $ ./variables.sh
zmienna globalna
zmienna lokalna
zmienna globalna

4. Przekazywanie argumentów do skryptu

#! / kosz / bash
# Użyj predefiniowanych zmiennych, aby uzyskać dostęp do argumentów
# Wyświetlaj argumenty na ekranie
echo $ 1 $ 2 $ 3 '-> echo $ 1 $ 2 $ 3'

# Możemy również uzyskać dostęp do argumentów poprzez specjalną tablicę args = („ [e-mail chroniony]»)
# Wyświetlaj argumenty na ekranie
echo $ (argumenty) $ (argumenty) $ (argumenty) ‘-> argumenty = („ [e-mail chroniony]”); echo $ (argumenty) $ (argumenty) $ (argumenty) ’

# Użyj zmiennej [e-mail chroniony] wyprowadzić wszystkie argumenty naraz
Echo [e-mail chroniony]‘-> echo [e-mail chroniony]

Użyj zmiennej $ #, aby wyświetlić liczbę argumentów przekazanych do skryptu
echo Liczba przekazanych argumentów: $ # ‘-> echo Liczba przekazanych argumentów: $ #’

Kod: Zaznacz wszystko $ ./arguments.sh Bash Scripting Tutorial
Bash Scripting Tutorial -> echo $ 1 $ 2 $ 3
Samouczek dotyczący skryptów Bash -> args = (" [e-mail chroniony]"); echo $ (argumenty) $ (argumenty) $ (argumenty)
Samouczek dotyczący skryptów Bash -> echo [e-mail chroniony]
Liczba przekazanych argumentów: 3 -> echo Liczba przekazanych argumentów: $ #

5. Wykonywanie poleceń powłoki w skrypcie

#! / kosz / bash
# użyj backticków "" "", aby wykonać polecenie powłoki
echo `uname -o`
# teraz spróbujmy bez cudzysłowów
echo uname -o

Kod: Zaznacz wszystkie $ uname -o
GNU / Linux
$ ./bash_backtricks.sh
GNU / Linux
uname -o

Jak widać, w drugim przypadku zostało wyświetlone samo polecenie, a nie wynik jego wykonania.

6. Odczytywanie danych wprowadzonych przez użytkownika (interaktywność)

#! / kosz / bash
echo -e "Cześć, wpisz słowo: \ c"
przeczytaj słowo
echo "Wprowadzone słowo to: $ word"
echo -e „Czy możesz wpisać dwa słowa? "
przeczytaj słowo1 słowo2
echo "Oto twoje dane wejściowe: \" $ słowo1 \ "\" $ słowo2 \ ""
echo -e „Co myślisz o skryptach basha? "
# polecenie read przechowuje teraz odpowiedź w domyślnej zmiennej wbudowanej $ REPLY
czytać
echo „Powiedziałeś $ ODPOWIEDZ, cieszę się, że to słyszę! "
echo -e „Jakie są twoje ulubione kolory? "
# -a powoduje odczytanie polecenia odczytu do tablicy
przeczytaj -a kolory
echo "Moje ulubione kolory to także $ (kolory), $ (kolory) i $ (kolory) :-)"

Kod: Zaznacz wszystkie $ ./read.sh
Cześć, wpisz słowo: coś
Wpisane słowo to: coś
Czy możesz wpisać dwa słowa?
Debian Linux
Oto twój wkład: "Debian" "Linux"
Co sądzisz o pisaniu skryptów basha?
dobry
Powiedziałeś dobrze, cieszę się, że to słyszę!
Jakie są Twoje ulubione kolory?
niebieski zielony czarny
Moje ulubione kolory to także niebieski, zielony i czarny :-)

7. Korzystanie z pułapki

#! / kosz / bash
# zadeklaruj pułapkę
pułapka bashtrap INT
# wyczyść ekran
jasne;
# funkcja przechwytująca jest wykonywana, gdy użytkownik naciśnie CTRL-C:
# Na ekranie pojawi się => Wykonanie podprogramu bash trap!
# ale skrypt będzie nadal wykonywany
pułapka ()
{
echo "Wykryto CTRL + C! ... uruchamiam pułapkę bash!"
}
# skrypt będzie liczyć do 10
dla a w "seq 1 10"; robić
echo "$ a / 10 do wyjścia."
spać 1;
zrobione
echo "Wyjdź z przykładu pułapki Bash !!!"

Kod: Zaznacz wszystko $ ./trap.sh
1/10
2/10
3/10
4/10
5/10
6/10

7/10
8/10
9/10
CTRL + C wykryto!... uruchamia pułapkę bash!
10/10
Przykład wyjścia z pułapki Bash !!!

Jak widać, kombinacja klawiszy Ctrl-C nie zatrzymała wykonywania skryptu.

8. Tablice
8.1 Deklarowanie prostej tablicy

#! / kosz / bash
# Zadeklaruj prostą tablicę z 4 elementami
ARRAY = („Debian Linux” ”Redhat Linux ”Ubuntu Linux)
# Pobierz liczbę elementów w tablicy
ELEMENTY = $ (# TABLICA [@])

# wypisz w pętli każdy element tablicy
dla ((i = 0; i<$ELEMENTS;i++)); do
echo $ (TABLICA [$ (i)])
zrobione

Kod: Zaznacz wszystkie $./Arrays.sh
Debian Linux
Redhat Linux
Ubuntu
Linux

8.2 Wypełnij tablicę wartościami z pliku

#! / kosz / bash
# Zadeklaruj tablicę
zadeklaruj -a ARRAY
# Exec polecenie # stdin (zwykle klawiatura) zostanie utworzone z tego pliku. Dzięki temu można czytać
# zawartość pliku, linia po linii, i parsuj każdą linię wprowadzoną za pomocą sed i / lub awk.
exec 10 niech liczyć = 0

podczas czytania LINE<&10; do

TABLICA [$ liczba] = $ LINIA
((liczba ++))
zrobione

echo Liczba elementów: $ (# ARRAY [@])
# Wyprowadzanie wartości tablicy
echo $ (TABLICA [@])
# zamknij plik
exec 10> i -

Kod: Zaznacz wszystkie $cat bash.txt
Debian Linux
Redhat Linux
Ubuntu
Linux
$ ./tablice.sh
Liczba elementów: 4
Debian Linux Redhat Linux Ubuntu Linux

9. Warunki „jeśli-to-inne”
9.1. Proste użycie warunków „jeśli-inaczej”
Zwróć uwagę na spacje w nawiasach kwadratowych, bez których warunek nie zadziała.

#! / kosz / bash
katalog = "./ BashScripting"

# sprawdź, czy katalog istnieje
if [-d $ katalog]; następnie
echo "Katalog istnieje"
w przeciwnym razie
echo "Katalog nie istnieje"
fi

Kod: Zaznacz wszystko $ ./if_else.sh
Katalog nie istnieje
$ mkdir BashScripting
$ ./if_else.sh
Katalog istnieje

9.2 Zagnieżdżone warunki jeśli-inne

#! / kosz / bash
# Zadeklaruj zmienną o wartości 4
wybór = 4
# Wyświetlanie
echo "1. Bash "
echo "2. Skrypty”
echo "3. Instruktaż "

# Wykonuj, dopóki zmienna nie będzie równa cztery
# Zapętlanie
while [$ wybór -eq 4]; robić

# przeczytaj dane wprowadzone przez użytkownika
przeczytaj wybór
# zagnieżdżony warunek jeśli-w przeciwnym razie
if [$ wybór -eq 1]; następnie

echo "Wybrałeś słowo: Bash"

if [$ wybór -eq 2]; następnie
echo "Wybrałeś słowo: Skrypty"
w przeciwnym razie

if [$ wybór -eq 3]; następnie
echo "Wybrałeś słowo: Samouczek"
w przeciwnym razie
echo "Proszę dokonać wyboru między 1-3!"
echo "1. Bash "
echo "2. Skrypty”
echo "3. Instruktaż "
echo -n „Proszę wybrać słowo? "
wybór = 4
fi
fi
fi
zrobione

Kod: Zaznacz wszystkie $ ./nested.sh
1. Bash
2. Skrypty
3. Samouczek

5

1. Bash
2. Skrypty
3. Samouczek
Proszę wybrać słowo?
4
Proszę dokonać wyboru pomiędzy 1-3!
1. Bash
2. Skrypty
3. Samouczek
Proszę wybrać słowo?
3
Wybrałeś słowo: Tutorial

W ten sposób na początku wykonywane jest ciało pętli „while”, ponieważ wybór zmiennej jest początkowo równy cztery. Następnie wczytujemy do niego dane wejściowe użytkownika, a jeśli dane wejściowe nie są równe 1,2 lub 3, to ponownie ustawiamy naszą zmienną równą 4, w związku z czym powtarza się ciało pętli (znowu konieczne jest wpisanie 1,2 lub 3).

10. Porównania
10.1 Porównania arytmetyczne

Lt<
-gt>
-le<=
-ge> =
-równ ==
-ne! =

#! / kosz / bash

NUM1 = 2
NUM2 = 2
if [$ LICZ1 -eq $ LICZ2]; następnie
echo "Obie wartości są równe"
w przeciwnym razie
echo "Wartości NIE są równe"
fi

Kod: Zaznacz wszystkie $ ./equals.sh
Obie wartości są równe

#! / kosz / bash
# Zadeklaruj zmienne z wartościami całkowitymi
NUM1 = 2
NUM2 = 3
if [$ LICZ1 -eq $ LICZ2]; następnie
echo "Obie wartości są równe"
w przeciwnym razie
echo "Wartości NIE są równe"
fi

Kod: Zaznacz wszystkie $ ./equals.sh
Wartości NIE są równe

#! / kosz / bash
# Zadeklaruj zmienne z wartościami całkowitymi
NUM1 = 2
NUM2 = 1
if [$ LICZ1 -eq $ LICZ2]; następnie
echo "Obie wartości są równe"
elif [$ LICZ1 -gt $ LICZ2]; następnie
echo "$NUM1 jest większe niż $NUM2"
w przeciwnym razie
echo "$NUM2 jest większe niż $NUM1"
fi

Kod: Zaznacz wszystkie $ ./equals.sh
2 jest większe niż 1

10.2 Porównania tekstu symbolicznego

Ten sam
! = nie to samo
< меньще чем
> więcej niż
-n zmienna s1 s1 nie jest pusta
-z s1 zmienna s1 jest pusta

#! / kosz / bash

S1 = "Bash"

S2 = "Skrypty"
jeśli [$S1 = $S2]; następnie

w przeciwnym razie
echo "Ciągi NIE są równe"
fi

Kod: Zaznacz wszystko $ ./statement.sh
Ciągi NIE są równe

#! / kosz / bash
# Zadeklaruj zmienną symboliczną S1
S1 = "Bash"
# Zadeklaruj zmienną symboliczną S2
S2 = "Bash"
jeśli [$S1 = $S2]; następnie
echo "Oba ciągi są równe"
w przeciwnym razie
echo "Ciągi NIE są równe"
fi

Kod: Zaznacz wszystko $ ./statement.sh
Oba ciągi są równe

11. Sprawdzanie plików

B nazwa pliku Blokuj specjalny plik
-c nazwa pliku plik znaków specjalnych
-d nazwa_katalogu Sprawdź, czy istnieje katalog
-e nazwa pliku Sprawdź, czy istnieje plik
-f nazwa_pliku Sprawdź, czy istnieje zwykły plik, a nie katalog
-G nazwa_pliku Sprawdź, czy plik istnieje i czy jego właścicielem jest efektywny identyfikator grupy.
-g nazwa_pliku prawda, jeśli plik istnieje i ma ustawiony identyfikator grupy.
-k nazwa pliku Przyklejony bit
-L nazwa pliku Dowiązanie symboliczne
-O nazwa_pliku Prawda, jeśli plik istnieje i jego właścicielem jest efektywny identyfikator użytkownika.
-r nazwa pliku Sprawdź, czy plik jest czytelny
-S nazwa pliku Sprawdź, czy plik jest gniazdem
-s nazwa pliku Sprawdź, czy plik ma niezerowy rozmiar
-u nazwa_pliku Sprawdź, czy bit set-ser-id pliku jest ustawiony
-w nazwa pliku Sprawdź, czy plik jest zapisywalny
-x nazwa pliku Sprawdź, czy plik jest wykonywalny

#! / kosz / bash
plik = "./ plik"
if [-e $ plik]; następnie
echo "Plik istnieje"
w przeciwnym razie
echo "Plik nie istnieje"
fi

Kod: Zaznacz wszystko $ ls
plik.sh
$ ./plik.sh
Plik nie istnieje
$ kliknij plik
$ ls
plik plik.sh
$ ./plik.sh
plik istnieje

Podobnie, na przykład, możemy użyć pętli „while”, aby sprawdzić, czy plik nie istnieje. Ten skrypt będzie uśpiony, gdy plik nie będzie istniał. Zwróć uwagę na negator Bash „!” co neguje (odwraca) opcję -e.

12. Cykle
12.1. Dla pętli

#! / kosz / bash
# dla pętli
dla f w $ (ls / var /); robić
echo $ f
zrobione

Uruchamianie pętli for z wiersza poleceń bash:

Kod: Zaznacz wszystko $ dla f w $ (ls / var /); wykonaj echo $ f; gotowe Kod: Zaznacz wszystko $ dla f w $ (ls / var /); wykonaj echo $ f; zrobione
kopie zapasowe
Pamięć podręczna
rozbić się
Gry
lib
lokalny
Zamek
Dziennik
Poczta
optować
uruchomić
szpula
tmp
www

12.2. Podczas pętli

#! / kosz / bash
LICZBA = 6
# podczas pętli
while [$ COUNT -gt 0]; robić

niech LICZBA = LICZBA-1
zrobione

Kod: Zaznacz wszystkie $ ./while_loop.sh
Wartość zliczenia to: 6
Wartość zliczenia to: 5
Wartość zliczenia to: 4
Wartość zliczenia to: 3
Wartość zliczenia to: 2
Wartość zliczenia to: 1

12.3. Do pętli

#! / kosz / bash
LICZBA = 0
# do pętli
do [$ COUNT -gt 5]; robić
echo Wartość zliczania to: $ COUNT
niech LICZBA = LICZBA + 1
zrobione

Kod: Zaznacz wszystko $ ./until_loop.sh
Wartość zliczenia to: 0
Wartość zliczenia to: 1
Wartość zliczenia to: 2
Wartość zliczenia to: 3
Wartość zliczenia to: 4
Wartość zliczenia to: 5

12.4. Pętle z niejawnymi warunkami
W poniższym przykładzie warunkiem pętli while jest obecność standardowego wejścia.
Treść pętli będzie wykonywana tak długo, jak długo będzie cokolwiek do przekierowania ze standardowego wyjścia do polecenia read.

#! / kosz / bash
# Ten skrypt wyszuka i usunie spacje
# w plikach, zastępując je podkreśleniami
DIR = "."
Sterowanie pętlą za pomocą polecenia odczytu przez przekierowanie wyjścia w pętli.
znajdź $ DIR -typ f | podczas czytania pliku; robić
# użyj klasy POSIX [: spacja:], aby znaleźć spacje w nazwach plików
if [["plik $" = * [[: spacja:]] *]]; następnie
# zamień spacje na podkreślenia
mv "$ plik" `echo $ plik | tr '' '' ''
fi;
zrobione

Kod: Zaznacz wszystko $ ls -1
skrypt.sh
$ dotknij "plik ze spacjami"
$ ls -1
plik ze spacjami
skrypt.sh
$ ./skrypt.sh
$ ls -1
file_with_spaces
skrypt.sh

13. Funkcje

#! / kosz / bash
# Funkcje można deklarować w dowolnej kolejności
funkcja funkcja_B (
funkcja echa B.
}
funkcja funkcja_A (
echo $ 1
}
funkcja funkcja_D (
funkcja echo D.
}
funkcja funkcja_C (
echo $ 1
}
# Funkcje wywoływania
# przekaż parametr do funkcji funkcji A
function_A "Funkcja A."
funkcja_B
# przekaż parametr do funkcji funkcji C
function_C "Funkcja C."
funkcja_D

Kod: Zaznacz wszystkie $ ./functions.sh
Funkcja A.
Funkcja B.
Funkcja C.
Funkcja D.

14. Wybór operatora - Wybierz

#! / kosz / bash
PS3 = „Wybierz jedno słowo:”
# Wybierz
wybierz słowo w "linux" "bash" "skrypty" "samouczek"
robić
echo "Wybranym słowem jest: $ słowo"
# Przerwij, w przeciwnym razie pętla będzie nieskończona.
złamać
zrobione
wyjście 0

Kod: Zaznacz wszystko $ ./select.sh
1) linux
2) bash
3) skrypty
4) samouczek
Wybierz jedno słowo: 4
Wybrane słowo to: samouczek

15. Operator z wyboru - Case

#! / kosz / bash
echo "Jaki jest twój preferowany język programowania / skryptowy"
echo "1) bash"
echo "2) perl"
echo "3) fiton"
echo "4) c++"
echo "5) Nie wiem!"
przeczytaj przypadek;
# prosta struktura wyboru przypadku
# zauważ, że w tym przykładzie $ case jest tylko zmienną
# i nie musi tak się nazywać. To tylko przykład
sprawa $ sprawa w
1) echo "Wybrałeś bash" ;;
2) echo "Wybrałeś perla" ;;
3) echo "Wybrałeś fiton" ;;
4) echo "Wybrałeś c ++" ;;
5) wyjście
esac

Kod: Zaznacz wszystko $ ./case.sh
Jaki jest twój preferowany język programowania / skryptowania?
1) bash
2) perł
3) fiton
4) c++
5) Nie wiem!
4
Wybrałeś c++

———————————————————————————-

Więcej informacji można uzyskać z różnych źródeł, na przykład tutaj
oryginał: https://www.linuxconfig.org/Bash_scripting_Tutorial
https://ruslandh.narod.ru/howto_ru/Bash-Prog-Intro/
https://bug.cf1.ru/2005-03-17/programmin ... -book.html

https://ubuntologia.ru/forum/viewtopic.php?f=109&t=2296