Boolen operaattoreiden ymmärtäminen bash-komentosarjassa [duplicate]

Tähän kysymykseen on jo annettu vastauksia :

vastaus

Muuttuja $phone_missing on merkkijono, joka satunnaisesti sisältää false. Ja tyhjä merkkijono arvioidaan muotoon true. Katso myös http://www.linuxintro.org/wiki/Babe#empty_strings

Kommentit

  • Okei. Olisin ilmoittanut, että muuttuja on looginen (ainakaan deklaraa sanalla), mutta tuhkakonsoli ei antanut minulle '. En myöskään halua ' halua vertailla merkkijonoja. Kuinka tämä tehdään oikein?
  • stackoverflow.com/questions/2953646/… , mutta ole varovainen: tämä kaveri TOTEUTTAA merkkijonomuuttujan, sekä väärät että tosi ovat myös unix-komennot.

Vastaa

Käytän usein ”true” ja ”false”, koska ne ovat myös komentoja, jotka vain palauttavat onnistumisen ja epäonnistumisen. Sitten voit tehdä

if "$phone_missing"; then ... 

vastauksen

Tässä on yksi tapa tehdä tämä säilyttäen tosi / väärät arvot.

 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  

Kaksoislainausmerkit $phone_missing on suojattava tapauksilta, joissa muuttujaa phone_missing ei ole määritelty lainkaan. Toinen yleinen sanasto tätä vastaan on [ x$phone_missing != xfalse ], mutta lainaukset näyttävät luonnollisemmilta.

Vinkki on bash -ohjesivulla test:

 STRING True if string is not empty. ... ! EXPR True if expr is false. 

Joten [ $foo ] on totta, jos $foo ei ole tyhjä. Ei tosi tai väärä, vain ei-tyhjä. [ ! $foo ] on totta, jos $ foo on tyhjä tai määrittelemätön.

Voit aina vaihtaa koodisi siten, että asetat phone_missing arvoksi non – tyhjä arvo e, joka merkitsee totta. Jos phone_missing ei ole asetettu (tai tyhjä – phone_missing=""), se on väärä. Muussa tapauksessa sinun tulisi käyttää merkkijonotestausoperaattoreita (= ja !=).

Toinen pieni ongelma on tehtävä. Sinulla on se nimellä $phone_missing=true, kun taas sen pitäisi olla phone_missing=true (ei dollarin merkkiä).

Anteeksi, jos tämä on vähän tiheä, se johtuu olen . Se on ollut pitkä päivä. 🙂

Vastaus

Muut vastaukset antoivat sinulle ratkaisun, mutta selitän, mikä oli vialla alkuperäisessä ajattelussa.

Bash-muuttujilla ei ole tyyppejä, joten loogista muuttujaa tai arvoa, kuten true tai false, ei ole. Pohjimmiltaan kaikki bash-muuttujat ovat vain merkkijonoja.

Kun testaat muuttujan / merkkijonon bashissa määrittelemättä testityyppiä (-n tai -z), sen oletusarvo on -n (ei nollan pituusmerkkijono) -testi.

Joten [ "$var" ] vastaa [ -n "$var" ]. Niin kauan kuin $var sisältää vähintään yhden merkin, se arvioitiin tosi.

Koska kielsit lausekkeen, [ ! "$var" ] vastaa [ ! -n "$var" ]. Joten jos $var sisältää vähintään yhden merkin, lauseke on väärä.

Koska false (joka on vain merkkijono) sisältää 5 merkkiä, lauseke on väärä. Jos sillä ei ole väliä mitä merkkijonoa asetat phone_missing – (true, 0, 1), lauseke on aina false, koska is phone_missing on nollasta poikkeava. Ainoa tapa tehdä se true on phone_missing="", koska se on nolla.

Vastaa

Älä käytä merkkijonoa loogiseksi. Käytä kokonaislukua.

Syöttö:

val=1 ((val)) && echo "true" || echo "false" val=0 ((val)) && echo "true" || echo "false" 

