Specjalne zmienne bash z przykładami
- 1090
- 147
- Natan Cholewa
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
Zastosowane wymagania i konwencje oprogramowania
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 |
-
$$ - 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
:
KopiujEcho $$ ps -ef | grep -e "$$ | pid"
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 przezPs -ef
) poprzez umożliwienie rozszerzonego wsparcia Regex i Grepping DoPid
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
$$
wGrep
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.
-
$? - 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śmyRm
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 Jest1
(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 przezfi
).Nauczyć się więcej o
Jeśli
Oświadczenia oparte na bash, jeśli oświadczenia, jeśli elif inaczej, to fi. Łączenie$?
zJeśli
Oświadczenia są powszechnym i potężnym do automatyzacji różnych rzeczy w Bash. -
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ędzie1 USD
, Drugi argument zawsze będzie2 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 nowytest2.cii
skrypt w następujący sposób:
Kopiujecho "1: $ 1" echo "2: $ 2" echo "All: $ *"
Jako niewielka odmiana postanowiliśmy zdefiniować nasze zmienne tutaj jako
$ 1
Do$ *
zamiast1 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 doecho "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.
-
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ć, jakKomenda
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 dodamyEcho \ $ 0
polecenie skryptu testowegotest3.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