Válasz
A $phone_missing
egy karakterlánc, amely véletlenül tartalmaz false
-t. És egy nem üres karakterlánc true
értéket ad. Lásd még: http://www.linuxintro.org/wiki/Babe#empty_strings
Megjegyzések
- Rendben. Ezt a változót logikai értéknek nyilvánítottam volna (legalábbis nem a deklare szóval), de a hamu konzol nem engedte ' t. Emellett nem szeretném összehasonlítani a karakterláncokat '. Hogyan történik ez rendesen?
- stackoverflow.com/questions/2953646/… , de vigyázzon: ez a srác végrehajt egy string változót, és hamisak és hamisak is az unix parancsok.
Válasz
Gyakran használok “igaz” és “hamis” szavakat, mivel ezek is csak parancsok, amelyek csupán a sikert és a kudarcot adják vissza. Ezután megteheti
if "$phone_missing"; then ...
Válasz
Ez az egyik módja ennek ezt megtartva az igaz / hamis értékeket.
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
A kettős idézetek A $phone_missing
védelmet nyújt azokkal az esetekkel szemben, amikor a phone_missing
változót egyáltalán nem definiálják. Egy másik közös idióma, amelyre ez ellen kell figyelni, a “8f3b57ba3e”>
, de az idézetek számomra természetesebbnek tűnnek.
A tipp a bash
:
STRING True if string is not empty. ... ! EXPR True if expr is false.
Tehát alapvetően [ $foo ]
igaz lesz, ha a $foo
nem üres. Nem igaz vagy hamis, csak nem üres. [ ! $foo ]
igaz, ha a $ foo üres vagy nem definiált.
A kódodat mindig úgy módosíthatod, hogy a phone_missing
értéket nem értékre állítsd. – üres érték e, amely igazat fog jelölni. Ha a phone_missing
nincs beállítva (vagy üres – phone_missing=""
), akkor hamis lesz. Ellenkező esetben a karakterlánc-teszt operátorokat kell használnia (=
és !=
).
A másik apró probléma: a megbízás. $phone_missing=true
néven van megadva, míg phone_missing=true
legyen (nincs dollárjel).
Sajnálom, ha ez kissé sűrű, azért, mert én vagyok. Hosszú nap volt. 🙂
Válasz
Más válaszok adtak megoldást, de elmagyarázom, mi volt a baj az eredeti gondolkodásmóddal.
A Bash változóknak nincs típusuk, ezért nincs olyan logikai változó vagy érték, mint true vagy false. Alapvetően az összes bash változó csak karakterlánc.
Ha egy változót / karakterláncot a bash-ban tesztel, a teszt típusának megadása nélkül (-n
vagy -z
), alapértelmezés szerint egy -n
(nem nulla hosszúságú karakterlánc) tesztet állít be.
Tehát [ "$var" ]
egyenértékű a következővel: [ -n "$var" ]
. Amíg a $var
legalább 1 karaktert tartalmaz, azt igaznak értékeltük.
Mivel Ön tagadta a kifejezést, [ ! "$var" ]
egyenértékű a következővel: [ ! -n "$var" ]
. Tehát ha a $var
legalább 1 karaktert tartalmaz, akkor a kifejezés hamis.
Mivel false
(ami csak egy karakterlánc) 5 karaktert tartalmaz, a kifejezés hamis. Ha nem mindegy, hogy milyen karakterláncot állított be a phone_missing
értékre (true
, 0, 1), akkor a kifejezés mindig false
, mert a phone_missing
nem nulla hosszúságú. true
elkészítésének egyetlen módja phone_missing=""
mivel ez nulla hosszúságú.
Válasz
Ne használja a karakterlánc karakterláncát. Használjon egész számot.
Bevitel:
val=1 ((val)) && echo "true" || echo "false" val=0 ((val)) && echo "true" || echo "false"
Kimenet:
true false
Forrás :
((kifejezés))
A kifejezést az alábbiakban az ARITMETIKAI ÉRTÉKELÉS alatt leírt szabályok szerint értékeljük. Ha a kifejezés értéke nem nulla, akkor a visszatérési állapot 0; ellenkező esetben a visszatérési állapot 1. Ez pontosan egyenértékű a “kifejezés” kifejezéssel.
Válasz
Ezt megjegyzésként tettem volna, hogy támogassam Jameset Ko, de nem volt képviselője hozzászólni vagy nyilvánosan szavazni.
Itt az a kérdés, hogy a [] zárójelek egy összehasonlító teszt, például érték vagy karakterlánc-egyenlőség elvégzésének jelölését jelentik.
A bash karakterlánc igazsága egy üres karakterlánc esetében ""
(üres karakterlánc) hamisra (1. visszatérési érték) és minden nem üres hamis “hamis” “true” értékre kerül. “vagy” bob “a nagybátyád értéke igaz (visszatérési érték 0).
Ezt a következővel igazolhatja magának:
if [ "foo" ]; then echo true is $?; else echo false is $?; fi
A fenti $?
egy speciális változó, amely az utolsó parancsok kilépési állapotát (0 siker, és bármelyik> 0 hibakód esetén) tartja, és a következőt adja ki: true is 0
. A (z) "foo"
elemet bármire cserélheti, és az eredmény ugyanaz lesz, kivéve, ha egy üres karakterlánccal helyettesíti ""
vagy ""
ebben az esetben kiértékeli az egyéb feltételt és a kimenetet false is 1
.
A [ ] zárójelben a belső utasítás, például a! $ phone_missing kiértékelésre kerül, majd igaz érték esetén egy 0
vagy hamis értéket ad vissza l nyilatkozat. Mivel a zárójel kiértékeli a karakterláncokat és az értékeket, a $ phone_missing először kibővül a nem üres “hamis” karakterláncra, amelyet a [] nem üres karakterláncként (vagy igazként), majd a! megfordítja az eredményt, aminek eredményeként az if utasítás hamis értéket (vagy 1-es visszatérési értéket) kap, és kihagyja a feltételes testet, amely végrehajtja az else utasítást, ha van.
Ahogy James Ko mondta, a jelölés csak a változó, amely a “logikai értékét” az if vezérlő utasításhoz tartja. Megjegyzés , hogy a bash-ban a logikai igaznak és hamisnak kisbetűnek kell lennie, mint: bool_true = true bool_false = hamis Bármely más eset értékeld karakterláncként és ne logikai értékként.
Tehát a példád és James Ko válasza a következő lenne:
phone_missing=false echo "missing $phone_missing" if ! $phone_missing then echo "Lost phone at $readabletime" $phone_missing=true fi
vagy ahogy én az olvashatóságot részesíti előnyben (szintaktikailag ugyanaz és James Ko “s)
phone_missing=false echo "missing $phone_missing" if ( ! $phone_missing ); then echo "Lost phone at $readabletime" $phone_missing=true fi
Más válaszok, például Alexios által, szó szerint ellenőrzik a karakterlánc tartalmát. Tehát az alábbiak bármelyike hamis eredményt eredményezne:
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
Válasz
A helyes szintaxis: if ! $bool; then [statements]; fi
.
Példa:
bool=false if ! $bool; then echo "This is correct!" fi if [ ! $bool ]; then echo "This is wrong!" fi
Kimenet: This is correct!
Megjegyzések
- Válaszában van egy igazságmag, de magyarázat hiányában többet okoz zavart, mint orvosolja. Ez is alig több, mint az előző válaszok egyikének megismétlése. Ha nem akarja, hogy válaszát eltávolítsák, magyarázza el, miért helyes.