Această întrebare are deja răspunsuri aici :
Răspuns
Răspundeți
Folosesc adesea „adevărat” și „fals”, deoarece acestea sunt, de asemenea, comenzi care doar returnează succesul și respectiv eșecul. Apoi, puteți face
if "$phone_missing"; then ...
Răspuns
Iată un mod de a face aceasta, păstrând în același timp valorile adevărate / false.
phone_missing=false if [ "$phone_missing" != false ]; then echo "phone_missing is not "false" (but may be non-true, too)" fi if [ "$phone_missing" == true ]; then echo "phone_missing is true." fi
Ghilimelele duble din jurul $phone_missing
trebuie să se protejeze împotriva cazului în care variabila phone_missing
nu este deloc definită. Un alt idiom obișnuit pentru a preveni acest lucru este [ x$phone_missing != xfalse ]
, dar ghilimelele mi se par mai naturale.
Sugestia se află în bash
pagina de ajutor pentru test
:
STRING True if string is not empty. ... ! EXPR True if expr is false.
Deci, practic [ $foo ]
va fi adevărat dacă $foo
nu este gol. Nu este adevărat sau fals, ci doar nu este gol. [ ! $foo ]
este adevărat dacă $ foo este gol sau nedefinit.
Puteți schimba întotdeauna codul pentru a seta doar phone_missing
la un non -valor gol e, care va denota adevărat. Dacă phone_missing
este nesetat (sau gol – phone_missing=""
), acesta va fi fals. În caz contrar, ar trebui să utilizați operatorii de testare a șirurilor (=
și !=
).
Cealaltă ușoară problemă este atribuirea. Îl aveți ca $phone_missing=true
, în timp ce ar trebui să fie phone_missing=true
(fără semn de dolar).
Ne pare rău dacă acesta este un pic dens, este pentru că eu sunt. A fost o zi lungă. 🙂
Răspuns
Alte răspunsuri v-au oferit soluție, dar voi explica ce a fost în neregulă cu gândirea inițială.
Variabilele Bash nu au tipuri, deci nu există o variabilă booleană sau o valoare ca adevărat sau fals. Practic toate variabilele bash sunt doar șiruri.
Când testați o variabilă / șir în bash fără a specifica tipul de test (-n
sau -z
), va fi implicit un test -n
(șir de lungime diferită de zero).
Deci, [ "$var" ]
este echivalent cu [ -n "$var" ]
. Atâta timp cât $var
conține cel puțin 1 caracter, acesta a fost evaluat la adevărat.
Deoarece ați negat expresia, [ ! "$var" ]
este echivalent cu [ ! -n "$var" ]
. Deci, dacă $var
conține cel puțin 1 caracter, atunci expresia este falsă.
Deoarece false
(care este doar un șir) conține 5 caractere, expresia este falsă. Dacă nu contează ce șir setați phone_missing
la (true
, 0, 1), expresia va fi întotdeauna false
deoarece este phone_missing
are o lungime diferită de zero. Singura modalitate de ao face true
este phone_missing=""
deoarece aceasta are o lungime zero.
Răspunde
Nu folosi șir pentru boolean. Utilizați numărul întreg.
Intrare:
val=1 ((val)) && echo "true" || echo "false" val=0 ((val)) && echo "true" || echo "false"
Ieșire:
true false
Sursă :
((expresie))
Expresia este evaluată în conformitate cu regulile descrise mai jos în EVALUAREA ARITMETICĂ. Dacă valoarea expresiei este diferită de zero, starea de returnare este 0; în caz contrar, starea de returnare este 1. Aceasta este exact echivalentă cu „expresie”.
Răspuns
Aș fi făcut acest lucru ca un comentariu pentru a-l susține pe James Ko, dar nu a avut reprezentantul să comenteze sau să voteze public.
Problema aici este că parantezele [] sunt notații pentru efectuarea unui test de comparație, cum ar fi egalitatea de valoare sau șir.
Adevărul șirului în bash pentru un șir gol este ""
(șir gol) este evaluat la fals (returnează valoarea 1) și orice șir non gol „fals” „adevărat „sau” bob „este unchiul tău” evaluează la adevărat (returnează valoarea 0).
Îți poți dovedi asta cu:
if [ "foo" ]; then echo true is $?; else echo false is $?; fi
$?
de mai sus este o variabilă specială care deține starea de ieșire a ultimelor comenzi (0 de succes și orice> 0 pentru codul de eroare) și va afișa true is 0
. Puteți înlocui "foo"
cu orice doriți, iar rezultatul va fi același, cu excepția cazului în care îl înlocuiți cu un șir gol ""
sau ""
caz în care va evalua condiția else și va ieși false is 1
.
Când utilizați [ ] paranteze declarația internă precum! $ phone_missing este evaluată și apoi returnează un 0
pentru adevărat sau 1
pentru fals la contro Declarație. Deoarece parantezul evaluează șirurile și comparațiile de valori, $ phone_missing este extins mai întâi la șirul „gol” care nu este gol, care este evaluat de [] ca șir ne gol (sau adevărat) și apoi! inversează rezultatul care are ca rezultat instrucțiunea if obținând o valoare falsă (sau returnând valoarea 1) și omite corpul condițional care execută instrucțiunea else dacă este prezentă.
După cum a spus James Ko, notația ar fi să treacă doar variabilă ținând „boolean” la instrucțiunea if control. Rețineți că în bash un boolean adevărat și fals trebuie să fie minuscule ca în: bool_true = adevărat bool_false = false Orice alt caz va fi evaluați ca șiruri și nu booleene.
Prin urmare, folosind exemplul dvs. și răspunsul lui James Ko ar fi:
phone_missing=false echo "missing $phone_missing" if ! $phone_missing then echo "Lost phone at $readabletime" $phone_missing=true fi
sau ca I prefer pentru lizibilitate (sintactic la fel și James Ko „s”)
phone_missing=false echo "missing $phone_missing" if ( ! $phone_missing ); then echo "Lost phone at $readabletime" $phone_missing=true fi
Alte răspunsuri precum Alexios verifică literalmente conținutul șirului. Astfel, oricare dintre următoarele ar avea ca rezultat fals:
phone_missing=false if [ "$phone_missing" != false ]; then echo "phone_missing is not "false" (but may be non-true, too)" fi if [ "$phone_missing" == true ]; then echo "phone_missing is not "false" (but may be non-true, too)" fi if [ "$phone_missing" == Bobs_your_uncle ]; then echo "phone_missing is not "false" (but may be non-true, too)" fi
Răspuns
Sintaxa corectă este if ! $bool; then [statements]; fi
.
Exemplu:
bool=false if ! $bool; then echo "This is correct!" fi if [ ! $bool ]; then echo "This is wrong!" fi
Ieșire: This is correct!
Comentarii