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.