Ten poradnik omawia jak możesz łatwo pisać własne skrypty Bash w systemie Linux.
Jako administrator systemu, jest całkiem prawdopodobne, że wykonujesz powtarzające się zadania, które mogłyby być zautomatyzowane.
Na szczęście dla ciebie, istnieje język programowania, który może być używany w systemie Linux w celu pisania skryptów: język programowania Bash.
Używając Bash, możesz zaplanować tworzenie kopii zapasowych całego systemu, określając tyle poleceń, ile chcesz w skryptach Bash.
Możesz również mieć niestandardowe skrypty, które tworzą i usuwają użytkowników oraz usuwają powiązane z nimi pliki.
Dzięki Bashowi, możesz mieć również skrypty działające i zrzucające użyteczne metryki wydajności do pliku lub bazy danych.
Bash jest bardzo potężnym językiem programowania dla administratorów systemu.
W dzisiejszym tutorialu, nauczymy się wszystkich podstaw, które trzeba znać o Bashu: jak tworzyć i uruchamiać skrypty, jak efektywnie używać zmiennych i wbudowanych elementów powłoki.
Spis treści
- Czego się nauczysz
- Początkowanie pracy z Bash
- Historia Bash
- Język programowania Bash
- Tworzenie i uruchamianie skryptów Bash
- Określanie powłoki przy użyciu shebang
- Wykonywanie skryptów Bash
- Określenie interpretera powłoki
- Określanie ścieżki do skryptu
- Dodawanie skryptu do PATH
- Wbudowane skrypty powłoki wyjaśnione
- Używanie zmiennych Bash
- Wykonywanie poleceń wewnątrz skryptów
- Zrozumienie statusów wyjścia
- Manipulowanie warunkami w Bashu
- Praktyczny przypadek : sprawdzanie czy użytkownik jest rootem
- Zakończenie
Czego się nauczysz
Jeśli przeczytasz ten samouczek do końca, dowiesz się o następujących pojęciach dotyczących Basha
- Jak tworzyć i uruchamiać skrypty Basha używając wiersza poleceń;
- Czym jest shebang i jak jest używany przez Linuksa do pisania skryptów;
- Czym są wbudowane programy powłoki i jak różnią się od zwykłych programów systemowych;
- Jak używać zmiennych Bash i czym są zmienne specjalne;
- Jak używać podstawiania poleceń Bash;
- Jak używać prostych instrukcji IF w Bash;
Jak widać, jest to dość długi program, więc bez dalszych ceregieli, zacznijmy od zobaczenia, jak można tworzyć i uruchamiać skrypty Bash.
Początkowanie pracy z Bash
Przed wydaniem jakichkolwiek poleceń, powiedzmy sobie kilka słów na temat wspólnej historii Bash i powłoki.
Historia Bash
Pierwsza wersja powłoki Bash została wydana w 1989 roku przez Briana Foxa i jest to implementacja powłoki uniksowej o otwartym kodzie źródłowym.
W tamtych czasach, gdy zaczęły powstawać systemy uniksowe, systemy te używały standardowych powłok uniksowych o nazwie powłoki Bourne’a.
W początkach Uniksa, systemy opracowane przez firmy takie jak MIT czy Bell Labs nie były wolne i nie były open-source.
Nawet jeśli dostarczano dokumentację do tych narzędzi, priorytetem dla inicjatywy GNU (kierowanej przez Richarda Stallmana) stało się posiadanie własnej wersji powłoki uniksowej.
Sześć lat po ogłoszeniu projektu GNU narodziła się powłoka Bash (Bourne-Again Shell) z jeszcze większą liczbą funkcji niż oryginalna powłoka Bourne’a.
Język programowania Bash
Podczas pracy z systemem uniksopodobnym, takim jak Linux, Bash ma zwykle dwa znaczenia:
- Bash jest interpreterem wiersza poleceń lub innymi słowy powłoką uniksową. Oznacza to, że kiedykolwiek otwierasz terminal, będziesz miał do czynienia z powłoką uniksową, która w większości przypadków jest powłoką Bash.
Podczas wpisywania poleceń bezpośrednio w terminalu, polecenia są interpretowane przez powłokę, wykonywane przy użyciu wywołań systemowych, a wartości zwracane są z powrotem do użytkownika końcowego.
Jeśli nie masz pewności co do aktualnie używanego interpretera, zmienna środowiskowa SHELL wskazuje, z której powłoki aktualnie korzystasz.
$ printenv SHELL
Jak widać, w tym przypadku poprawnie używamy interpretera poleceń Bash do pracy.
Ważne jest, aby zauważyć, że nawet jeśli terminy takie jak „Bash scripting” i „Shell scripting” są używane zamiennie, mogą one w rzeczywistości nie opisywać tej samej rzeczy w zależności od dystrybucji.
Niektóre ostatnie dystrybucje (takie jak Debian 10) mają dowiązania symboliczne z oryginalnej powłoki Bourne’a (nazwanej sh) do ich własnych implementacji powłoki (w tym przypadku Dash lub powłoka Debiana Almquist)
- Bash również opisuje język wiersza poleceń i jest również określany jako język Bash. Bash udostępnia zestaw operatorów i operandów, które mogą być użyte w celu uzyskania pewnych podstawowych funkcji, takich jak potokowanie lub wykonywanie wielu poleceń jednocześnie.
Przy wykonywaniu niektórych podstawowych operacji, jesteś przyzwyczajony do pracy z symbolem „|”. Ten symbol jest częścią języka wiersza poleceń Bash.
Ta sama logika dotyczy symbolu „&&”, który wykonuje drugie polecenie, jeśli, i tylko jeśli, pierwsze polecenie się powiodło.
$ command1 && command2
Tworzenie i uruchamianie skryptów Bash
Teraz, gdy masz już pewne podstawy na temat powłoki Bash i języka wiersza poleceń Bash, zacznijmy od tworzenia i uruchamiania prostych skryptów Bash.
Aby utworzyć swój pierwszy skrypt Bash, po prostu utwórz plik o nazwie „script.sh”.
Jak zapewne już zauważyłeś, nadal używamy rozszerzenia „sh” odnoszącego się do oryginalnej powłoki Bourne’a (oznaczanej również jako sh).
$ touch script.sh
Teraz stworzenie pliku kończącego się rozszerzeniem „sh” nie wystarczy, by twój skrypt został uznany za skrypt powłoki.
Właściwie możesz zobaczyć, że twój plik nie jest jeszcze uznany za skrypt powłoki przez uruchomienie polecenia file.
$ file script.sh
Jak widzisz tutaj, twój plik jest tylko opisany jako zwykły pusty plik.
Aby twój plik był opisany jako plik skryptu powłoki, musisz określić linię shebang na początku swojego pliku.
Określanie powłoki przy użyciu shebang
Jeśli używasz Linuksa od dłuższego czasu, jest bardzo prawdopodobne, że już spotkałeś się z linią shebang na początku swojego pliku.
Shebang, skrót od „Hash + „Bang”, to jedno zdanie umieszczane na początku skryptów powłoki w celu określenia, która powłoka ma być użyta do interpretacji tego skryptu.
#!/bin/<shell>
W naszym przypadku chcemy pracować ze skryptami Bash. Innymi słowy, chcemy, aby nasze skrypty były interpretowane przez interpreter Bash.
Aby określić ścieżkę do interpretera, możesz użyć polecenia „which”.
$ which bash/bin/bash
Gdy już znasz ścieżkę do interpretera, edytuj swój plik skryptu i dodaj linię shebang na początku pliku.
#!/bin/bash
Teraz, gdy dodałeś tę linię na początku pliku, wykonaj ponownie polecenie „file”, aby zobaczyć różnicę.
Jak widzisz, wyjście jest nieco inne: tym razem, twój skrypt jest widziany jako „skrypt powłoki Bourne-Again”, a co ważniejsze, jako plik wykonywalny.
Co by się stało, gdybyś nie podał linii shebang na górze skryptu.
Gdy nie podasz linii shebang, skrypt jest uruchamiany przy użyciu bieżącej powłoki użytej do uruchomienia polecenia execute.
Teraz, gdy już wiesz, jak tworzyć skrypty Bash, zobaczmy, jak możesz je wykonywać.
Wykonywanie skryptów Bash
Aby wykonać skrypty Bash w systemie Linux, zasadniczo masz dwie opcje :
- Poprzez określenie interpretera powłoki, którego chcesz użyć i pliku skryptu;
- Poprzez użycie ścieżki do pliku skryptu
Określenie interpretera powłoki
Pierwsza metoda jest całkiem prosta.
Aby wykonać skrypt bash, musisz określić interpreter, którego chcesz użyć.
$ bash <script>$ /bin/bash <script>
Korzystając z przykładu, którego użyliśmy wcześniej, dałoby nam to następujące wyjście.
Jak widać, ta metoda nie wymaga nawet uprawnień execute na pliku, musisz tylko być w stanie użyć pliku wykonywalnego bash.
Jak widzisz, kiedy zalogowany jako inny użytkownik, bez uprawnień execute, wciąż jestem w stanie wykonać ten skrypt.
Jest to ważna uwaga, ponieważ możesz chcieć przechowywać pliki skryptów w chronionych katalogach (do których tylko ty masz dostęp), aby uniemożliwić innym użytkownikom wykonywanie twoich plików.
Określanie ścieżki do skryptu
Innym sposobem wykonywania skryptów basha jest określenie ścieżki do pliku.
Aby użyć tej metody, plik musi mieć uprawnienia execute.
Najpierw użyj polecenia „chmod”, aby ustawić uprawnienia execute dla bieżącego użytkownika.
$ chmod u+x <script>
Jak widzisz, kolor pliku jest całkiem inny: twój obecny terminal podświetla pliki wykonywalne używając specyficznych kolorów, w tym przypadku koloru zielonego.
Teraz, gdy twój skrypt jest wykonywalny, możesz go wykonać przez podanie względnej lub bezwzględnej ścieżki do skryptu.
Używając pliku o nazwie „script.sh” znajdującego się w moim bieżącym katalogu roboczym, skrypt można wykonać, uruchamiając
$ ./script.sh
Jeśli znajdujesz się w innym katalogu, będziesz musiał określić bezwzględną ścieżkę do pliku skryptu.
$ /home/user/script.sh
Jak już pewnie zdałeś sobie sprawę, ta metoda nie jest zbyt wygodna, jeśli musisz podawać ścieżkę do skryptu za każdym razem.
Na szczęście dla ciebie istnieje sposób na wykonanie skryptu przez proste wpisanie nazwy pliku w wierszu poleceń.
Dodawanie skryptu do PATH
Rozszerzenie „.sh” nie jest potrzebne, aby skrypt był uważany za plik skryptu.
Dla uproszczenia, zmienimy nazwę istniejącego pliku „script.sh” na „script”.
Aby zmienić nazwę plików w systemie Linux, po prostu użyj polecenia „mv” i podaj źródło i miejsce docelowe.
$ mv script.sh script
A teraz, co jeśli chciałbyś wykonać swój skrypt, wpisując „script”?
Aby to zrobić, musisz dodać ścieżkę do skryptu do swojej zmiennej środowiskowej PATH.
Aby wydrukować bieżącą wartość zmiennej środowiskowej PATH, użyj polecenia „printenv” z argumentem „PATH”.
$ printenv PATH
Aby zaktualizować PATH w twoim bieżącym środowisku pracy, edytuj zmienną środowiskową PATH, używając następującej składni.
$ export PATH="<path_to_script>:$PATH"
Teraz polecenie „script”, które właśnie zdefiniowałeś, będzie bezpośrednio dostępne bez określania ścieżek: możesz je uruchomić jak każde inne polecenie.
Uwaga: jeśli chcesz uczynić swoje zmiany trwałymi, wykonaj te kroki, by poprawnie zaktualizować zmienną PATH.
Wbudowane skrypty powłoki wyjaśnione
Przed zadeklarowaniem jakichkolwiek zmiennych w skrypcie powłoki, ważne jest, byś wiedział o wbudowanych skrypcie powłoki.
Kiedy pracujesz z powłoką Bash, przez większość czasu wykonujesz „programy”.
Przykładami programów są „ls”, „fdisk” lub „mkdir”. Pomoc dla tych poleceń można znaleźć używając polecenia „man”, skrótu od „manual”.
Czy jednak kiedykolwiek próbowałeś przeczytać dokumentację dla polecenia „source”?
Nie byłbyś w stanie przeczytać dokumentacji używając „man”, ponieważ polecenie source jest wbudowaną funkcją powłoki.
Aby przeczytać dokumentację wbudowanych funkcji powłoki, musisz użyć polecenia „help”.
$ help <command>
Lista poleceń wbudowanych w powłokę jest dość obszerna, ale tutaj jest zrzut ekranu każdego polecenia wbudowanego w bash, które można znaleźć na systemach Ubuntu.
Używanie zmiennych Bash
Teraz, gdy wiesz o wbudowanych poleceniach Bash, nadszedł czas, aby zacząć pisać własne skrypty Bash.
Przypominamy, że polecenia wpisane w terminalu mogą być użyte w skrypcie Bash w dokładnie taki sam sposób.
Na przykład, jeśli chcesz skrypt, który po prostu wykona polecenie „ls -l”, po prostu edytuj swój skrypt, dodaj linię shebang i polecenie.
#!/bin/bash# This simple script executes the ls commandls -l
A teraz, co jeśli chciałbyś mieć zmienne Bash?
Zmienne Bash są prostymi zmiennymi programu, które mogą przechowywać wiele różnych danych wejściowych.
Aby zadeklarować zmienną Bash, po prostu podaj nazwę zmiennej i jej wartość oddzielone znakiem równości.
VAR=value
Aby móc użyć zawartości zmiennej Bash w swoim skrypcie, użyj „$” i dołącz nazwę swojej zmiennej.
echo $VAR
Nawet jeśli możesz użyć tej składni, aby mieć wartość zmiennej, możesz również użyć notacji „nawiasów”.
echo ${VAR}
Używając tej składni, zmienne mogą być łączone razem.
Jeśli masz na przykład dwie zmienne Bash o nazwach VAR1 i VAR2, możesz wypisać je obie przy użyciu następującej składni
echo "${VAR1}${VAR2}"
Wykonywanie poleceń wewnątrz skryptów
Aby wykonać polecenia wewnątrz skryptów Bash, musisz użyć podstawiania poleceń.
Zastępowanie poleceń jest techniką używaną w powłoce Bash w celu przechowywania wyniku polecenia w zmiennej.
Aby zastąpić polecenie w Bashu, użyj znaku dolara i otocz swoje polecenie nawiasami.
VAR=$(command)
Na przykład, aby uzyskać wynik liczby plików w bieżącym katalogu, napisałbyś
#!/bin/bashNUMBER=$(ls -l | wc -l)echo "${NUMBER} files in this directory!"
Jak widzisz, podstawianie poleceń jest całkiem przydatne, ponieważ może być użyte do dynamicznego wykonywania poleceń w skrypcie powłoki i zwracania wartości użytkownikowi.
Mówiąc o zwracaniu wyników do użytkownika końcowego, jak radzisz sobie ze skryptami, które nie zostały poprawnie zakończone?
Co zrobić, jeśli polecenie wewnątrz skryptu nie wykonało się poprawnie?
Zrozumienie statusów wyjścia
Gdy wykonujesz skrypt, nawet jeśli nie zwracasz wartości, skrypt zawsze zwraca coś, co nazywamy „stanem wyjścia”.
Stan wyjścia w skryptach Bash wskazuje, czy wykonanie skryptu zakończyło się powodzeniem, czy nie.
Jeśli kod stanu wynosi zero, wykonanie skryptu zakończyło się powodzeniem. Jeśli jednak wartość jest różna od zera (powiedzmy jeden, dwa lub więcej), oznacza to, że wykonanie skryptu nie powiodło się.
Aby zademonstrować status wyjścia, uruchom dowolne prawidłowe polecenie w powłoce bash.
echo "This is a simple working command"
Teraz użyj tego polecenia, aby sprawdzić stan wyjścia ostatniego uruchomionego polecenia.
echo ${?}
Jak widać, wyjściem tego polecenia jest „0” lub stan wyjścia ostatniego wykonanego przeze mnie polecenia.
Tej składni („${?}”) można użyć w skryptach, aby upewnić się, że polecenia zostały wykonane poprawnie.
Status wyjścia może być użyty w skryptach, aby zakończyć działanie skryptu z określonym kodem stanu.
Na przykład, jeśli chcesz wyjść ze skryptem z błędem, możesz użyć następującego polecenia w swoim skrypcie.
exit 1
Podobnie, możesz użyć kodu wyjścia „zero”, aby określić, że skrypt został wykonany pomyślnie.
exit 0
Aby sprawdzić, czy kod statusu był poprawny, będziesz potrzebował podstawowych instrukcji warunkowych, takich jak instrukcja IF.
Manipulowanie warunkami w Bashu
Czasami, wykonywanie skryptów basha nie polega tylko na posiadaniu wielu poleceń obok siebie: chcesz mieć akcje warunkowe.
W niektórych przypadkach, może być przydatne posiadanie warunku sprawdzającego, czy bieżący użytkownik jest użytkownikiem root (lub tylko określonym użytkownikiem w systemie).
Jednym z prostych sposobów na posiadanie warunków w Bashu jest użycie instrukcji if.
„If” jest wbudowane w powłokę, w konsekwencji instrukcja jest dostępna za pośrednictwem polecenia „help”
$ help if
Strona pomocy opisuje składnię polecenia if za pomocą średników, ale będziemy używać tej składni (która jest równoważna)
if ]then <commands>else <command>fi
Praktyczny przypadek : sprawdzanie czy użytkownik jest rootem
Aby pokazać do czego może służyć instrukcja if, napiszemy prosty skrypt sprawdzający czy użytkownik jest rootem czy nie.
Dla przypomnienia, użytkownik root zawsze ma UID ustawiony na zero w każdym systemie Unix.
Znając tę informację, sprawdzimy czy UID jest ustawiony na zero, jeśli tak, wykonamy resztę skryptu, w przeciwnym razie wyjdziemy ze skryptu.
Jak wyjaśniono w innych tutorialach (o administracji użytkownikami), możesz uzyskać bieżący identyfikator użytkownika używając polecenia „id”.
$ id -u1000
Użyjemy tego polecenia aby sprawdzić czy użytkownik wykonujący skrypt jest rootem czy nie.
Utwórz nowy skrypt i dodaj do niego linię shebang.
#!/bin/bash
Tuż pod nią dodaj polecenie „id” i zapisz wynik w zmiennej o nazwie „USERID” używając podstawiania poleceń.
USERID=$(id -u)
Teraz, gdy „USERID” zawiera bieżący identyfikator użytkownika, użyj instrukcji IF, aby sprawdzić, czy identyfikator użytkownika wynosi zero, czy nie.
Jeśli tak jest, napisz prosty komunikat informacyjny, jeśli nie, zakończ skrypt ze statusem wyjścia 1.
if ]then echo "This is root"else exit 1fi
Teraz, jeśli wykonasz skrypt jako bieżący użytkownik, skrypt po prostu zakończy działanie ze statusem wyjścia równym jeden.
Teraz spróbuj wykonać skrypt jako użytkownik root (za pomocą polecenia sudo)
Jak widać, Twój komunikat informacyjny został wyświetlony, a skrypt zakończył działanie z kodem błędu równym zero.
Zakończenie
W tym poradniku, nauczyłeś się o języku programowania Bash i jak może on być używany do tworzenia skryptów Bash w twoim systemie.
Dowiedziałeś się również o statusach wyjścia i instrukcjach warunkowych, które są kluczowe w celu posiadania niestandardowej logiki ustawionej w twoich skryptach.
Teraz, gdy masz więcej wiedzy na temat Bash, powinieneś zacząć pisać własne skrypty dla swoich potrzeb: możesz zacząć od samouczka na temat tworzenia archiwalnych plików kopii zapasowych na przykład.
Jeśli jesteś zainteresowany administracją systemu Linux, mamy kompletną sekcję poświęconą temu na stronie internetowej, więc upewnij się, że ją sprawdzisz!
.