Próbowałem zadeklarować zmienną logiczną w skrypcie powłoki przy użyciu następującej składni:
variable=$false
variable=$true
Czy to jest poprawne? Ponadto, jeśli chciałbym zaktualizować tę zmienną, czy użyłbym tej samej składni? Wreszcie, czy następująca składnia do używania zmiennych boolowskich jako wyrażeń jest poprawna?
if [ $variable ]
if [ !$variable ]
true
orazfalse
w kontekście większości fragmentów poniżej są po prostu ciągi, a nie tobash built-ins
!!! Przeczytaj odpowiedź Mike'a Holta poniżej. (Jest to jeden z przykładów, w których wysoko głosowana i zaakceptowana odpowiedź jest myląca itrue
. Okazuje się, że oryginalna odpowiedź Miku naprawdę wywołałatrue
wbudowane, ale poprawiona odpowiedź nie. To spowodowało, że wspomniane komentarze wydają się błędne na temat działania kodu Miku. Od tamtej pory odpowiedź Miku została zredagowana, aby wyraźnie pokazywać zarówno oryginalny, jak i poprawiony kod. Mam nadzieję, że to raz na zawsze uspokoi zamieszanie.[ true ] && echo yes, true is true
i (upppsss)[ false ] && echo yes, false is also true
. / bin / true i / bin / false daje kod powrotu $? dla funkcji nie do porównania.variable=something
to jest prawdą, jeśli nieokreślonevariable=
, byłoby to fałszem[[ $variable ]] && echo true || echo false
i odwróceniem[[ ! $variable ]] && echo false || echo true
Odpowiedzi:
Poprawiona odpowiedź (12 lutego 2014 r.)
Oryginalna odpowiedź
Ostrzeżenia: https://stackoverflow.com/a/21210966/89391
Od: Używanie zmiennych boolowskich w Bash
Powodem zamieszczenia oryginalnej odpowiedzi jest to, że komentarze przed wersją z 12 lutego 2014 r. Odnoszą się tylko do oryginalnej odpowiedzi, a wiele komentarzy jest błędnych, gdy są powiązane ze zmienioną odpowiedzią. Na przykład komentarz Dennisa Williamsona dotyczący wbudowanego basha
true
2 czerwca 2010 r. Dotyczy tylko oryginalnej odpowiedzi, a nie poprawionej.źródło
if
instrukcja wykonuje zawartość zmiennej, która jest wbudowana w Bashtrue
. Każde polecenie można ustawić jako wartość zmiennej, a jego wartość wyjściowa zostanie oszacowana.&&
i||
operatorów:# t1=true; t2=true; f1=false;
#if $t1 || $f1; then echo is_true ; else echo is_false; fi;
(zwraca „true”, ponieważ t1 = true) #if $t1 && $f1 || $t2; then echo is_true ; else echo is_false; fi
(zwraca „true”, ponieważ t2 = true) . Ponownie działa to TYLKO, ponieważ „prawda” / „fałsz” są wbudowanymi funkcjami bash (zwracają wartość prawda / fałsz). Nie możesz użyć „if $ var ...”, chyba że var jest cmd (tj. Prawda lub fałsz)TL; DR
Problemy z ( oryginalną ) odpowiedzią Miku
Ja nie polecam zaakceptowane odpowiedź 1 . Jego składnia jest ładna, ale ma pewne wady.
Powiedzmy, że mamy następujący warunek.
W następujących przypadkach 2 warunek ten oceni się jako prawdziwy i wykona polecenie zagnieżdżone.
Zwykle chcesz, aby warunek był oceniany na true, gdy zmienna „Boolean”
var
w tym przykładzie jest jawnie ustawiona na true. Wszystkie pozostałe przypadki są niebezpiecznie wprowadzające w błąd!Ostatni przypadek (# 5) jest szczególnie niegrzeczny, ponieważ wykona polecenie zawarte w zmiennej (dlatego warunek ocenia się na true dla prawidłowych poleceń 3, 4 ).
Oto nieszkodliwy przykład:
Podawanie zmiennych jest bezpieczniejsze, np
if "$var"; then
. W powyższych przypadkach powinieneś otrzymać ostrzeżenie, że polecenia nie znaleziono. Ale nadal możemy zrobić lepiej (patrz moje rekomendacje na dole).Zobacz także wyjaśnienie Mike'a Holta oryginalnej odpowiedzi Miku.
Problemy z odpowiedzią Hbar
Takie podejście ma również nieoczekiwane zachowanie.
Można oczekiwać, że powyższy warunek będzie miał wartość false, dlatego nigdy nie będzie wykonywana instrukcja zagnieżdżona. Niespodzianka!
Cytując wartość (
"false"
), cytując zmienną ("$var"
) lub używająctest
lub[[
zamiast[
, nie robi różnicy.Co ja nie polecam:
Oto sposoby, które polecam sprawdzić swoje „booleany”. Działają zgodnie z oczekiwaniami.
Wszystkie są prawie równoważne. Będziesz musiał wpisać kilka dodatkowych naciśnięć klawiszy niż podejścia w pozostałych odpowiedziach 5 , ale twój kod będzie bardziej defensywny.
Przypisy
man woman
Nadal byłoby uważane za prawidłowe polecenie, nawet jeśli taka strona podręcznika nie istnieje.źródło
==
z[
lubtest
nie jest przenośne. Biorąc pod uwagę przenośność jest jedyną zaletą[
/test
ma ponad[[
, trzymaj się=
.Wydaje się, że istnieje tu pewne nieporozumienie dotyczące wbudowanego Basha
true
, a dokładniej tego, w jaki sposób Bash rozwija i interpretuje wyrażenia w nawiasach.Kod w odpowiedzi Miku ma absolutnie nic wspólnego z wbudowanego polecenia bash
true
, ani/bin/true
, ani żaden inny smaktrue
polecenia. W tym przypadkutrue
jest to zwykły ciąg znaków i nigdy nie jest wywoływanetrue
polecenie / polecenie wbudowane, ani przez przypisanie zmiennej, ani przez ocenę wyrażenia warunkowego.Poniższy kod jest funkcjonalnie identyczny z kodem w odpowiedzi miku:
Tylko różnicą jest to, że cztery znaki są porównywane są „Tak”, „e”, „a” i „H”, a nie „t”, „R”, „u” i „E”. Otóż to. Nie próbuje się wywoływać komendy ani wbudowanego programu o nazwie
yeah
, ani też (w przykładzie miku) nie ma żadnej specjalnej obsługi, gdy Bash analizuje tokentrue
. To tylko struna i całkowicie dowolna.Aktualizacja (2014-02-19): Po podążeniu za linkiem w odpowiedzi miku, teraz widzę, skąd bierze się zamieszanie. Odpowiedź Miku używa pojedynczych nawiasów, ale fragment kodu, do którego prowadzi łącze, nie używa nawiasów. To poprostu:
Oba fragmenty kodu będą zachowywać się w ten sam sposób, ale nawiasy całkowicie zmieniają to, co dzieje się pod maską.
Oto, co robi Bash w każdym przypadku:
Bez nawiasów:
$the_world_is_flat
do ciągu"true"
."true"
jako polecenia.true
polecenie (wbudowane lub/bin/true
, w zależności od wersji Bash).true
polecenia (który zawsze wynosi 0) z 0. Przypomnij sobie, że w większości powłok kod wyjścia 0 oznacza sukces, a cokolwiek innego wskazuje na niepowodzenie.if
instrukcjithen
Wsporniki:
$the_world_is_flat
do ciągu"true"
.string1 = string2
.=
Operator bash męska porównanie ciąg operator. Więc..."true"
i"true"
.if
instrukcjithen
.Kod bez nawiasów działa, ponieważ
true
polecenie zwraca kod wyjścia 0, co oznacza sukces. Kod w nawiasach działa, ponieważ wartość$the_world_is_flat
jest identyczna z literałem łańcuchatrue
po prawej stronie=
.Aby doprowadzić punkt do domu, rozważ następujące dwa fragmenty kodu:
Ten kod (jeśli jest uruchamiany z uprawnieniami administratora) uruchomi ponownie komputer:
Ten kod po prostu wypisuje „Niezła próba”. Polecenie ponownego uruchomienia nie jest wywoływane.
Aktualizacja (2014-04-14) Aby odpowiedzieć na pytanie w komentarzach dotyczące różnicy między
=
i==
: AFAIK, nie ma różnicy.==
Operator jest synonimem atakujących specyficzne dla=
, io ile widziałem, one działają dokładnie tak samo we wszystkich kontekstach.Należy jednak pamiętać, że jestem specjalnie mówić o
=
i==
operatorów porównania ciąg używany zarówno w[ ]
lub[[ ]]
testów. Nie sugeruję tego=
i==
są one wymienne wszędzie w bash.Na przykład, oczywiście nie możesz wykonać przypisania zmiennej
==
, na przykładvar=="foo"
(cóż, technicznie możesz to zrobić, ale wartośćvar
będzie"=foo"
, ponieważ Bash nie widzi==
tutaj operatora, widzi=
operatora (przypisanie), po którym następuje dosłowna wartość="foo"
, która właśnie się staje"=foo"
).Ponadto, chociaż
=
i==
są wymienne, należy pamiętać, że jak te testy praca nie zależy od tego, czy używasz go wewnątrz[ ]
lub[[ ]]
, a także od tego, czy argumenty są notowane. Możesz przeczytać więcej na ten temat w Advanced Bash Scripting Guide: 7.3 Inne operatory porównania (przewiń w dół do dyskusji na temat=
i==
).źródło
$the_world_is_flat && echo "you are in flatland!"
true
dotyczyły pierwotnej odpowiedzi. (Zmieniona odpowiedź z 12 lutego 2014 r. Nie została przesłana przez miku.) Zredagowałem odpowiedź, aby była zarówno oryginalna, jak i poprawiona. Wtedy komentarze ludzi mają sens.true
. Czy jest jakiś sposób? Podejrzewam, że wielu programistów, którzy są przyzwyczajeni do bardziej rygorystycznych języków, przeglądając tę odpowiedź, aby pomóc im w pomieszaniubash
kleju, aby ich życie było nieco łatwiejsze, chciałby===
operatora, aby ciągi znaków i „logiczne” nie były w rzeczywistości wymienne. Należy po prostu trzymać się od 0 do 1 i użytkowania(( $maybeIAmTrue ))
jak zasugerowano w Quolonel pytań jest odpowiedź ?true
, ale ogólnie nie jako czegoś do porównania zmiennej, ponieważ rzeczywistatrue
nie ma wartości jako takiej. Wystarczy ustawić status wyjścia na0
, wskazując na sukces. Warto zauważyć, że jest to zasadniczo odpowiednik tak zwanego „polecenia zerowego” lub:
. Jeśli chodzi o używanie0
i1
, to właśnie robię we wszystkich moich skryptach w dzisiejszych czasach, w których potrzebuję booleanów. I używam(( ))
operatora zamiast[[ ]]
do oceny. Na przykład, jeśli mamflag=0
, mogę to zrobićif (( flag )); then ...
Użyj wyrażeń arytmetycznych.
Wynik:
źródło
!
, w przeciwnym razie spowoduje to rozszerzenie historii.((! foo))
działa, tak też działa! ((foo))
. Uwielbiam to rozwiązanie, BTW. Wreszcie zwięzły sposób wykonywania zmiennych boolowskich.((foo || bar))
działa zgodnie z oczekiwaniami.(())
rozwija rekurencyjnie zmienne, czego się nie spodziewałem.foo=bar; bar=baz; ((foo)) && echo echo
nic nie drukuje, ale to prawdabaz=1
. Możesz więc wspierać,foo=true
afoo=false
także 0 lub 1, robiąctrue=1
.Krótko mówiąc:
W Bash nie ma booleanów
Bash ma wyrażenia logiczne pod względem porównania i warunków. To powiedziawszy, to, co możesz zadeklarować i porównać w Bash, to ciągi i liczby. Otóż to.
Gdziekolwiek zobaczysz
true
lubfalse
w Bash, jest to albo ciąg znaków, albo polecenie / wbudowane, które jest używane tylko do kodu wyjścia.Ta składnia ...
jest zasadniczo ...
Warunek ten jest spełniony za każdym razem, gdy polecenie zwraca kod zakończenia 0
true
ifalse
są wbudowanymi funkcjami Bash, a czasem także samodzielnymi programami, które nie robią nic poza zwracaniem odpowiedniego kodu wyjścia.Powyższy warunek jest równoważny:
Korzystając z nawiasów kwadratowych lub
test
polecenia, korzystasz z kodu wyjścia tej konstrukcji. Należy pamiętać, że[ ]
i[[ ]]
to również tylko polecenia / builtins jak każda inna. Więc ...koresponduje z
i
COMMAND
tutaj jest[[ 1 == 1 ]]
if..then..fi
Konstrukcja jest po prostu cukier syntaktyczny. Zawsze możesz po prostu uruchomić polecenia oddzielone podwójnym znakiem ampersand dla tego samego efektu:Podczas używania
true
iwfalse
tych konstrukcjach testowych w rzeczywistości przekazujesz tylko ciąg znaków"true"
lub"false"
polecenie testowe. Oto przykład:Wierzcie lub nie, ale wszystkie te warunki dają ten sam wynik :
TL; DR; zawsze porównuj z łańcuchami lub liczbami
Aby wyjaśnić to przyszłym czytelnikom, polecam zawsze stosowanie cytatów
true
ifalse
:ZROBIĆ
NIE
Może
źródło
T
iF
wyjaśnić, że nie są to prawdziwe wartości logiczne.[
(tj.test
)[[
I użyć tej, która jest odpowiednia do jego potrzeb.if ....; then mytest='-gt'; else mytest='-eq'; fi; #several lines of code; if [ "$var1" "$mytest" "$var2" ]; then ...; fi
Dawno, dawno temu, gdy wszystko, co mieliśmy
sh
, obsłużyliśmy Booleansa, polegając na konwencjitest
programu, w którejtest
zwraca fałszywy status wyjścia, jeśli jest uruchamiany bez żadnych argumentów.Pozwala to myśleć o zmiennej, która nie jest ustawiona jako fałsz, a zmienna ustawiona na dowolną wartość jako prawda. Dzisiaj
test
jest wbudowany w Bash i jest powszechnie znany z jednoznakowego aliasu[
(lub pliku wykonywalnego do użycia w powłokach, które go nie mają, jak zauważa dolmen):Ze względu na konwencje cytowania autorzy skryptów wolą używać
[[
naśladującego polecenia złożonegotest
, ale mają ładniejszą składnię: zmienne ze spacjami nie muszą być cytowane; można używać&&
i||
jako operatorów logicznych o dziwnym pierwszeństwie, a liczba terminów nie ma ograniczeń POSIX.Na przykład, aby ustalić, czy FLAG jest ustawiona, a COUNT jest liczbą większą niż 1:
Te rzeczy mogą być mylące, gdy potrzebne są spacje, ciągi zerowe i zmienne zerowe, a także, gdy skrypt musi pracować z kilkoma powłokami.
źródło
[
to nie tylko alias w środkubash
. Ten alias istnieje również jako plik binarny (lub jako link prowadzący do) i może być używany z gołą wersjąsh
. Sprawdzićls -l /usr/bin/\[
. Zbash
/zsh
powinieneś zamiast tego użyć[[
tego, co jest prawdziwie czysto wewnętrzne i jest znacznie potężniejsze.[
atest
także Bash SHELL BUILTIN COMMAND według strony podręcznika Bash, więc nie powinno być problemu z wydajnością. To samo z np. Dash. (/ bin / sh może być tylko dowiązaniem symbolicznym do / bin / dash). Aby użyć pliku wykonywalnego, musisz użyć pełnej ścieżki, tj/usr/bin/\[
.W przeciwieństwie do wielu innych języków programowania, Bash nie segreguje swoich zmiennych według „typu”. [1]
Więc odpowiedź jest dość jasna. W Bash nie ma żadnej zmiennej boolowskiej .
Jednak:
Za pomocą instrukcji deklaracji możemy ograniczyć przypisanie wartości do zmiennych. [2]
r
Opcja wdeclare
ireadonly
służy do stanu wyraźnie, że zmienne są tylko do odczytu . Mam nadzieję, że cel jest jasny.źródło
declare -ir false=0 true=1
? Jaka jest zaleta korzystania z tablicy?r
opcji ireadonly
poleceniu. Zrobiłbym to tak, jak zasugerowałeś w moich skryptachdeclare and use boolean variables
Możemy po prostu na wiele sposobów naśladować / zakładać, że zmienna ma typ . Nigdzie nie wspomniałem o tym w twojej odpowiedzi.Zamiast udawać Boolean i pozostawiać pułapkę dla przyszłych czytelników, dlaczego nie po prostu użyć lepszej wartości niż prawda i fałsz?
Na przykład:
źródło
0
wymusza nafalse
i1
natrue
. Jeśli chodzi o kody wyjścia programu (które historycznie używa bash), to0
dla pozytywnego wyniku lubtrue
wszystko inne jest negatywne / błąd lubfalse
.POSIX (interfejs przenośnego systemu operacyjnego)
Brakuje mi tutaj kluczowej kwestii, którą jest przenośność. Dlatego mój nagłówek ma w sobie POSIX .
Zasadniczo wszystkie głosowane odpowiedzi są poprawne, z wyjątkiem tego, że są zbyt specyficzne dla Bash .
Zasadniczo chcę tylko dodać więcej informacji na temat przenośności.
[
i]
nawiasy jak w[ "$var" = true ]
nie są konieczne, możesz je pominąć itest
bezpośrednio użyć polecenia:Ważna uwaga: nie zalecam już tego, ponieważ jest on powoli przestarzały i trudniej jest łączyć wiele instrukcji.
Wyobraźmy sobie, co te słowa
true
ifalse
myśli do powłoki, test to sam:Ale używając cytatów:
To samo dotyczy:
Powłoka nie może interpretować tego inaczej niż łańcucha. Mam nadzieję, że rozumiesz, jak dobrze jest używać właściwego słowa kluczowego bez cudzysłowów .
Ale nikt nie powiedział tego w poprzednich odpowiedziach.
Co to znaczy? Cóż, kilka rzeczy.
Powinieneś się przyzwyczaić do boolowskich słów kluczowych, które w rzeczywistości są traktowane jak liczby, to znaczy
true
=0
ifalse
=1
, pamiętaj, że wszystkie niezerowe wartości są traktowane jakfalse
.Ponieważ są one traktowane jako liczby, należy je również traktować w ten sposób, tzn. Jeśli zdefiniujesz zmienną, powiedz:
możesz stworzyć jego przeciwną wartość za pomocą:
Jak widać, powłoka drukuje
true
ciąg znaków po raz pierwszy, ale od tego czasu wszystko działa odpowiednio za pomocą liczb0
reprezentującychtrue
lub1
reprezentującychfalse
.Wreszcie, co powinieneś zrobić z tymi wszystkimi informacjami
Po pierwsze, jeden dobry nawyk byłby przypisywany
0
zamiasttrue
;1
zamiastfalse
.Drugim dobrym nawykiem byłoby testowanie, czy zmienna jest / nie jest równa zero:
źródło
Jeśli chodzi o składnię, jest to prosta metodologia, której używam (na przykład) do konsekwentnego i rozsądnego zarządzania logiką logiczną:
Jeśli zmienna nigdy nie jest zadeklarowana, odpowiedź brzmi:
# false
Tak więc prostym sposobem na ustawienie zmiennej na true (przy użyciu tej metodologii składni) byłoby
var=1
:; odwrotnievar=''
.Odniesienie:
-n
= Prawda, jeśli długość ciągu var jest różna od zera.-z
= Prawda, jeśli długość ciągu var wynosi zero.źródło
W wielu językach programowania typ boolowski jest lub jest zaimplementowany jako podtyp liczby całkowitej, gdzie
true
zachowuje się jak1
ifalse
zachowuje się jak0
:Boolean in C
Boolean w Pythonie
Boolean w Javie
Matematycznie algebra boolowska przypomina arytmetykę liczb całkowitych 2. Dlatego, jeśli język nie zapewnia natywnego typu logicznego, najbardziej naturalnym i wydajnym rozwiązaniem jest użycie liczb całkowitych. Działa z prawie każdym językiem. Na przykład w Bash możesz wykonać:
bash człowieka :
źródło
Bill Parker zostaje odrzucony , ponieważ jego definicje są odwrócone od normalnej konwencji kodu. Zwykle prawda jest zdefiniowana jako 0, a fałsz jest niezerowa. 1 będzie działać na fałsz, podobnie jak 9999 i -1. To samo z wartościami zwracanymi przez funkcję - 0 oznacza sukces, a wszystko niezerowe oznacza niepowodzenie. Przepraszam, nie mam jeszcze wiarygodności ulicy, aby głosować lub odpowiadać mu bezpośrednio.
Bash zaleca stosowanie podwójnych nawiasów jako nawyku zamiast pojedynczych nawiasów, a link podany przez Mike'a Holta wyjaśnia różnice w ich działaniu. 7.3 Inne operatory porównania
Po pierwsze,
-eq
jest operatorem numerycznym, więc ma kodwyda instrukcję błędu, oczekując wyrażenia w postaci liczby całkowitej. Dotyczy to każdego parametru, ponieważ żadna z nich nie jest liczbą całkowitą. Jeśli jednak umieścimy wokół niego podwójne nawiasy klamrowe, nie wyda ono komunikatu o błędzie, ale da niepoprawną wartość (cóż, w 50% możliwych kombinacji). Będzie oceniać na [[0 -eq prawda]] = sukces, ale także na [[0 -eq fałsz]] = sukces, co jest błędne (hmmm .... co z tym, że to wbudowane ma wartość liczbową?).
Istnieją inne kombinacje warunku, które również dają niepoprawne wyjście. Zasadniczo wszystko (oprócz warunku błędu wymienionego powyżej), które ustawia zmienną na wartość liczbową i porównuje ją z wbudowanym true / false lub ustawia zmienną na wbudowaną wartość true / false i porównuje ją z wartością liczbową. Ponadto wszystko, co ustawia zmienną na wbudowaną wartość prawda / fałsz i dokonuje porównania przy użyciu
-eq
. Unikaj więc-eq
porównań boolowskich i unikaj używania wartości numerycznych do porównań boolowskich. Oto podsumowanie permutacji, które dadzą nieprawidłowe wyniki:A teraz do tego, co działa. Używaj wbudowanych wartości prawda / fałsz do porównywania i oceny (jak zauważył Mike Hunt, nie umieszczaj ich w cudzysłowach). Następnie użyj znaku równości pojedynczej lub podwójnej (= lub ==) oraz nawiasów pojedynczych lub podwójnych ([] lub [[]]). Osobiście podoba mi się znak podwójnego znaku równości, ponieważ przypomina mi logiczne porównania w innych językach programowania i podwójne cudzysłowy tylko dlatego, że lubię pisać. Więc działają:
Masz to.
źródło
true
/false
Zabudowy nie są tu stosowane (ignorować co podświetlanie składni niektórych redaktorów może sugerować), zwłaszcza w[…]
przypadkach można myśleć o nim jako prosty ciąg tutaj (jeden, który jest podany jako parametr do[
komendy).Moje ustalenia i sugestie różnią się nieco od innych postów. Odkryłem, że mogę używać „booleanów” w zasadzie tak, jak w każdym „zwykłym” języku, bez sugerowania „skoku z obręczy” ...
Nie ma potrzeby
[]
ani jawnych porównań ciągów ... Próbowałem wielu dystrybucji Linuksa. Testowałem Bash, Dash i BusyBox . Wyniki były zawsze takie same. Nie jestem pewien, o czym mówią oryginalne najpopularniejsze posty. Może czasy się zmieniły i to wszystko.Jeśli ustawisz zmienną na
true
, będzie ona następnie oceniana jako „twierdząca” w ramach warunku. Ustaw go nafalse
, a jego wartość będzie „negatywna”. Bardzo proste! Jedynym zastrzeżeniem jest to, że niezdefiniowana zmienna również ma wartość true ! Byłoby miło, gdyby zrobił coś przeciwnego (jak w większości języków), ale to jest sztuczka - wystarczy jawnie zainicjować swoje wartości logiczne na prawda lub fałsz .Dlaczego to działa w ten sposób? Ta odpowiedź jest podwójna. A) prawda / fałsz w powłoce naprawdę oznacza „brak błędu” vs „błąd” (tj. 0 vs cokolwiek innego). B) prawda / fałsz nie są wartościami - są to raczej instrukcje w skryptach powłoki! Odnośnie do drugiego punktu, wykonanie
true
lubfalse
w linii samo ustawia wartość zwracaną dla bloku, w którym się znajdujesz, na tę wartość, tj.false
Jest deklaracją „napotkanego błędu”, gdzie prawda „usuwa” to. Użycie go z przypisaniem do zmiennej „zwraca” to do zmiennej. An niezdefiniowanych zmiennych ocenia jaktrue
w warunkowa dlatego, że równie oznacza 0 lub „nie napotkano błąd”.Zobacz przykładowe linie Bash i wyniki poniżej. Sprawdź to sam, jeśli chcesz potwierdzić ...
Wydajność
źródło
Oto prosty przykład, który działa dla mnie:
źródło
Oto implementacja krótkiego ręki
if true
.Przykład 1
Przykład 2
źródło
Stwierdziłem, że istniejące odpowiedzi są mylące.
Osobiście chcę po prostu mieć coś, co wygląda i działa jak C.
Ten fragment kodu działa wiele razy dziennie podczas produkcji:
i aby wszyscy byli szczęśliwi, przetestowałem:
Co również działało dobrze.
$snapshotEvents
Ocenia zawartość wartości zmiennej. Więc potrzebujesz$
.Tak naprawdę nie potrzebujesz nawiasów, po prostu uważam je za pomocne.
Testowano na: GNU Bash, wersja 4.1.11 (2) - wydanie
Bash Guide for Beginners , Machtelt Garrels, v1.11, 2008
źródło
()
- nie są potrzebne. Moją jedyną odpowiedzią jest wypróbowanie. Wygląda na to, że zależy od wersji Basha, rzeczywistego wyrażenia lub kontekstu i tym podobnych.Oto poprawka w stosunku do oryginalnej odpowiedzi miku, która rozwiązuje obawy Dennisa Williamsona dotyczące przypadku, w którym zmienna nie jest ustawiona:
I sprawdzić, czy zmienna to
false
:W przypadku innych przypadków z nieprzyjemną zawartością w zmiennej jest to problem z dowolnym zewnętrznym wejściem podawanym do programu.
Wszelkie dane zewnętrzne muszą zostać zweryfikowane przed zaufaniem. Ale weryfikacja ta musi zostać wykonana tylko raz, kiedy otrzyma się dane wejściowe.
Nie musi wpływać na wydajność programu, robiąc to przy każdym użyciu zmiennej, jak sugeruje Dennis Williamson .
źródło
Możesz użyć shFlags .
Daje możliwość zdefiniowania:
DEFINE_bool
Przykład:
W wierszu poleceń możesz zdefiniować:
źródło
To jest test szybkości na różne sposoby testowania wartości „boolowskich” w Bash:
Wydrukuje coś podobnego
źródło
Alternatywnie - użyj funkcji
Zdefiniowanie funkcji jest mniej intuicyjne, ale sprawdzenie jej zwracanej wartości jest bardzo łatwe.
źródło
Bash naprawdę myli problem z takimi
[
,[[
,((
,$((
, itd.Wszystkie stąpają po sobie nawzajem w obszarach kodu. Myślę, że jest to głównie historia, w której Bash musiał udawać, że
sh
czasami.Przez większość czasu mogę po prostu wybrać metodę i trzymać się jej. W tym przypadku mam tendencję do deklarowania (najlepiej we wspólnym pliku biblioteki, z którym mogę dołączyć do
.
moich rzeczywistych skryptów).Następnie mogę użyć
((
...))
operatora arytmetycznego, aby w ten sposób przetestować.Musisz być zdyscyplinowany. Twój
testvar
musi być ustawiony na$TRUE
lub$FALSE
przez cały czas.W
((
...))
komparatorach nie potrzebujesz poprzedzającego$
, co czyni go bardziej czytelnym.Mogę użyć
((
...))
ponieważ$TRUE=1
i$FALSE=0
, tj. Wartości liczbowe.Minusem jest
$
okazjonalne stosowanie:co nie jest takie ładne.
Nie jest to idealne rozwiązanie, ale obejmuje każdy przypadek, w którym potrzebuję takiego testu.
źródło