Dziś porozmawiamy o bash-skrptach. To są , 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 Linux.
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ń.
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_MAXWiersz 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 ) 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
whoamiTutaj, 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.

Próba uruchomienia pliku skryptu z niewłaściwie ustawionymi uprawnieniami
Uczyńmy plik wykonywalnym:
chmod +x .\/myscriptTeraz spróbujemy go wykonać:
.\/myscriptPo ustawieniu uprawnień wszystko działa jak należy.

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:"
whoamiOto co się stanie po uruchomieniu zaktualizowanego skryptu.

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 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.

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.

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.

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.

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 
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
fiA 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"
fiOto co się dzieje po uruchomieniu tego skryptu.

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źć .
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.

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ślin1równa sięn2.
n1 -ge n2Zwraca wartość prawdziwą, jeślin1większe lub równen2.
n1 -gt n2Zwraca wartość prawdziwą, jeślin1większen2.
n1 -le n2Zwraca wartość prawdziwą, jeślin1mniejsze lub równen2.
n1 -lt n2Zwraca wartość prawdziwą, jeśli n1 jest mniejszen2.
n1 -ne n2Zwraca wartość prawdziwą, jeślin1nie 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"
fiOto co wyświetli ta komenda.

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 = str2Sprawdza, 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ślistr1jest mniejszy niżstr2.
str1 > str2Zwraca prawdę, jeślistr1jest większy niżstr2.
-n str1Zwraca 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"
fiW wyniku wykonania skryptu otrzymamy następujące.

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"
fiOto wyniki działania skryptu.

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"
fiTeraz wszystko działa jak należy.

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 myfileTo 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"
fiJeśli go uruchomimy, okaże się, że wszystko jest na odwrót — mała litera teraz jest większa od wielkiej.

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 plikSprawdza, 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 file2Sprawdza, czy jest nowszy niżfile1, niżfile2.
file1 -ot file2Sprawdza, czy jest starszy niżfile1, niżfile2.
-O plikSprawdza, 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"
fiTen skrypt, dla istniejącego katalogu, wyświetli jego zawartość.

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ś.
- — 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.
- — tutaj omawiane są szczegóły pracy z pętlami for i while.
- — 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.
- — 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.
- — ten materiał poświęcony jest sygnałom Linuxa, ich obróbce w skryptach, uruchamianiu scenariuszy według harmonogramu.
- — tutaj można dowiedzieć się, jak tworzyć i używać funkcji w skryptach, o opracowywaniu bibliotek.
- — ten artykuł poświęcony jest pracy z edytorem tekstowym sed.
- — ten materiał poświęcony jest programowaniu w języku obróbki danych awk.
- — tutaj można przeczytać o wykorzystaniu wyrażeń regularnych w skryptach bash.
- — tutaj przedstawiono techniki pracy z wiadomościami, które można wysyłać do użytkowników, oraz metodologię monitorowania dysku.
- — 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.
Tylko zarejestrowani użytkownicy mogą brać udział w ankiecie. , 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
