Jak używać testów warunkowych z podwójnym nawiasem w systemie Linux?

Opublikowany: 2022-01-29
fatmawati achmad zaenuri/Shutterstock.com

Testy warunkowe rozgałęziają przepływ wykonywania skryptów Linux Bash zgodnie z wynikiem wyrażenia logicznego. Testy warunkowe z podwójnym nawiasem znacznie upraszczają składnię — ale nadal mają swoje własne problemy.

Wsporniki pojedyncze i podwójne

Bash udostępnia polecenie test . Umożliwia to testowanie wyrażeń logicznych. Wyrażenie zwróci odpowiedź, która wskazuje na odpowiedź prawdziwą lub fałszywą. Prawdziwa odpowiedź jest wskazywana przez zwracaną wartość zero. Wszystko inne niż zero oznacza fałsz.

Łączenie poleceń w wierszu poleceń z operatorem && korzysta z tej funkcji. Polecenia są wykonywane tylko wtedy, gdy poprzednie polecenie zakończyło się pomyślnie.

Jeśli test jest prawdziwy, zostanie wydrukowane słowo „Tak”.

 test 15 -eq 15 && echo "Tak"
 test 14 -eq 15 && echo "Tak" 

Proste przykłady polecenia testowego Bash

Testy warunkowe z jednym nawiasem naśladują polecenie test . Zawijają wyrażenie w nawiasy kwadratowe „ [ ] ” i działają podobnie jak polecenie test . W rzeczywistości to ten sam program, stworzony z tego samego kodu źródłowego. Jedyną różnicą operacyjną jest sposób, w jaki wersja test i [ wersja obsługują żądania pomocy.

To jest z kodu źródłowego:

 /* Rozpoznaj --help lub --version, ale tylko po wywołaniu w
Forma „[”, gdy ostatnim argumentem nie jest „]”. Użyj bezpośrednio
parsowanie zamiast parse_long_options, aby uniknąć akceptowania
skróty. POSIX pozwala "[ --help" i "[ --version" na
mieć zwykłe zachowanie GNU, ale wymaga "test --help"
i "test --version", aby zakończyć po cichu ze statusem 0. */
Reklama

Efekt tego możemy zobaczyć, pytając test i [ o pomoc i sprawdzając kod odpowiedzi wysłany do Bash.

 test --pomoc
 echo $?
 [ --Wsparcie
 echo $? 

Używając --help w teście i [

Zarówno test jak i [ są wbudowane w powłokę , co oznacza, że ​​są wypiekane bezpośrednio w Bash. Ale jest też samodzielna wersja binarna [ .

 Wpisz test
 rodzaj [
 gdzie jest [ 

Znajdowanie różnych typów [ i poleceń testowych

Natomiast testy warunkowe z podwójnym nawiasem [[ i ]]słowami kluczowymi . [[ i ]] również wykonują testy logiczne, ale ich składnia jest inna. Ponieważ są to słowa kluczowe, możesz użyć kilku fajnych funkcji, które nie będą działać w wersji z jednym nawiasem.

Słowa kluczowe z podwójnym nawiasem są obsługiwane przez Bash, ale nie są dostępne w każdej innej powłoce. Na przykład powłoka Korn je obsługuje, ale zwykła stara powłoka sh nie. Wszystkie nasze skrypty zaczynają się od linii:

 #!/kosz/bash

Zapewnia to, że wywołujemy powłokę Bash w celu uruchomienia skryptu.

POWIĄZANE: Jak tworzyć i uruchamiać skrypty powłoki Bash w systemie Windows 10

Wbudowane i słowa kluczowe

Możemy użyć programu compgen do wylistowania wbudowanych:

 compgen -b | fmt -w 70
Reklama

Bez przesyłania danych wyjściowych przez fmt otrzymalibyśmy długą listę z każdym wbudowanym w osobnym wierszu. W tym przypadku wygodniej jest zobaczyć elementy wbudowane zgrupowane w akapicie.

Wyświetlanie listy wbudowanych Bash

Widzimy test i [ na liście, ale ] nie ma na liście. Polecenie [ szuka zamknięcia ] , aby wykryć, kiedy osiągnęło koniec wyrażenia, ale ] nie jest osobnym poleceniem wbudowanym. To tylko sygnał, który dajemy do [ , aby wskazać koniec listy parametrów.

Aby zobaczyć słowa kluczowe, możemy użyć:

 compgen -k | fmt -w 70 

Lista słów kluczowych Bash

Słowa kluczowe [[ i ]] znajdują się na liście, ponieważ [[ to jedno słowo kluczowe, a ]] to drugie. Są to dobrana para, podobnie jak if i fi , case i esac .

Kiedy Bash analizuje skrypt — lub wiersz poleceń — i wykryje słowo kluczowe, które ma pasujące, zamykające słowo kluczowe, zbiera wszystko, co pojawia się między nimi i stosuje specjalne traktowanie obsługiwane przez słowa kluczowe.

W przypadku wbudowanego polecenia, to, co następuje po wbudowanym poleceniu, jest do niego przekazywane dokładnie tak, jak parametry do każdego innego programu wiersza poleceń. Oznacza to, że autor skryptu musi zwrócić szczególną uwagę na takie rzeczy, jak spacje w wartościach zmiennych.

Globbing powłoki

Testy warunkowe z podwójnym nawiasem mogą wykorzystywać globbing powłoki. Oznacza to, że gwiazdka „ * ” rozwinie się i będzie oznaczać „cokolwiek”.

Reklama

Wpisz lub skopiuj następujący tekst do edytora i zapisz go w pliku o nazwie „whelkie.sh”.

 #!/kosz/bash

stringvar="Whelkie Brookes"

if [[ "$stringvar" == *elk* ]];
następnie
  echo "Ostrzeżenie zawiera owoce morza"
w przeciwnym razie
  echo "Bez mięczaków"
fi

Aby skrypt był wykonywalny, musimy użyć polecenia chmod z opcją -x (wykonaj). Musisz to zrobić ze wszystkimi skryptami w tym artykule, jeśli chcesz je wypróbować.

 chmod +x whelkie.sh 

Używanie chmod do tworzenia skryptu wykonywalnego

Kiedy uruchamiamy skrypt, widzimy, że ciąg „łoś” został znaleziony w ciągu „Whelkie”, niezależnie od tego, jakie inne znaki go otaczają.

 ./whelkie.sh 

Uruchamianie skryptu whelkie.sh

Należy zauważyć, że nie umieszczamy ciągu wyszukiwania w podwójnych cudzysłowach. Jeśli to zrobisz, globbing się nie wydarzy. Wyszukiwany ciąg będzie traktowany dosłownie.

Dozwolone są inne formy globbingu powłoki. Znak zapytania „ ? ” dopasowuje pojedyncze znaki, a pojedyncze nawiasy kwadratowe służą do wskazywania zakresów znaków. Na przykład, jeśli nie wiesz, którego przypadku użyć, możesz objąć obie ewentualności zakresem.

 #!/kosz/bash

stringvar="Jean-Claude van Clam"

if [[ "$stringvar" == *[cC]lam* ]];
następnie
  echo „Ostrzeżenie zawiera owoce morza”.
w przeciwnym razie
  echo "Wolne od mięczaków."
fi

Zapisz ten skrypt jako „damme.sh” i uczyń go wykonywalnym. Kiedy ją uruchomimy, instrukcja warunkowa zamienia się w prawdę i wykonywana jest pierwsza klauzula instrukcji if.

 ./damme.sh 

Uruchamianie skryptu damme.sh

Cytowanie ciągów

Wspomnieliśmy wcześniej o zawijaniu łańcuchów w podwójne cudzysłowy. Jeśli to zrobisz, powłoka globbing nie wystąpi. Chociaż konwencja mówi, że jest to dobra praktyka, nie musisz owijać zmiennych łańcuchowych w cudzysłowy, gdy używasz [[ i ]] , nawet jeśli zawierają spacje. Spójrz na następny przykład. Obie zmienne łańcuchowe $stringvar i $surname zawierają spacje, ale żadna z nich nie jest cytowana w instrukcji warunkowej.

 #!/kosz/bash

stringvar="van Damme"
nazwisko="van Damme"

if [[ $stringvar == $nazwisko ]];
następnie
echo "Nazwiska pasują."
w przeciwnym razie
echo "Nazwiska nie pasują."
fi
Reklama

Zapisz to w pliku o nazwie „nazwisko.sh” i uczyń go wykonywalnym. Uruchom go za pomocą:

 ./nazwisko.sh 

Uruchamianie skryptu nazwisko.sh

Pomimo obu ciągów zawierających spacje, skrypt się powiedzie, a instrukcja warunkowa zostanie uznana za true. Jest to przydatne w przypadku ścieżek i nazw katalogów zawierających spacje. Tutaj opcja -d zwraca prawdę, jeśli zmienna zawiera poprawną nazwę katalogu.

 #!/kosz/bash

dir="/home/dave/Dokumenty/Wymaga pracy"

if [[ -d ${katalog} ]];
następnie
  echo "Katalog potwierdzony"
w przeciwnym razie
  echo "Nie znaleziono katalogu"
fi

Jeśli zmienisz ścieżkę w skrypcie, aby odzwierciedlić katalog na własnym komputerze, zapisz tekst w pliku o nazwie „dir.sh” i ustaw go jako wykonywalny, możesz zobaczyć, że to działa.

 ./reż.sh 

Uruchamianie skryptu dir.sh

POWIĄZANE: Jak pracować ze zmiennymi w Bash

Nazwa pliku Globbing Gotchas

Ciekawa różnica między [ ] i [[ ]] dotyczy nazw plików zawierających w nich globbing. Formularz „*.sh” będzie pasował do wszystkich plików skryptów. Użycie pojedynczych nawiasów [ ] nie powiedzie się, chyba że istnieje pojedynczy plik skryptu. Znalezienie więcej niż jednego skryptu powoduje błąd.

Oto skrypt z warunkami warunkowymi w jednym nawiasie.

 #!/kosz/bash

if [ -a *.sh ];
następnie
  echo "Znaleziono plik skryptu"
w przeciwnym razie
  echo "Nie znalazłem pliku skryptu"
fi

Zapisaliśmy ten tekst w „script.sh” i uczyniliśmy go wykonywalnym. Sprawdziliśmy, ile skryptów znajduje się w katalogu, a następnie uruchomiliśmy skrypt.

 ls
 ./skrypt.sh 

Uruchamianie skryptu script.sh

Reklama

Bash zgłasza błąd. Usunęliśmy wszystkie pliki skryptu oprócz jednego i ponownie go uruchomiliśmy.

 ls
 ./skrypt.sh 

Uruchamianie skryptu script.sh z pojedynczym skryptem w katalogu

Test warunkowy zwraca prawdę, a skrypt nie powoduje błędu. Edycja skryptu tak, aby używał podwójnych nawiasów, zapewnia trzeci rodzaj zachowania.

 #!/kosz/bash

if [[ -a *.sh ]];
następnie
  echo "Znaleziono plik skryptu"
w przeciwnym razie
  echo "Nie znalazłem pliku skryptu"
fi

Zapisaliśmy to w pliku o nazwie „dscript.sh” i uczyniliśmy go wykonywalnym. Uruchomienie tego skryptu w katalogu zawierającym wiele skryptów nie generuje błędu, ale skrypt nie rozpoznaje żadnych plików skryptów.

Instrukcja warunkowa używająca podwójnych nawiasów jest rozpoznawana jako prawda tylko w mało prawdopodobnym przypadku, gdy w katalogu znajduje się plik o nazwie „*.sh”.

 ./dscript.sh 

Uruchamianie skryptu dsscript.sh

Logiczne AND i OR

Podwójne nawiasy pozwalają używać && i || jako operatory logiczne AND i OR.

Ten skrypt powinien zamienić instrukcję warunkową na prawdę, ponieważ 10 jest równe 10 , a 25 jest mniejsze niż 26.

 #!/kosz/bash

pierwszy=10
drugi=25

if [[ pierwsze -eq 10 && drugie -lt 26 ]];
następnie
  echo "Spełniony warunek"
w przeciwnym razie
  echo "Warunek nie powiódł się"
fi
Reklama

Zapisz ten tekst do pliku o nazwie „and.sh”, nadaj mu plik wykonywalny i uruchom go za pomocą:

 ./i.sh 

Uruchamianie skryptu and.sh

Skrypt działa zgodnie z oczekiwaniami.

Tym razem użyjemy || operator. Zdanie warunkowe powinno zostać uznane za prawdziwe, ponieważ chociaż 10 nie jest większe niż 15, 25 jest nadal mniejsze niż 26. Tak długo, jak pierwsze lub drugie porównanie jest prawdziwe, zdanie warunkowe jako całość zostaje uznane za prawdziwe.

Zapisz ten tekst jako „or.sh” i spraw, aby był wykonywalny.

 #!/kosz/bash

pierwszy=10
drugi=25

jeśli [[ pierwszy -gt 15 || drugi -lt 26]];
następnie
  echo "Spełniony warunek."
w przeciwnym razie
  echo "Warunek nie powiódł się."
fi
 ./lub.sh 

Uruchamianie skryptu or.sh

Regexes

Instrukcje warunkowe z podwójnym nawiasem zezwalają na użycie operatora =~ , który stosuje wzorce wyszukiwania wyrażeń regularnych w ciągu do drugiej połowy instrukcji. Jeśli wyrażenie regularne jest spełnione, wyrażenie warunkowe jest uważane za prawdziwe. Jeśli wyrażenie regularne nie znajdzie żadnych dopasowań, instrukcja warunkowa zostanie zmieniona na fałsz.

POWIĄZANE: Jak używać wyrażeń regularnych (wyrażeń regularnych) w systemie Linux

Zapisz ten tekst do pliku o nazwie „regex.sh” i uczyń go wykonywalnym.

 #!/kosz/bash

słowa = "jeden dwa trzy"
WordsandNumbers="jeden 1 dwa 2 trzy 3"
email="dave@domena sfabrykowana.co.uk"

maska1="[0-9]"
mask2="[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,4}"

if [[ $słowa =~ $maska1 ]];
następnie
  echo "\"$words\" zawiera cyfry."
w przeciwnym razie
  echo "Nie znaleziono cyfr w \"$words\"."
fi

if [[ $WordsandNumbers =~ $maska1 ]];
następnie
  echo "\"$WordsandNumbers\" zawiera cyfry."
w przeciwnym razie
  echo "Nie znaleziono cyfr w \"$WordsandNumbers\"."
fi

if [[ $email =~ $maska2 ]];
następnie
  echo "\"$email\" to poprawny adres e-mail."
w przeciwnym razie
  echo "Nie udało się przeanalizować \"$e-maila\"."
fi

Pierwszy zestaw podwójnych nawiasów używa zmiennej łańcuchowej $mask1 jako wyrażenia regularnego. Zawiera wzór dla wszystkich cyfr w zakresie od zera do dziewięciu. Stosuje to wyrażenie regularne do zmiennej łańcuchowej $words .

Drugi zestaw podwójnych nawiasów ponownie używa zmiennej łańcuchowej $mask1 jako wyrażenia regularnego, ale tym razem używa go ze zmienną łańcuchową $WordsandNumbers .

Reklama

Ostatni zestaw podwójnych nawiasów używa bardziej złożonej maski wyrażeń regularnych w zmiennej łańcuchowej $mask2 .

  • [A-Za-z0-9._%+-]+ : Dopasowuje dowolny znak będący wielką lub małą literą, dowolną cyfrę od zera do dziewięciu, kropkę, podkreślenie, znak procentowy lub znak plus lub minus . Znak „ + ” poza „ [] ” oznacza powtórzenie tych dopasowań dla tylu znaków, ile znajdzie.
  • @ : Dopasowuje tylko znak „@”.
  • [A-Za-z0-9.-]+ : Dopasowuje dowolny znak będący wielką lub małą literą, dowolną cyfrę od zera do dziewięciu, kropkę lub łącznik. Znak „ + ” poza „ [ ] ” oznacza powtórzenie tych dopasowań dla tylu znaków, ile znajdzie.
  • . : To pasuje do „.” tylko znak.
  • [A-Za-z]{2,4} : Dopasowuje dowolną wielką lub małą literę. „ {2,4} ” oznacza dopasowanie co najmniej dwóch znaków, a maksymalnie czterech.

Podsumowując, maska ​​regex sprawdzi, czy adres e-mail jest poprawnie utworzony.

Zapisz tekst skryptu w pliku o nazwie „regex.sh” i uczyń go wykonywalnym. Kiedy uruchamiamy skrypt, otrzymujemy to wyjście.

 ./regex.sh 

Uruchamianie skryptu regex.sh

Pierwsza instrukcja warunkowa kończy się niepowodzeniem, ponieważ wyrażenie regularne szuka cyfr, ale nie ma cyfr w wartości przechowywanej w zmiennej łańcuchowej $words .

Druga instrukcja warunkowa powiedzie się, ponieważ zmienna ciągu $WordsandNumbers zawiera cyfry.

Reklama

Ostateczna instrukcja warunkowa kończy się pomyślnie — to znaczy zostaje rozwiązana jako prawda — ponieważ adres e-mail jest prawidłowo sformatowany.

Tylko jeden warunek

Testy warunkowe z podwójnym nawiasem zapewniają elastyczność i czytelność skryptów. Po prostu możliwość używania wyrażeń regularnych w testach warunkowych uzasadnia naukę używania [[ i ]] .

Po prostu upewnij się, że skrypt wywołuje powłokę, która je obsługuje, na przykład Bash.

POWIĄZANE: 15 znaków specjalnych, które musisz wiedzieć o Bash