Tulos:

true false 

Lähde :

((lauseke))

Lauseke arvioidaan jäljempänä kohdassa ARITMEETTINEN ARVIOINTI kuvattujen sääntöjen mukaisesti. Jos lausekkeen arvo ei ole nolla, palautustila on 0; muuten palautustila on 1. Tämä vastaa täsmälleen let ”lauseketta”.

vastaus

Olisin tehnyt tämän kommenttina Jamesin tukemiseksi Ko, mutta hänellä ei ollut edustajaa kommentoimaan tai äänestämään julkisesti.

Tässä on kysymys siitä, että [] -sulkeet ovat merkintöjä vertailutestin, kuten arvon tai merkkijonojen tasa-arvon, suorittamiseksi.

Tyhjän merkkijonon merkkijonon oikeellisuus bashissa on "" (tyhjä merkkijono) arvioi arvon false (palautusarvo 1) ja kaikki muut kuin tyhjät merkkijonot ”false” ”true” ”tai” bob ”setäsi arvioi arvon tosi (palautusarvo 0).

Voit todistaa tämän itsellesi:

 if [ "foo" ]; then echo true is $?; else echo false is $?; fi 

Yllä oleva $? on erityinen muuttuja, joka pitää viimeiset komennot exit-tilan (0 onnistunut ja mikä tahansa> 0 virhekoodille) ja tuottaa true is 0. Voit korvata "foo" millä tahansa haluamallasi tavalla, ja tulos on sama paitsi, jos korvaat sen tyhjällä merkkijonolla "" tai "" missä tapauksessa se arvioi muun ehdon ja lähdön false is 1.

Käytettäessä [ ] suluissa sisäinen lauseke, kuten! $ phone_missing, arvioidaan ja palauttaa sitten arvon 0 tosi-arvoksi tai 1 vääräksi if-sopimukselle l lausunto. Koska hakasulku arvioi merkkijonojen ja arvojen vertailut, $ phone_missing laajennetaan ensin ei-tyhjään merkkijonoon ”false”, jonka [] arvioi tyhjäksi merkkijonoksi (tai true) ja sitten! kääntää tuloksen, joka johtaa siihen, että if-käsky saa väärän arvon (tai palautusarvo 1) ja se ohittaa ehdollisen elimen, joka suorittaa muu lauseen, jos se on läsnä.

Kuten James Ko sanoi, merkinnällä tarkoitetaan vain välittää muuttuja, joka pitää ”totuusarvosi” if-ohjauslausekkeessa. Huomaa että bashissa totuusarvon tosi ja epätosi tulee olla pieniä kirjaimia kuten: bool_true = true bool_false = false Kaikki muut tapaukset arvioi merkkijonoina eikä loogisena.

Joten esimerkkisi ja James Ko: n vastauksen avulla se olisi:

phone_missing=false echo "missing $phone_missing" if ! $phone_missing then echo "Lost phone at $readabletime" $phone_missing=true fi 

tai kuten minä mieluummin luettavuus (syntaktisesti sama ja James Ko ”s)

phone_missing=false echo "missing $phone_missing" if ( ! $phone_missing ); then echo "Lost phone at $readabletime" $phone_missing=true fi 

Muut Alexiosin antamat vastaukset tarkistavat kirjaimellisesti merkkijonon sisällön. Joten jompikumpi seuraavista aiheuttaisi epätosi:

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 

Vastaa

Oikea syntaksin muoto on if ! $bool; then [statements]; fi.

Esimerkki:

bool=false if ! $bool; then echo "This is correct!" fi if [ ! $bool ]; then echo "This is wrong!" fi 

Lähtö: This is correct!

Kommentit

  • Vastauksessasi on totuuden ydin, mutta selityksen puuttuessa se aiheuttaa enemmän sekaannusta kuin se korjaa. Se on myös vähän enemmän kuin yhden edellisen vastauksen toistaminen. Jos et halua vastauksesi poistettavan, selitä miksi se on oikein.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *