Jak używać bash subshells w środku, jeśli instrukcje

Jak używać bash subshells w środku, jeśli instrukcje

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
Jak używać bash subshells w środku, jeśli instrukcje

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

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