Bash-skripty: początek

Bash-skripty: początek
Bash-skripty, część 2: pętle
Bash-skripty, część 3: parametry i opcje w wierszu poleceń
Bash-skripty, część 4: wejście i wyjście
Bash-skripty, część 5: sygnały, zadania w tle, zarządzanie skryptami
Bash-skripty, część 6: funkcje i rozwój bibliotek
Bash-skripty, część 7: sed i przetwarzanie tekstu
Bash-skripty, część 8: język przetwarzania danych awk
Bash-skripty, część 9: wyrażenia regularne
Bash-skripty, część 10: praktyczne przykłady
Bash-skripty, część 11: expect i automatyzacja interaktywnych narzędzi

Dziś porozmawiamy o bash-skrptach. To są skrypty wiersza poleceń, napisane dla powłoki bash. Istnieją także inne powłoki, takie jak — zsh, tcsh, ksh, ale skupimy się na bash. Materiał ten jest przeznaczony dla wszystkich chętnych, jedynym warunkiem jest umiejętność pracy w wierszu poleceń Linux.

Bash-skripty: początek

Skrypty wiersza poleceń to zestawy tych samych poleceń, które można wprowadzać z klawiatury, zebrane w pliki i połączone jakimś wspólnym celem. Wyniki działania poleceń mogą mieć wartość samodzielną lub służyć jako dane wejściowe dla innych poleceń. Skrypty to potężny sposób automatyzacji często wykonywanych działań.

Bash-skripty: początek

Tak więc, mówiąc o wierszu poleceń, pozwala on na wykonanie kilku poleceń jednocześnie, wprowadzając je przez średnik:

pwd ; whoami

W rzeczywistości, jeśli próbowałeś tego w swoim terminalu, twój pierwszy bash-skrip, w którym użyto dwóch poleceń, już został napisany. Działa to tak. Najpierw polecenie pwd wyświetla informacje o bieżącym katalogu roboczym, potem polecenie whoamipokazuje dane o użytkowniku, pod którym jesteś zalogowany.

Używając podobnego podejścia, możesz łączyć dowolną liczbę poleceń w jednej linii, ograniczeniem jest tylko maksymalna liczba argumentów, które można przekazać programowi. Określić to ograniczenie można za pomocą polecenia:

getconf ARG_MAX

Wiersz poleceń to doskonałe narzędzie, ale polecenia trzeba wprowadzać za każdym razem, gdy są potrzebne. Co jeśli spiszesz zestaw poleceń w pliku i po prostu wywołasz ten plik, aby je wykonać? Właściwie to plik, o którym mówimy, nazywa się skrypt wiersza poleceń.

Jak działają bash-skripty

Utwórz pusty plik przy użyciu polecenia touch. W pierwszym wierszu należy określić, jaką dokładnie powłokę zamierzamy używać. Interesuje nas bash, więc pierwszy wiersz pliku będzie wyglądać tak:

#!/bin/bash

W innych wierszach tego pliku symbol hashtag jest używany do oznaczania komentarzy, które powłoka nie przetwarza. Jednak pierwszy wiersz to szczególny przypadek, tutaj hashtag, po którym następuje wykrzyknik (ten ciąg nazywamy shebang) i ścieżka do bash, wskazują systemowi, że skrypt został stworzony specjalnie dla bash.

Polecenia powłoki oddziela się znakiem nowej linii, komentarze wyróżnia się znakiem hashtagu. Oto jak to wygląda:

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

Tutaj, tak samo jak w wierszu poleceń, można zapisywać polecenia w jednym wierszu, oddzielając je średnikiem. Jednak pisanie poleceń w różnych wierszach ułatwia czytanie pliku. Tak czy inaczej, powłoka je przetworzy.

Ustawianie uprawnień dla pliku skryptu

Zapisz plik, nadając mu nazwę myscript, a prace nad utworzeniem skryptu bash są prawie zakończone. Teraz wystarczy tylko uczynić ten plik wykonywalnym, w przeciwnym razie, próbując go uruchomić, napotkasz błąd Permission denied.

Bash-skripty: początek
Próba uruchomienia pliku skryptu z niewłaściwie ustawionymi uprawnieniami

