A logikai operátorok megértése a bash szkriptben [duplicate]

Ennek a kérdésnek már megvannak a válaszai :

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.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük