Jak używać testów warunkowych z podwójnym nawiasem w systemie Linux?
Opublikowany: 2022-01-29Testy 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"
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. */
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 $?
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 [
Natomiast testy warunkowe z podwójnym nawiasem [[
i ]]
są 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
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.
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
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”.
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
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
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
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
Zapisz to w pliku o nazwie „nazwisko.sh” i uczyń go wykonywalnym. Uruchom go za pomocą:
./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
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
Bash zgłasza błąd. Usunęliśmy wszystkie pliki skryptu oprócz jednego i ponownie go uruchomiliśmy.
ls
./skrypt.sh
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
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
Zapisz ten tekst do pliku o nazwie „and.sh”, nadaj mu plik wykonywalny i uruchom go za pomocą:
./i.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
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
.
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
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.
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