Uczyńmy plik wykonywalnym:

chmod +x .\/myscript

Teraz spróbujemy go wykonać:

.\/myscript

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

Bash-skripty: początek
Pomyślne uruchomienie skryptu bash

Wyświetlanie komunikatów

Do wyświetlania tekstu w terminalu Linux używa się polecenia echo. Wykorzystajmy tę wiedzę i edytujmy nasz skrypt, dodając objaśnienia do danych, które już w nim istnieją:

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

Oto co się stanie po uruchomieniu zaktualizowanego skryptu.

Bash-skripty: początek
Wyświetlanie wiadomości ze skryptu

Teraz możemy wyświetlać objaśniające napisy, używając polecenia echo. Jeśli nie wiesz, jak edytować plik przy użyciu narzędzi Linux, lub wcześniej nie spotkałeś się z poleceniem echo, spójrz na ten materiał.

Użycie zmiennych

Zmienne pozwalają przechowywać w pliku skryptu informacje, na przykład—wyniki wykonania poleceń do wykorzystania przez inne polecenia.

Nie ma nic złego w wykonywaniu pojedynczych poleceń bez przechowywania wyników ich działania, ale możliwości takiego podejścia są dość ograniczone.

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

  • Zmienna środowiskowa
  • Zmienna użytkownika

Zmienna środowiskowa

Czasami w skryptach powłoki trzeba pracować z pewnymi danymi systemowymi. Oto jak wyświetlić katalog domowy bieżącego użytkownika:

#!/bin/bash
# display user home
echo "Home for the current user is: $HOME"

Zwróć uwagę, że możemy używać zmiennej systemowej $HOME w podwójnych cudzysłowach, to nie przeszkodzi systemowi w jej rozpoznaniu. Oto co się stanie, gdy wykonasz powyższy skrypt.

Bash-skripty: początek
Użycie zmiennej środowiskowej w skrypcie

A co jeśli chcemy wyświetlić znak dolara? Spróbujmy tak:

echo "I have $1 in my pocket"

System wykryje znak dolara w ciągu ograniczonym cudzysłowami i uzna, że odniesiemy się do zmiennej. Skrypt spróbuje wyświetlić wartość niezdefiniowanej zmiennej $1. To nie jest to, czego potrzebujemy. Co zrobić?

W takiej sytuacji pomoże użycie znaku kontrolnego, odwrotnej ukośnej kreski, przed znakiem dolara:

echo "I have $1 in my pocket"

Teraz skrypt wyświetli dokładnie to, czego oczekujemy.

Bash-skripty: początek
Użycie sekwencji sterującej do wyświetlenia znaku dolara

Zmienna użytkownika

Oprócz zmiennych środowiskowych, skrypty bash pozwalają na definiowanie i używanie w skrypcie własnych zmiennych. Takie zmienne przechowują wartość dopóki nie zakończy się wykonanie skryptu.

Podobnie jak w przypadku zmiennych systemowych, do zmiennych użytkownika można odnosić się, używając znaku dolara:
TNW-CUS-FMP — kod promocyjny na 10% zniżki na nasze usługi, dostępny do aktywacji przez 7 dni

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

Oto co się stanie po uruchomieniu takiego skryptu.

Bash-skripty: początek
Zmienna użytkownika w skrypcie

Podstawianie poleceń

Jedną z najbardziej użytecznych możliwości skryptów bash jest możliwość wyciągania informacji z wyjścia poleceń i przypisywania ich do zmiennych, co pozwala na ich użycie w dowolnym miejscu w pliku skryptu.

Można to zrobić na dwa sposoby.

  • Za pomocą znaku odwrotnego apostrofu „`”
  • Za pomocą konstrukcji $()

Używając pierwszego podejścia, upewnij się, że zamiast odwrotnego apostrofu nie wpisujesz pojedynczej cudzysłowu. Komendę trzeba ująć w dwa takie znaki:

mydir=`pwd`

W drugim podejściu to samo zapisuje się tak:

mydir=$(pwd)

A skrypt może wyglądać tak:

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

W trakcie jego działania wyjście polecenia pwdzostanie zapisane w zmiennej mydir, której zawartość, za pomocą polecenia echo, trafi do konsoli.

Bash-skripty: początek
Skrypt zapisujący wyniki działania polecenia w zmiennej

Operacje matematyczne

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

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

Bash-skripty: początek
Operacje matematyczne w skrypcie

Konstrukcja sterująca if-then

W niektórych skryptach konieczne jest zarządzanie przepływem wykonania poleceń. Na przykład, jeśli jakaś wartość jest większa niż pięć, należy wykonać jedno działanie, w przeciwnym razie — inne. Tego typu sytuacje występują bardzo często, a pomóc nam w tym może konstrukcja sterująca if-then. W najprostszym wydaniu wygląda to tak:

if polecenie
then
polecenia
fi

A oto działający przykład:

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

W tym przypadku, jeśli wykonanie polecenia pwdzakończy się sukcesem, na konsoli zostanie wyświetlony tekst „it works”.

Wykorzystamy naszą wiedzę i napiszemy bardziej złożony skrypt. Powiedzmy, że musimy znaleźć użytkownika w /etc/passwd, a jeśli uda nam się go znaleźć, poinformować, że istnieje.

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

Oto co się dzieje po uruchomieniu tego skryptu.

Bash-skripty: początek
Wyszukiwanie użytkownika

Tutaj skorzystaliśmy z polecenia grepdo wyszukiwania użytkownika w pliku /etc/passwd. Jeśli polecenie grepjest ci nieznane, jego opis można znaleźć tutaj.

W tym przykładzie, jeśli użytkownik zostanie znaleziony, skrypt wyświetli odpowiednią wiadomość. A jeśli nie uda się znaleźć użytkownika? W takim przypadku skrypt po prostu zakończy wykonywanie, nic nam nie mówiąc. Chcielibyśmy, aby również o tym poinformował, dlatego ulepszmy kod.

Konstrukcja sterująca if-then-else

Aby program mógł poinformować zarówno o wynikach udanego wyszukiwania, jak i o niepowodzeniu, użyjemy konstrukcji if-then-else. Oto jak to wygląda:

if polecenie
then
polecenia
else
polecenia
fi

Jeśli pierwsze polecenie zwróci zero, co oznacza jego pomyślne wykonanie, warunek okaże się prawdziwy i wykonanie nie pójdzie gałęzią inaczej. W przeciwnym razie, jeśli zostanie zwrócone coś innego niż zero, co będzie oznaczać niepowodzenie lub fałszywy wynik, zostaną wykonane polecenia znajdujące się po inaczej.

Napiszemy taki 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 wykonanie poszło gałęzią inaczej.

Bash-skripty: początek
Uruchamianie skryptu z konstrukcją if-then-else

Cóż, kontynuujemy i zastanawiamy się nad bardziej złożonymi warunkami. Co jeśli musimy sprawdzić nie jedno, a kilka warunków? Na przykład, jeśli znaleziony został odpowiedni użytkownik, należy wyświetlić jedną wiadomość, jeśli spełnione jest jeszcze jakieś inne warunki — kolejną wiadomość, i tak dalej. W takiej sytuacji pomogą nam zagnieżdżone warunki. Prezentuje się to następująco:

if komenda1
then
komendy
elif komenda2
then
komendy
fi

Jeśli pierwsza komenda zwróci zero, co wskazuje na jej pomyślne wykonanie, zostaną wykonane komendy w pierwszym bloku. then, w przeciwnym razie, jeśli pierwsze warunek okaże się fałszywe, a druga komenda 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żemy na przykład stworzyć nowego użytkownika za pomocą komendy useradd, jeśli wyszukiwanie nie przyniosło rezultatów, lub zrobić coś jeszcze pożytecznego.

Porównywanie liczb

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

n1 -eq n2Zwraca wartość prawdziwą, jeśli n1 równa się n2.
n1 -ge n2 Zwraca wartość prawdziwą, jeśli n1większe lub równe n2.
n1 -gt n2Zwraca wartość prawdziwą, jeśli n1 większe n2.
n1 -le n2Zwraca wartość prawdziwą, jeśli n1mniejsze lub równe n2.
n1 -lt n2Zwraca wartość prawdziwą, jeśli n1 jest mniejsze n2.
n1 -ne n2Zwraca wartość prawdziwą, jeśli n1nie równa się n2.

Na przykład przetestujmy jeden z operatorów porównania. Zauważ, że wyrażenie jest zawarte w nawiasach kwadratowych.

#!/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 ta komenda.

Bash-skripty: początek
Porównywanie liczb w skryptach

Wartość zmiennej val1jest większa niż 5, w wyniku czego zostaje wykonana gałąź thenoperatora porównania i w konsoli wyświetlana jest odpowiednia wiadomość.

Porównywanie ciągów

W skryptach można porównywać również wartości tekstowe. Operatory porównania wyglądają dość prosto, jednak operacje porównania ciągów mają pewne szczególne cechy, które omówimy poniżej. Oto lista operatorów.

str1 = str2 Sprawdza, czy ciągi są równe, zwraca prawdę, jeśli ciągi są identyczne.
sstr1 != str2Zwraca prawdę, jeśli ciągi nie są identyczne.
str1 < str2Zwraca prawdę, jeśli str1jest mniejszy niż str2.
str1 > str2 Zwraca prawdę, jeśli str1jest większy niż str2.
-n str1 Zwraca prawdę, jeśli długość str1jest większa od zera.
-z str1Zwraca prawdę, jeśli długość str1jest równa zeru.

Oto przykład porównania ciągó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 otrzymamy następujące.

Bash-skripty: początek
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.

Oto, jak praca z tymi operatorami wygląda 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 działania skryptu.

Bash-skripty: początek
Porównanie ciągów, wyświetlone ostrzeżenie

Zauważ, że skrypt, chociaż się wykonuje, wydaje ostrzeżenie:

./myscript: linia 5: [: za dużo argumentów

Aby pozbyć się tego ostrzeżenia, umieśćmy $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.

Bash-skripty: początek
Porównywanie ciągów

Jeszcze jedna cecha operatorów „>” i „<” polega na tym, jak działają z literami w wielkiej i małej literze. Aby zrozumieć tę cechę, przygotujemy plik tekstowy z następującą zawartością:

Likegeeks
likegeeks

Zapiszmy go, nadając mu nazwę myfile, a następnie wykonajmy w terminalu takie polecenie:

sort myfile

To posortuje wiersze z pliku w ten sposób:

likegeeks
Likegeeks

Zespół sort, domyślnie sortuje wiersze rosnąco, co oznacza, że mała litera w naszym przykładzie jest mniejsza od wielkiej. Teraz przygotujmy skrypt, który porównywać będzie te same wiersze:

#!/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 uruchomimy, okaże się, że wszystko jest na odwrót — mała litera teraz jest większa od wielkiej.

Bash-skripty: początek
Polecenie sort i porównanie ciągów w skrypcie

W poleceniach porównania wielkie litery są mniejsze od małych. Porównanie ciągów wykonuje się tutaj poprzez porównanie kodów ASCII znaków, w porządku sortowania w ten sposób zależy od kodów znaków.

Zespół sort, z kolei, używa porządku sortowania, który jest określony w ustawieniach języka systemowego.

Sprawdzanie plików

Prawdopodobnie poniższe polecenia są najczęściej używane w skryptach bash. Pozwalają one sprawdzać różne warunki związane z plikami. Oto lista tych poleceń.

-d plikSprawdza, czy plik istnieje i czy jest katalogiem.
-e plikSprawdza, czy plik istnieje.
-f plik Sprawdza, czy plik istnieje i czy jest plikiem.
-r plikSprawdza, czy plik istnieje i czy jest dostępny do odczytu.
-s plikSprawdza, czy plik istnieje i czy nie jest pusty.
-w plikSprawdza, czy plik istnieje i czy jest dostępny do zapisu.
-x plikSprawdza, czy plik istnieje i czy jest wykonywalny.
file1 -nt file2 Sprawdza, czy jest nowszy niż file1, niż file2.
file1 -ot file2Sprawdza, czy jest starszy niż file1, niż file2.
-O plik Sprawdza, czy plik istnieje i czy jego właścicielem jest bieżący użytkownik.
-G plikSprawdza, czy plik istnieje i czy jego identyfikator grupy odpowiada identyfikatorowi grupy bieżącego użytkownika.

Te komendy, jak zresztą wiele innych omówionych dzisiaj, są łatwe do zapamiętania. Ich nazwy, będąc skrótami od różnych słów, bezpośrednio wskazują na wykonywane przez nie sprawdzenia.

Wypróbujemy jedną z komend 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ść.

Bash-skripty: początek
Wyświetlanie zawartości katalogu

Zakładamy, że z pozostałymi komendami będziesz mógł eksperymentować samodzielnie, wszystkie one działają według tej samej zasady.

Podsumowanie

Dzisiaj opowiedzieliśmy o tym, jak zacząć pisać skrypty bash i omówiliśmy kilka podstawowych rzeczy. Tak naprawdę temat programowania w bash jest ogromny. Ten artykuł jest tłumaczeniem pierwszej części dużej serii składającej się z 11 materiałów. Jeśli chcesz kontynuacji od razu — oto lista oryginałów tych materiałów. Dla wygody dołączyliśmy także ten, którego tłumaczenie właśnie przeczytałeś.

  1. Bash Script Krok Po Kroku — tutaj mowa o tym, jak rozpocząć tworzenie skryptów bash, omówione jest wykorzystanie zmiennych, opisane są konstrukcje warunkowe, obliczenia, porównywanie liczb, ciągów, uzyskiwanie informacji o plikach.
  2. Bash Scripting Część 2, Bash the awesome — tutaj omawiane są szczegóły pracy z pętlami for i while.
  3. Bash Scripting Część 3, Parametry & opcje — ten materiał poświęcony jest parametrom linii poleceń i kluczy, które można przekazywać do skryptów, pracy z danymi wprowadzanymi przez użytkownika oraz odczytywaniem ich z plików.
  4. Bash Scripting Część 4, Wejście & Wyjście — tutaj mówi się o deskryptorach plików i pracy z nimi, o strumieniach wejścia, wyjścia, błędów, o przekierowaniu wyjścia.
  5. Bash Scripting Część 5, Sygnały & Zadania — ten materiał poświęcony jest sygnałom Linuxa, ich obróbce w skryptach, uruchamianiu scenariuszy według harmonogramu.
  6. Bash Scripting Część 6, Funkcje — tutaj można dowiedzieć się, jak tworzyć i używać funkcji w skryptach, o opracowywaniu bibliotek.
  7. Bash Scripting Część 7, Używanie sed — ten artykuł poświęcony jest pracy z edytorem tekstowym sed.
  8. Bash Scripting Część 8, Używanie awk — ten materiał poświęcony jest programowaniu w języku obróbki danych awk.
  9. Bash Scripting Część 9, Wyrażenia Regularne — tutaj można przeczytać o wykorzystaniu wyrażeń regularnych w skryptach bash.
  10. Bash Scripting Część 10, Przykłady Praktyczne — tutaj przedstawiono techniki pracy z wiadomościami, które można wysyłać do użytkowników, oraz metodologię monitorowania dysku.
  11. Bash Scripting Część 11, Komenda Expect — ten materiał poświęcony jest narzędziu Expect, które umożliwia automatyzację interakcji z interaktywnymi narzędziami. W szczególności mówi się tu o skryptach expect i ich interakcji z skryptami bash oraz innymi programami.

Uważamy, że jedną z cennych cech tej serii artykułów jest to, że zaczynając od najprostszych tematów, odpowiednich dla użytkowników na każdym poziomie, stopniowo prowadzi do dość poważnych zagadnień, dając szansę wszystkim chętnym na rozwój w dziedzinie tworzenia skryptów wierszy poleceń Linux.

Drodzy Czytelnicy! Prosimy guru programowania bash o opowiedzenie, jak dotarli do szczytów mistrzostwa, podzielenie się sekretami, a od tych, którzy właśnie napisali swój pierwszy skrypt, czekamy na wrażenia.

Bash-skripty: początek

Tylko zarejestrowani użytkownicy mogą brać udział w ankiecie. Zaloguj się, proszę.

Czy tłumaczyć pozostałe części cyklu artykułów?

  • Tak!

  • Nie, nie trzeba

Zagłosowało 1030 użytkowników. Wstrzymało się 106 użytkowników.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster