Skrypty Bash: pierwsze kroki

Skrypty Bash: pierwsze kroki
Skrypty Bash Część 2: Pętle
Skrypty Bash, część 3: opcje i przełączniki wiersza poleceń
Skrypty Bash, część 4: wejście i wyjście
Skrypty Bash, część 5: sygnały, zadania w tle, zarządzanie skryptami
Skrypty Bash, część 6: Funkcje i rozwój bibliotek
Skrypty Bash, część 7: sed i przetwarzanie tekstu
Skrypty Bash, część 8: Język przetwarzania danych awk
Skrypty Bash, część 9: Wyrażenia regularne
Skrypty Bash, część 10: praktyczne przykłady
Skrypty Bash, część 11: oczekiwanie i automatyzacja narzędzi interaktywnych

Dzisiaj porozmawiamy o skryptach bash. Ten - skrypty wiersza poleceń, napisany dla powłoki bash. Istnieją inne powłoki, takie jak zsh, tcsh, ksh, ale skupimy się na bashu. Ten materiał jest przeznaczony dla każdego, jedynym warunkiem jest umiejętność pracy w nim wiersz poleceń Linux.

Skrypty Bash: pierwsze kroki

Skrypty wiersza poleceń to zestawy tych samych poleceń, które można wprowadzać z klawiatury, zebrane w pliki i połączone wspólnym celem. Jednocześnie wyniki pracy zespołów mogą mieć samodzielną wartość lub służyć innym zespołom. Skrypty to potężny sposób automatyzacji często wykonywanych czynności.

Skrypty Bash: pierwsze kroki

Jeśli więc mówimy o wierszu poleceń, pozwala on wykonać kilka poleceń jednocześnie, wprowadzając je średnikiem:

pwd ; whoami

W rzeczywistości, jeśli próbowałeś tego w swoim terminalu, twój pierwszy skrypt bash, który używa dwóch poleceń, został już napisany. To działa tak. Drużyna pierwsza pwd wyświetla informacje o bieżącym katalogu roboczym, a następnie polecenie whoamipokazuje informacje o użytkowniku, jako który jesteś zalogowany.

Korzystając z tego podejścia, możesz połączyć dowolną liczbę poleceń w jednej linii, limitem jest tylko maksymalna liczba argumentów, które można przekazać do programu. Możesz zdefiniować ten limit za pomocą następującego polecenia:

getconf ARG_MAX

Wiersz poleceń to świetne narzędzie, ale musisz wprowadzać do niego polecenia za każdym razem, gdy ich potrzebujesz. Co jeśli zapiszemy zestaw poleceń do pliku i po prostu wywołamy 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 touch. W pierwszym wierszu musisz określić, której powłoki będziemy używać. Jesteśmy zainteresowani bash, więc pierwszy wiersz pliku będzie wyglądał następująco:

#!/bin/bash

W innym miejscu tego pliku symbol krzyżyka jest używany do wskazania komentarzy, których powłoka nie przetwarza. Jednak pierwszy wiersz jest szczególnym przypadkiem, jest to znak funta, po którym następuje wykrzyknik (ta sekwencja nazywa się szulernia) i ścieżka do bash, wskaż systemowi, dla którego skrypt został utworzony specjalnie bash.

Polecenia powłoki są oddzielone znakiem nowego wiersza, komentarze są oddzielone znakiem krzyżyka. Oto jak to wygląda:

#!/bin/bash
# This is a comment
pwd
whoami

Tutaj, podobnie jak w wierszu poleceń, możesz pisać polecenia w jednym wierszu, oddzielając je średnikiem. Jeśli jednak piszesz polecenia w różnych wierszach, plik jest łatwiejszy do odczytania. W każdym razie powłoka je przetworzy.

Ustawianie uprawnień do pliku skryptu

Zapisz plik, nadając mu nazwę myscript, a skrypt bash jest prawie gotowy. Teraz pozostaje tylko uczynić ten plik wykonywalnym, w przeciwnym razie przy próbie jego uruchomienia napotkasz błąd Permission denied.

Skrypty Bash: pierwsze kroki
Próba uruchomienia pliku skryptu z nieprawidłowo skonfigurowanymi uprawnieniami

Uczyńmy plik wykonywalnym:

chmod +x ./myscript

Teraz spróbujmy go wykonać:

./myscript

Po ustawieniu uprawnień wszystko działa jak należy.

Skrypty Bash: pierwsze kroki
Pomyślnie uruchom skrypt bash

Wyjście wiadomości

Aby wydrukować tekst w konsoli Linux, użyj polecenia echo. Wykorzystajmy tę wiedzę i edytujmy nasz skrypt, dodając wyjaśnienia do danych, które wyprowadzają polecenia już w nim zawarte:

#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoami

Oto, co dzieje się po uruchomieniu zaktualizowanego skryptu.

Skrypty Bash: pierwsze kroki
Wyprowadzanie komunikatów ze skryptu

Teraz możemy wyświetlić objaśniające etykiety za pomocą polecenia echo. Jeśli nie wiesz, jak edytować plik za pomocą narzędzi systemu Linux lub jeśli nie widziałeś wcześniej tego polecenia echo, spojrzeć na to materiał.

Używanie zmiennych

Zmienne umożliwiają przechowywanie informacji w pliku skryptu, takich jak wyniki poleceń, do wykorzystania przez inne polecenia.

Nie ma nic złego w wykonywaniu poszczególnych poleceń bez zapamiętywania wyników ich pracy, jednak możliwości takiego podejścia są bardzo ograniczone.

Istnieją dwa typy zmiennych, których można używać w skryptach bash:

  • 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 "Home for the current user is: $HOME"

Pamiętaj, że możemy użyć zmiennej systemowej $HOME w podwójnych cudzysłowach, nie uniemożliwi to rozpoznania go przez system. Oto, co się stanie, jeśli uruchomisz powyższy skrypt.

Skrypty Bash: pierwsze kroki
Używanie zmiennej środowiskowej w skrypcie

Ale co, jeśli chcesz wyświetlić znak dolara? Spróbujmy tego:

echo "I have $1 in my pocket"

System wykryje znak dolara w łańcuchu rozdzielonym cudzysłowami i założy, że odwołaliśmy się do zmiennej. Skrypt spróbuje wyświetlić wartość niezdefiniowanej zmiennej. $1. To nie jest to, czego potrzebujemy. Co robić?

W takiej sytuacji użycie znaku kontrolnego ukośnika odwrotnego przed znakiem dolara pomaga:

echo "I have $1 in my pocket"

Skrypt wyświetli teraz dokładnie to, czego oczekuje.

Skrypty Bash: pierwsze kroki
Używanie sekwencji ucieczki do wyprowadzenia znaku dolara

Zmienne użytkownika

Oprócz zmiennych środowiskowych skrypty bash umożliwiają ustawianie i używanie własnych zmiennych w skrypcie. Takie zmienne przechowują wartość do momentu zakończenia działania 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% zniżki na nasze usługi, dostępny do aktywacji w ciągu 7 dni

#!/bin/bash
# testing variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"

Oto, co dzieje się po uruchomieniu takiego skryptu.

Skrypty Bash: pierwsze kroki
Zmienne niestandardowe w skrypcie

Zastąpienie polecenia

Jedną z najbardziej użytecznych funkcji skryptów bash jest możliwość wyodrębnienia informacji z danych wyjściowych poleceń i przypisania ich do zmiennych, co pozwala na wykorzystanie tych informacji w dowolnym miejscu pliku skryptu.

Można to zrobić na dwa sposoby.

  • Ze znakiem wstecznego „`”
  • Przy pomocy konstrukcji $()

Korzystając z pierwszego podejścia, uważaj, aby nie użyć 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:

mydir=$(pwd)

Ostatecznie skrypt może wyglądać tak:

#!/bin/bash
mydir=$(pwd)
echo $mydir

Podczas jego działania wyjście polecenia pwdzostanie zapisany w zmiennej mydir, którego zawartość za pomocą polecenia echo, przejdzie do konsoli.

Skrypty Bash: pierwsze kroki
Skrypt, który zapisuje wyniki polecenia w zmiennej

Operacje matematyczne

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

#!/bin/bash
var1=$(( 5 + 5 ))
echo $var1
var2=$(( $var1 * 2 ))
echo $var2

Skrypty Bash: pierwsze kroki
Operacje matematyczne w skrypcie

jeśli-to struktura kontrolna

W niektórych scenariuszach wymagane jest kontrolowanie przebiegu wykonywania poleceń. Na przykład, jeśli pewna wartość jest większa niż pięć, należy wykonać jedną akcję, w przeciwnym razie inną. Ma to zastosowanie w bardzo wielu sytuacjach i tutaj pomoże nam struktura kontrolna if-then. W najprostszej postaci wygląda to tak:

if команда
then
команды
fi

A oto działający przykład:

#!/bin/bash
if pwd
then
echo "It works"
fi

W takim przypadku, jeśli wykonanie polecenia pwdzakończy się pomyślnie, w konsoli zostanie wyświetlony tekst „to działa”.

Wykorzystajmy posiadaną wiedzę i napiszmy bardziej złożony scenariusz. Powiedzmy, że musimy znaleźć użytkownika w /etc/passwd, a jeśli został znaleziony, zgłoś, że istnieje.

#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fi

Oto, co dzieje się po uruchomieniu tego skryptu.

Skrypty Bash: pierwsze kroki
Wyszukiwanie użytkowników

Tutaj użyliśmy polecenia grepaby wyszukać użytkownika w pliku /etc/passwd. Jeśli zespół grepnieznany, jego opis można znaleźć tutaj.

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

Konstrukcja kontrolna if-then-else

Aby program mógł zgłaszać zarówno wyniki udanego wyszukiwania, jak i niepowodzenia, używamy konstrukcji if-then-else. Oto jak to jest skonfigurowane:

if команда
then
команды
else
команды
fi

Jeśli pierwsze polecenie zwróci zero, co oznacza, że ​​zostało pomyślnie wykonane, warunek będzie prawdziwy i wykonanie nie pójdzie wzdłuż gałęzi else. W przeciwnym razie, jeśli zwrócone zostanie coś innego niż zero, co oznacza niepowodzenie lub fałszywy wynik, polecenia po else.

Napiszmy następujący skrypt:

#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
else
echo "The user $user doesn’t exist"
fi

Jego egzekucja poszła na marne else.

Skrypty Bash: pierwsze kroki
Uruchamianie skryptu z konstrukcją if-then-else

Cóż, przejdźmy dalej i zadajmy sobie pytanie o trudniejsze warunki. Co jeśli musisz sprawdzić nie jeden warunek, ale kilka? Na przykład, jeśli wymagany użytkownik zostanie znaleziony, powinien zostać wyświetlony jeden komunikat, jeśli spełniony jest inny warunek, powinien zostać wyświetlony inny komunikat i tak dalej. W takiej sytuacji pomogą nam zagnieżdżone warunki. To wygląda tak:

if команда1
then
команды
elif команда2
then
команды
fi

Jeśli pierwsze polecenie zwróci zero, co wskazuje na jego pomyślne wykonanie, polecenia z pierwszego bloku zostaną wykonane then, w przeciwnym razie, jeśli pierwszy warunek jest fałszywy, a drugie polecenie zwróci zero, zostanie wykonany drugi blok kodu.

#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
elif ls /home
then
echo "The user doesn’t exist but anyway there is a directory under /home"
fi

W takim skrypcie można np. utworzyć nowego użytkownika za pomocą polecenia useradd, jeśli wyszukiwanie nie zwróciło żadnych wyników, lub zrób coś innego przydatnego.

Porównanie liczb

W skryptach można porównywać wartości liczbowe. Poniżej znajduje się lista odpowiednich poleceń.

n1 -eq n2Zwraca wartość true, jeśli n1 równa się n2.
n1 -ge n2 Zwraca wartość true, jeśli n1więcej lub równo n2.
n1 -gt n2Zwraca wartość true, jeśli n1 więcej niż n2.
n1 -le n2Zwraca wartość true, jeśli n1mniej lub równo n2.
n1 -lt n2Zwraca wartość true, jeśli n1 jest mniejsze niż n2.
n1 -ne n2Zwraca wartość true, jeśli n1nie równy n2.

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

#!/bin/bash
val1=6
if [ $val1 -gt 5 ]
then
echo "The test value $val1 is greater than 5"
else
echo "The test value $val1 is not greater than 5"
fi

Oto, co wyświetli to polecenie.

Skrypty Bash: pierwsze kroki
Porównywanie liczb w skryptach

Wartość zmienna val1większa niż 5, ostatecznie gałąź jest wykonywana thenoperatora porównania i odpowiedni komunikat jest wyświetlany w konsoli.

Porównanie ciągów

Skrypty mogą również porównywać wartości ciągów. Operatory porównania wyglądają dość prosto, ale operatory porównywania ciągów znaków mają pewne cechy szczególne, które omówimy poniżej. Oto lista operatorów.

str1 = str2 Testuje ciągi pod kątem równości, zwraca wartość true, jeśli ciągi są identyczne.
str1 != str2Zwraca true, jeśli łańcuchy nie są identyczne.
str1 < str2Zwraca wartość true, jeśli str1mniej niż str2.
str1 > str2 Zwraca wartość true, jeśli str1więcej niż str2.
-n str1 Zwraca wartość true, jeśli długość str1Powyżej zera.
-z str1Zwraca wartość true, jeśli długość str1równa się zeru.

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

#!/bin/bash
user ="likegeeks"
if [$user = $USER]
then
echo "The user $user  is the current logged in user"
fi

W wyniku wykonania skryptu otrzymujemy co następuje.

Skrypty Bash: pierwsze kroki
Porównanie ciągów znaków w skryptach

Oto jedna cecha porównywania łańcuchów, o której warto wspomnieć. Mianowicie, operatory „>” i „<” muszą być poprzedzone odwrotnym ukośnikiem, w przeciwnym razie skrypt nie będzie działał poprawnie, chociaż nie pojawią się żadne komunikaty o błędach. Skrypt interpretuje znak „>” jako polecenie przekierowania wyjścia.

Oto jak wygląda praca z tymi operatorami w kodzie:

#!/bin/bash
val1=text
val2="another text"
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fi

Oto wyniki skryptu.

Skrypty Bash: pierwsze kroki
Porównanie ciągów, rzucone ostrzeżenie

Zauważ, że skrypt, chociaż jest wykonywany, wyświetla ostrzeżenie:

./myscript: line 5: [: too many arguments

Aby pozbyć się tego ostrzeżenia, kończymy $val2 w podwójnych cudzysłowach:

#!/bin/bash
val1=text
val2="another text"
if [ $val1 > "$val2" ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fi

Teraz wszystko działa jak należy.

Skrypty Bash: pierwsze kroki
Porównanie ciągów

Inną cechą operatorów „>” i „<” jest sposób, w jaki operują one dużymi i małymi literami. Aby zrozumieć tę funkcję, przygotujmy plik tekstowy o następującej treści:

Likegeeks
likegeeks

Zapisz go pod nazwą myfilea następnie uruchom następujące polecenie w terminalu:

sort myfile

Posortuje linie z pliku w następujący sposób:

likegeeks
Likegeeks

Zespół sortdomyślnie sortuje łańcuchy w porządku rosnącym, co oznacza, że ​​w naszym przykładzie mała litera jest mniejsza niż wielka litera. Teraz przygotujmy skrypt, który porówna te same napisy:

#!/bin/bash
val1=Likegeeks
val2=likegeeks
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fi

Jeśli go uruchomisz, okaże się, że jest odwrotnie - mała litera jest teraz większa niż wielka.

Skrypty Bash: pierwsze kroki
polecenie sortowania i porównanie ciągów w pliku skryptu

W poleceniach porównywania wielkie litery są mniejsze niż małe. Porównanie ciągów odbywa się tutaj poprzez porównanie kodów znaków ASCII, więc kolejność sortowania zależy od kodów znaków.

Zespół sortz kolei korzysta z porządku sortowania określonego w ustawieniach języka systemu.

Kontrole plików

Być może poniższe polecenia są najczęściej używane w skryptach bash. Pozwalają sprawdzić różne warunki dotyczące plików. Oto lista tych poleceń.

-d fileSprawdza, czy plik istnieje i czy jest to katalog.
-e fileSprawdza, czy plik istnieje.
-f file Sprawdza, czy plik istnieje i czy jest plikiem.
-r fileSprawdza, czy plik istnieje i czy można go odczytać.
-s file ПSprawdza, czy plik istnieje i czy nie jest pusty.
-w fileSprawdza, czy plik istnieje i czy można go zapisać.
-x fileSprawdza, czy plik istnieje i czy jest wykonywalny.
file1 -nt file2 Sprawdza, czy jest nowszy file1niż file2.
file1 -ot file2Sprawdza, czy jest starszy file1niż file2.
-O file Sprawdza, czy plik istnieje i czy jest własnością bieżącego użytkownika.
-G fileSprawdza, czy plik istnieje i czy jego identyfikator grupy odpowiada identyfikatorowi grupy bieżącego użytkownika.

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

Wypróbujmy jedno z poleceń w praktyce:

#!/bin/bash
mydir=/home/likegeeks
if [ -d $mydir ]
then
echo "The $mydir directory exists"
cd $ mydir
ls
else
echo "The $mydir directory does not exist"
fi

Ten skrypt dla istniejącego katalogu wyświetli jego zawartość.

Skrypty Bash: pierwsze kroki
Wyświetlanie zawartości katalogu

Wierzymy, że z resztą poleceń możesz poeksperymentować samodzielnie, wszystkie działają na tej samej zasadzie.

Wyniki

Dzisiaj rozmawialiśmy o tym, 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 dużej serii 11 materiałów. Jeśli chcesz kontynuować teraz, oto lista oryginałów tych materiałów. Dla wygody ten, którego tłumaczenie właśnie przeczytałeś, znajduje się tutaj.

  1. Skrypt Bash krok po kroku - tutaj mówimy o tym, jak rozpocząć tworzenie skryptów bash, rozważane jest użycie zmiennych, opisane są konstrukcje warunkowe, obliczenia, porównania liczb, ciągów znaków, wyszukiwanie informacji o plikach.
  2. Bash Scripting, część 2, Bash the awesome - tutaj ujawniono funkcje pracy z pętlami for i while.
  3. Skrypty Bash, część 3, Parametry i opcje - materiał ten poświęcony jest parametrom wiersza poleceń oraz kluczom, które można przekazywać do skryptów, pracując z danymi wprowadzanymi przez użytkownika i odczytywanymi z plików.
  4. Skrypty Bash, część 4, wejście i wyjście - tutaj mówimy o deskryptorach plików i pracy z nimi, o strumieniach wejściowych, wyjściowych, błędów, wyjściowych przekierowań.
  5. Skrypty Bash, część 5, Sighals i Jobs — ten materiał jest poświęcony sygnałom Linuksa, ich przetwarzaniu w skryptach, planowanym uruchamianiu skryptów.
  6. Skrypty w Bash, część 6, Funkcje - tutaj dowiesz się o tworzeniu i używaniu funkcji w skryptach, o rozwijaniu bibliotek.
  7. Skrypty Bash, część 7, Używanie sed — ten artykuł dotyczy pracy z edytorem tekstu sed stream.
  8. Skrypty w Bash, część 8, Używanie awk — ten materiał jest poświęcony programowaniu w języku przetwarzania danych awk.
  9. Skrypty Bash, część 9, Wyrażenia regularne - tutaj możesz przeczytać o wykorzystaniu wyrażeń regularnych w skryptach bash.
  10. Skrypty Bash, część 10, praktyczne przykłady - oto metody pracy z wiadomościami, które mogą być wysyłane do użytkowników, a także metoda monitorowania dysku.
  11. Skrypty Bash, część 11, oczekuj polecenia - ten materiał jest poświęcony narzędziu Expect, za pomocą którego można zautomatyzować interakcję z interaktywnymi narzędziami. W szczególności dotyczy to skryptów oczekiwania i ich interakcji ze skryptami basha i innymi programami.

Uważamy, że jedną z największych zalet tej serii artykułów jest to, że zaczyna się od najbardziej podstawowych, odpowiednich dla użytkowników na każdym poziomie, stopniowo prowadzi do całkiem poważnych tematów, dając każdemu szansę na postęp w pisaniu skryptów wiersza poleceń Linuksa.

Drodzy Czytelnicy! Prosimy guru programowania bashowego, aby opowiedzieli o tym, jak dotarli na wyżyny mistrzostwa, podzielili się sekretami i czekamy na wrażenia od tych, którzy właśnie napisali swój pierwszy skrypt.

Skrypty Bash: pierwsze kroki

W ankiecie mogą brać udział tylko zarejestrowani użytkownicy. Zaloguj się, Proszę.

Przetłumaczyć resztę serii artykułów?

  • Tak!

  • Nie, nie ma potrzeby

Głosowało 1030 użytkowników. 106 użytkowników wstrzymało się od głosu.

Źródło: www.habr.com

Dodaj komentarz