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 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.
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.
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.
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.
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.
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.
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.
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.
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)):
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.
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.
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.
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.
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.
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.
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.
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ść.
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.
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.
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.
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ń.
Skrypty Bash, część 5, Sighals i Jobs — ten materiał jest poświęcony sygnałom Linuksa, ich przetwarzaniu w skryptach, planowanym uruchamianiu skryptów.
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.
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.