Specjalne zmienne bash z przykładami

Specjalne zmienne bash z przykładami

Bash to świetny język kodowania, który pozwala robić złożone rzeczy, takie jak manipulacje dużych zbiorów danych lub po prostu tworzyć skrypty zarządzania sekundami lub pulpitem.

Umiejętność poziomu podstawowego wymagana do użycia języka Bash jest dość niska, a scenariusze jedno-liniowe (często używany żargon, który wskazuje wiele poleceń wykonanych w wierszu poleceń, tworzących mini-skrypt), a także zwykłe skrypty mogą rosnąć w złożoności (i jak dobrze są napisane), ponieważ deweloper bash dowiaduje się więcej.

Nauka korzystania ze specjalnych zmiennych w Bash jest częścią tej krzywej uczenia się. Podczas gdy pierwotnie specjalne zmienne mogą wyglądać tajemnicze: $$, $?, $*, \ 0 $, 1 $ itp., Gdy je zrozumiesz i użyjesz ich we własnych skryptach, wkrótce stanie się jasniejsze i łatwiejsze do zapamiętania.

W tym samouczku się nauczysz:

  • Jak używać specjalnych zmiennych w Bash
  • Jak poprawnie cytować zmienne, nawet specjalne
  • Przykłady wykorzystujące specjalne zmienne z wiersza poleceń i skryptów

Specjalne zmienne bash z przykładami

Zastosowane wymagania i konwencje oprogramowania

Wymagania oprogramowania i konwencje linii poleceń Linux
Kategoria Wymagania, konwencje lub wersja oprogramowania
System Niezależny od rozkładu Linuksa
Oprogramowanie Wiersz poleceń Bash, system oparty na Linuksie
Inny Wszelkie narzędzie, które nie jest zawarte w skorupce Bash domyślnie można zainstalować za pomocą za pomocą sudo apt-get instal instal narzędzie (Lub Mnij instalacja dla systemów opartych na Redhat)
Konwencje # - Wymaga wykonywania Linux -Commands z uprawnieniami root bezpośrednio jako użytkownik root lub za pomocą sudo Komenda
$-Wymaga wykonania Linux-commands jako zwykłego niepewnego użytkownika
  1. $$ - Wyświetl PID (identyfikator procesu)

    W tym przykładzie używamy specjalnej zmiennej $$ Aby wyświetlić PID (identyfikator procesu) dla naszego obecnego programu. Działa to nieco inaczej w zależności od tego, czy używasz tej zmiennej z wiersza poleceń:

    $ echo $$ 316204 $ ps -ef | grep -e "$$ | pid" uid pid pPid c Stime Tty Time Cmd Roel 316204 62582 0 11:53 Pts/2 00:00:00 Bash Roel 316499 316204 0 11:57 PTS/2 00:00:00 PS - EF Roel 316500 316204 0 11:57 PTS/2 00:00:00 GREP -E 316204 | PID 

    Lub z wnętrza skryptu. Na przykład rozważmy następujący skrypt test.cii:

    Echo $$ ps -ef | grep -e "$$ | pid" 
    Kopiuj

    Które, kiedy uczynimy go wykonywaniem (Test CHMOD +X.cii) i wykonuje, produkuje:

    $ chmod +x test.sh $ ./test.SH 316820 UID PID PPID C Stime Tty Time CMD ROEL 316820 316204 0 12:01 PTS/2 00:00:00 Bash Roel 316821 316820 0 12:01 PTS/2 00:00:00 PS -F ROEL 316822 316820 0 12: 01 pkt/2 00:00:00 grep -e 316820 | pid 

    Różnica dotyczy Pid wytworzony! To na pierwszy rzut oka może mieć sens koncepcyjny, ale wyjaśnijmy główny powód, dla którego Pid różni się: używamy innej powłoki bash. Pierwsze wykonane polecenie było bezpośrednio w wierszu poleceń, a zatem nasza specjalna $$ Zmienna (która identyfikuje PID aktualnie działającego programu) produkuje Pid obecnie działającej powłoki bash (istota 316204).

    W drugim przypadku uruchamiamy skrypt i każdy początek skryptu zawsze uruchomi nową powłokę bash. W rezultacie nasz Pid jest Pid nowo uruchomionej powłoki bash (316820). Możemy to również potwierdzić, patrząc na PPID (I.mi. Rodzicielski pid, Lub rodzic identyfikatora procesu) - to jest 316204 który pasuje do naszej powłoki bash, od którego rozpoczęliśmy skrypt, jak widać w pierwszym przykładzie (zarówno pierwszy, jak i drugi przykład zostały wykonane w tym samym terminalu na tym samym komputerze).

    grep -e polecenie w naszych dwóch przykładach pozwala nam uchwycić pierwszy wiersz pełnej listy procesów maszyny (jak uzyskano przez Ps -ef) poprzez umożliwienie rozszerzonego wsparcia Regex i Grepping Do Pid Oprócz naszego Pid (używając $$). | jest rozszerzonym separatorem wyrażeń regularnych, który umożliwia to podwójne przechwytywanie.

    Aby uzyskać więcej informacji na temat wyrażeń regularnych, zapoznaj się z naszą regexps Bash dla początkujących z przykładami i zaawansowaną regexem Bash z przykładami artykułów.

    Należy również pamiętać, że zautomatyzowaliśmy przechwytywanie PID, używając $$ w Grep Komenda. Ten $$ Zmienna nigdy się nie zmienia, chyba że rozpocznie się nowa powłoka bash / subshell, jak widać w poniższym przykładzie:

    $ $ $$ 316204 $ Bash $ $ $$ 318023 $ Echo $ ppid 316204 

    Pid naszej głównej skorupy bash jest nadal 316204 jak wcześniej. Następnie rozpoczynamy nową subshell i Pid tej nowej powłoki jest 318023 Po sprawdzeniu. I za pomocą zmiennej automatycznie ustawionej (przez Bash) $ PPID Możemy potwierdzić PPID (Identyfikator procesu nadrzędnego) wtórnej powłoki/subshell 316204, który pasuje do naszej głównej skorupy. Jak widać, pod względem zarządzania procesem, a konkretnie $$ Zmienna, nie ma dużej różnicy między uruchomieniem skryptu a nową subshellą.

    Aby uzyskać więcej informacji na temat zarządzania procesami BASH, możesz chcieć sprawdzić nasze BASH TELE Process Management i zarządzanie listami procesowymi i automatyczne wypowiedzenie procesów.



  2. $? - Kod wyjściowy

    $? Zmienna mówi nam, co Kod wyjściowy było z poprzedniego polecenia. Znając Kod wyjściowy Wykonanej instrukcji pozwala nam kontynuować skrypt w dwóch lub więcej różnych kierunkach. Na przykład, jeśli zaczęliśmy Rm polecenie (aby usunąć niektóre pliki) z programu, możemy chcieć sprawdzić, czy proces został pomyślnie zakończony.

    Jeśli Kod wyjściowy Jest 0, ogólnie (czytaj: prawie zawsze) oznacza, że ​​proces zakończył się pomyślnie. Jeśli jednak Kod wyjściowy Jest 1 (lub więcej) Często (choć nie zawsze) oznacza, że ​​proces zakończony błędem lub wynikiem negatywnym, na przykład plik nie można było usunąć w naszym przykładzie. Zobaczmy, jak to działa w wierszu poleceń, pamiętając, że działanie tej zmiennej z wewnątrz skryptu jest identyczne.

    $ dotknij to.istnieje $ rm.istnieje $ echo $? 0 $ rm to.robi.nie.Ist EXT RM: Nie można usunąć tego.robi.nie.istnieją ”: żaden taki plik ani katalog $ echo $? 1 

    Najpierw tworzymy plik Ten.istnieje za pomocą dotykać Komenda. dotykać po prostu tworzy plik zerowej wielkości bez pisania niczego. Następnie usuwamy plik za pomocą rm to.istnieje i wyświetl $? Kod wyjściowy za pomocą Echo. Wynik to 0, ponieważ polecenie się powiodło zgodnie z przewidywaniami i widocznymi przez nie zwracane błędy.

    Następnie próbujemy usunąć plik, który nie istnieje i odbieramy błąd. Kiedy sprawdzamy kod wyjściowy, rzeczywiście jest to 1 Wskazanie pewnego błędu wystąpił. Możemy łatwo sprawdzić wartość tej zmiennej z wiersza poleceń lub od skryptu za pomocą Jeśli [$? -Eq 0]; Następnie lub podobne stwierdzenie warunkowe (zakończone przez fi).

    Nauczyć się więcej o Jeśli Oświadczenia oparte na bash, jeśli oświadczenia, jeśli elif inaczej, to fi. Łączenie $? z Jeśli Oświadczenia są powszechnym i potężnym do automatyzacji różnych rzeczy w Bash.

  3. 1 USD, 2 USD,… $* - Przekazywanie argumentów

    Kiedy zaczynamy skrypt w wierszu poleceń Bash, możemy przekazać argumenty do tego samego. W pełni zależy od skryptu, aby obsłużyć przekazane argumenty. Jeśli na przykład skrypt w ogóle nie obsługuje argumentów (domyślnie), to nie ma konsekwencji albo określania lub nie określających żadnych lub wielu zmiennych do skryptu.

    Możemy poradzić sobie z przekazanymi argumentami za pomocą specjalnych zmiennych 1 USD, 2 USD, $* itp. Pierwszy argument przekazany do scenariusza zawsze będzie 1 USD, Drugi argument zawsze będzie 2 USD itp. Jedną rzeczą, na którą należy uważać, jest to, że jeśli wprowadzisz miejsce w skonfigurowanym kliencie Bash, Bash zinterpretuje tę przestrzeń jako separator.

    Jeśli próbujesz przekazać trochę tekstu, na przykład to jest przykład Musisz go odpowiednio zacytować: "to jest przykład"; Aby Bash mógł postrzegać ten tekst jako jedną przechodzącą zmienną.



    Specjalny $* Zmienna to skrót do pisania wszystkie zmienne w jeden ciąg. Zobaczmy, jak to działa, definiując nowy test2.cii skrypt w następujący sposób:

    echo "1: $ 1" echo "2: $ 2" echo "All: $ *" 
    Kopiuj

    Jako niewielka odmiana postanowiliśmy zdefiniować nasze zmienne tutaj jako $ 1 Do $ * zamiast 1 USD Do $*. W rzeczywistości dobrym pomysłem byłoby zawsze cytowanie zmiennych w ten sposób. Aby uzyskać więcej informacji, zapoznaj się z naszym poprawnym zmiennym analizowaniem i cytowaniem w artykule Bash.

    Kiedy wykonujemy to samo, używając dwóch lub trzech argumentów, widzimy:

    $ chmod +x test2.sh $ ./test2.sh '1 "2' 1: 1 2: 2 All: 1 2 $ ./test2.sh '1 "2" 3' 1: 1 2: 2 All: 1 2 3 

    Widzimy, jak nasze pierwsze dane wejściowe do skryptu jest prawidłowo rozpoznawane jako 1 USD itp. Zauważamy również, że trzeci argument jest całkowicie ignorowany przez skrypt do momentu dotarcia do echo "all: $ *" Instrukcja, która rzeczywiście pokazuje wszystkie argumenty, jak omówiono wcześniej. Zbadajmy teraz nieprawidłowe dane wejściowe bez cytowania:

    $ ./test2.sh to ma być jedno zdanie. 1: To 2: to wszystko: to ma być jedno zdanie. $ ./test2.sh "To ma być jedno zdanie.„1: To ma być jedno zdanie. 2: Wszystko: to ma być jedno zdanie. 

    Tutaj staje się jasne, w jaki sposób można interpretować przestrzeń jako separator zamiast rzeczywistych przestrzeni, chyba że tekst jest odpowiednio cytowany. W pierwszym wyniku, Ten jest postrzegany jako pierwszy argument, podczas gdy w drugim wyniku całe zdanie jest postrzegane jako pierwszy argument.



  4. 0 USD - Polecenie uruchomione

    Dowiedział się o 1 USD, Można się zastanawiać, co \ 0 $ Specjalna zmienna robi. Jeśli myślisz o tym, jak powstaje polecenie (Command Argument1 Argument2 itp.), możesz zauważyć, jak Komenda pojawia się przed pierwszym argumentem (1 USD). Dowództwo w pewnym sensie jest - wizualnie - \ 0 $, I właśnie to jest to specjalne \ 0 $ Zmienna zawiera; Polecenie uruchomione.

    $ echo \ $ 0 bash 

    Jak widzimy, i jak ma sens, w wierszu poleceń jest aktualnie działającym polecenie grzmotnąć. Jeśli dodamy Echo \ $ 0 polecenie skryptu testowego test3.cii i wykonaj to samo, otrzymujemy:

    $ ./test3.cii ./test3.sh $… /obszar roboczy /test3.sh… /obszar roboczy /test3.cii 

    Jak obecnie obecnie działające polecenie ./test3.cii, dokładnie tak, jak wykonano z wiersza poleceń. Jeśli uruchomimy polecenie przy użyciu dłuższej nazwy ścieżki, takiej jak … /Obszar roboczy /test3.cii Z drugiej strony jest to powtarzane przez specjalne \ 0 $ zmienny.

Wniosek

W tym artykule zbadaliśmy $$, $?, 1 USD, 2 USD itp., $* I \ 0 $ Zmienne, jak działają i jak możesz ich używać bezpośrednio z wiersza poleceń lub ze skryptów. Istnieje kilka innych specjalnych zmiennych, ale są to główne specjalne zmienne w Bash, których używałem przez wiele lat kodowania Bash. Cieszyć się!

Powiązane samouczki Linux:

  • Pobieranie stron internetowych za pomocą WGET, Curl i Lynx
  • Big Data Manipulacja dla zabawy i zysku Część 1
  • Manipulacja Big Data dla zabawy i zysku Część 3
  • Kompleks Linux Bash One-Liner Przykłady
  • Manipulacja Big Data dla zabawy i zysku Część 2
  • Zagnieżdżone pętle w skryptach Bash
  • Mastering Bash Script Loops
  • Wprowadzenie do automatyzacji, narzędzi i technik Linuksa
  • Mint 20: Lepsze niż Ubuntu i Microsoft Windows?
  • Pętle bash z przykładami