Jak używać bash subshells w środku, jeśli instrukcje
- 1790
- 281
- Maria Piwowarczyk
Jeśli kiedykolwiek używałeś bash subshells ($ (…)
), wiesz, jak elastyczne mogą być subshelly. Tylko kilka znaków, aby uruchomić subshell, aby przetworzyć wszystko, co wymagane, w linii do innego stwierdzenia. Liczba możliwych przypadków użycia jest praktycznie nieograniczona.
Możemy również używać bash subshells w środku Jeśli
Oświadczenia, w linii z oświadczeniem. To daje użytkownikowi i programistom wiele dodatkowej elastyczności, jeśli chodzi o pisanie bash Jeśli
sprawozdania.
Jeśli jeszcze nie jesteś znany (lub chciałbyś dowiedzieć się więcej o), jeśli oświadczenia, zobacz naszą bash, jeśli stwierdzenia: Jeśli elif inaczej, to artykuł fi.
W tym samouczku się nauczysz:
- Jak włączyć do wewnątrz bazowe subshells
Jeśli
sprawozdania - Zaawansowane metody włączania bash subshells w linii z innymi poleceniami
- Przykłady pokazujące użycie subshell bash w
Jeśli
sprawozdania
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 |
Przykład 1: Uruchamianie prostego
Spójrzmy na prosty przykład na początek. Zauważ, że te stwierdzenia, podczas gdy wykonane tutaj w wierszu poleceń można również włączyć do skryptu powłoki bash (zwykły plik tekstowy, najlepiej z a .cii
rozszerzenie i oznaczone jako wykonywalne przy użyciu CHMOD +x Myscript.cii
polecenie - gdzie Myscript.cii
jest przykładową nazwą pliku). Wprowadzamy również błąd, aby wszystko było bardziej interesujące.
$ if [„test” == "$ (echo 'test')"]; Następnie Echo ’pasuje!';; Else Echo ”nie pasuje!';; Fi pasuje! $ if [„test” == ”$ (echo„ nieprawidłowe ”)”]; Następnie Echo ’pasuje!';; Else ”nie pasuje!';; FI nie pasuje!: polecenie nie znaleziono $
W pierwszym poleceniu używamy prostego testu (if ["some_text" == "some_other_text"]; Następnie…
) Aby sprawdzić równość między dwoma strunami. W przypadku drugiego ciągu rozpoczęliśmy bash ($ (…)
) Aby wyprowadzić słowo test. Rezultat jest taki test mecze test I tak polecenia po Następnie
W tym przypadku klauzula zostanie wykonana Echo „dopasowuje się!'
jest wykonywany i mecze!
wydruki.
W drugim poleceniu zmieniamy polecenie ECHO na niepoprawne dopasowanie tekstu, pozwalając echo/wyjście subshellowe błędny ($ (echo „nieprawidłowe”)
). Otrzymujemy dziwny błąd wyglądający. Przyjrzyj się uważnie, czy możesz zauważyć błąd? Porównaj także drugie polecenie z pierwszym.
Problem polega na tym, że w naszym drugim poleceniu, w przeciwnym razie
klauzula (która jest wykonywana, gdy mecz równości się nie powiedzie, i.mi. 'Co w przeciwnym razie zrobić, gdy oświadczenie IF nie było prawdą) brakuje Echo
Komenda. Podczas gdy może odczytać płynnie (jeśli… wtedy echo… inaczej…) polecenie jest niepoprawne, ponieważ wymaga dodatkowego echa. W rezultacie powłoka bash próbuje wykonać Nie pasuje!
Jako dosłowne polecenie.
Naprawmy to!
$ if [„test” == ”$ (echo„ nieprawidłowe ”)”]; Następnie Echo ’pasuje!';; Else Echo ”nie pasuje!';; FI nie pasuje!
Dużo lepiej. I możemy zobaczyć naszą subshell, to jest Echo
, i pełne Jeśli
instrukcja wykonująca poprawnie. Świetnie, zanurkujmy trochę głębiej.
Przykład 2: Nieco bardziej złożone instrukcja podsekwowa oparta na IF
$ Var1 = "abc"; if [["$ (echo" $ var1 ")" == * "b" *]]; Następnie Echo ’pasuje!';; Else Echo ”nie pasuje!';; Fi pasuje! $ Var1 = "adc"; if [["$ (echo" $ var1 ")" == * "b" *]]; Następnie Echo ’pasuje!';; Else Echo ”nie pasuje!';; FI nie pasuje!
Tutaj ustawiamy zmienną Var
albo ABC
Lub ADC
a następnie wyprowadzić tę zmienną, ponownie za pomocą subshella, przeciwko obecności B
w ciągu. Zauważ, że oryginalna gwiazdka (*
) prefiks do "B"
Porównaj klauzulę wskazuje cokolwiek przed tym ciągiem i gwiazdka sufiksów (*
) Podobnie oznacza cokolwiek po tym ciągu. Widzimy, jak B
znaleziono w pierwszym ABC
ciąg, ale nie w drugim poleceniu/ciągu, gdzie ADC
był używany jako ciąg porównywania.
Zwróć również uwagę, jak użyliśmy [[…]]
wsporniki dla Jeśli
Tym razem stwierdzenie. Nie jest to związane z użyciem subshellów i jest to po prostu nowszy standard pisania Jeśli
stwierdzenia, które można użyć do dodatkowych lub innych przypadków użycia, a następnie tradycyjnego […]
składnia. Potrzebujemy tego tutaj, aby zrobić specjalne B
Dopasowywanie próbujemy, używając gwiazdki (*
) prefiks i sufiks do "B"
Porównaj klauzulę.
W Jeśli
Oświadczenie z singlem […]
nawiasy to by się nie udało:
$ if [„abc” == * „b” *]; Następnie Echo ’pasuje!';; Else Echo ”nie pasuje!';; FI nie pasuje! $ if [[„abc” == * "b" *]]; Następnie Echo ’pasuje!';; Else Echo ”nie pasuje!';; Fi pasuje!
Jak Jeśli [… ]
Składnia nie rozpoznaje gwiazdka (*
) prefiks i sufiks do "B"
Porównaj klauzulę i trzeba użyć [[…]]
Zamiast tego wsporniki.
Kolejną rzeczą, na którą należy zwrócić uwagę, jest to, że tym razem użyliśmy podwójnych cytatów ("
) Wewnątrz subshell (zamiast pojedynczych cytatów, jak w pierwszym przykładzie): Gdy uruchamia się subshell, takie użycie podwójnych cytatów jest nie tylko dozwolone, ale mogę zdecydowanie polecić to do różnych przypadków. Jest przydatny w niektórych sytuacjach, w których trwa wiele złożonych analizy i konieczna jest mieszanka pojedynczych i podwójnych cytatów. Podwójne cytaty nie zakończą cytatów rozpoczętych przed i na zewnątrz subshell.
Należy pamiętać, że w przypadku większości poprzednich przykładów można po prostu pominąć subshellę i wykonać proste porównanie bezpośrednio z zmienną, i.mi.:
$ Var1 = "abc"; if [["$ var1" == * "b" *]]; Następnie Echo ’pasuje!';; Else Echo ”nie pasuje!';; Fi pasuje!
Zdecydowaliśmy się jednak przedstawić subshells Echo
(skutecznie zerowa operacja, i.mi. skutecznie tak samo jak tylko użycie zmiennej lub omawianego tekstu), ponieważ podkreśliłoby to, że 1) subshelly działają skutecznie i 2), że można je używać od wewnątrz Jeśli
sprawozdania.
Przykład 3: Zaawansowane instrukcje subshellowe oparte na IF
Nie musimy ograniczać naszego użytku subshell w środku Jeśli
stwierdzenia do jednego polecenia, ani do użycia Echo
sam. Zróbmy małą konfigurację:
$ dotyk a $ ls -color = nigdy ./a | WC -L 1
Utworzyliśmy plik o nazwie A
, i policzy liczbę linii (za pomocą WC -L
, narzędzie do zliczania, które może policzyć liczbę linii za pomocą -L
opcja). Upewniliśmy się również do przedstawienia --kolor = nigdy
opcja LS
Aby uniknąć analizowania problemów z użyciem końcowego kodowania kolorów.
Następnie sprawdźmy te stwierdzenia bezpośrednio w Jeśli
sprawozdania:
$ if [-z "$ (ls -color = nigdy ./a | wc -l) "]; następnie echo" Pusty katalog wyjściowy!"; fi $ if [" $ (ls -color = nigdy ./a | wc -l) "-eq 1]; następnie echo" dokładnie jeden plik znaleziony!"; fi dokładnie jeden plik znaleziony! $
Tutaj używamy tego samego LS… WC -L
kod dwa razy bezpośrednio z wewnątrz Jeśli
oświadczenie. Pierwszy Jeśli
stwierdzenie, które używa -z
sprawdza, czy tekst między cytatami (pierwsza opcja do -z
If-instrukcja) jest pusta. To nie jest jak LS
Polecenie da pewne dane wyjściowe w tym przypadku, biorąc pod uwagę, że utworzyliśmy plik A
.
W drugim poleceniu faktycznie testujemy, czy wyjście z naszego LS… WC -L
polecenie jest równe 1 za pomocą -Eq
Opcja testowa w Jeśli
oświadczenie. Eq
oznacza równy. Zauważ, że -Eq
(I to jest odwrotne -ne
istnienie nie równe) może być używane tylko dla liczb. W przypadku ciągów tekstowych użyj ==
(równe) i !=
(nie równe) zamiast tego.
Wyjście polecenia (Dokładnie jeden plik znaleziony!
) jest poprawne, a nasz Jeśli
Oświadczenie z włączoną wieloma komorami Subshell działa dobrze!
Należy również zauważyć, że pierwsza porównanie wartości w drugim Jeśli
stwierdzenie (i.mi. $ (ls -color = nigdy ./a | WC -L)
z wyjściem 1
) jest numeryczne. Dlaczego więc użyliśmy dwóch podwójnych cytatów („…”
) wokół instrukcji Subshell? To nie ma nic wspólnego z subshellami, a wszystko z tym, jak Jeśli
pracuje w Bash i można jeszcze nie znać tej sztuczki lub skrótów; Rozważ to:
$ V = "1 1" $ if [$ v -eq 0]; następnie echo „0”; Fi Bash: [: Za dużo argumentów $ if ["$ v" -eq 0]; następnie echo „0”; Fi Bash: [: 1 1: Wyrażenie liczb całkowitych oczekiwano $ v = 0 $ if ["$ v" -eq 0]; następnie echo „0”; Fi 0
Innymi słowy, użycie podwójnych cytatów jest nieco bezpieczniejszym sposobem programowania bash Jeśli
stwierdzenia, nawet jeśli warunek jest warunkiem opartym na numerycznym. Chroni przed bardziej złożonymi ciągami interpretowanymi jako poszczególne elementy, a nie pojedynczą wartość i zwraca prawidłowy komunikat o błędzie (Oczekiwana ekspresja liczb całkowita
) zamiast bardziej niejednoznacznego Bash: [: Zbyt wiele argumentów
błąd.
Nie ma również znaczenia, aby bash, że porównujesz coś, co wydaje się być ciągiem tekstowym (jak wskazuje „…”
) z wartością liczbową; Działa, pod warunkiem, że liczba jest numeryczna. A jeśli tak nie jest, nadal zapewni lepszy komunikat o błędzie wskazujący, że ciąg nie jest numeryczny. Podsumowując, lepiej jest zawsze zacytować swoją subshell, tekst lub zmienną z podwójnymi cytatami, nawet przy porównywaniu elementów numerycznych. Aby to udowodnić, działa dobrze, rozważ:
$ if [„1” -eq "1"]; Następnie echem „y”; fi y $ if [„1” -eq "0"]; Następnie echem „y”; fi $
Wniosek
W tym artykule przyjrzeliśmy się włączeniu do wewnątrz bashów Jeśli
sprawozdania. Zbadaliśmy kilka przykładów, od łatwych do zaawansowanych, o tym, w jaki sposób możemy korzystać z bash subshells w środku Jeśli
sprawozdania. Podczas porównywania nieco zanurkowaliśmy w użyciu podwójnych cytatów, nawet przy porównywaniu pól numerycznych. Używając subshells w innych poleceń, aw tym przypadku Jeśli
Oświadczenia to potężny sposób na rozszerzenie umiejętności scenariuszy Bash. Cieszyć się!
Powiązane samouczki Linux:
- Zaawansowane podpsy Linux z przykładami
- Linux Subshells dla początkujących z przykładami
- Bash, jeśli stwierdzenia: jeśli, elif, else, to fi
- Mastering Bash Script Loops
- Samouczek debugowania GDB dla początkujących
- Wielokrotyściowe skrypty i zarządzanie procesami w…
- Pętle bash z przykładami
- Rzeczy do zrobienia po zainstalowaniu Ubuntu 20.04 Focal Fossa Linux
- Wprowadzenie do automatyzacji, narzędzi i technik Linuksa
- Specjalne zmienne bash z przykładami
- « Zarządzanie listami procesowymi i automatyczne rozwiązanie procesu
- Najlepszy Linux Distro dla programistów »