Kohteiden & & ja || sekava käyttö operaattorit

Olin selaamassa /etc/rc.d/init.d/sendmail -tiedostoa (tiedän, että tätä ei tuskin koskaan käytetä, mutta ”m tenttiopiskelu), ja olen hieman hämmentynyt && – ja || -operaattoreista. Olen lukenut, missä niitä voidaan käyttää esimerkiksi seuraavissa lauseissa:

if [ test1 ] && [ test2 ]; then echo "both tests are true" elif [ test1 ] || [ test2 ]; then echo "one test is true" fi 

Tämä komentosarja näyttää kuitenkin yhden rivin lauseita, kuten:

[ -z "$SMQUEUE" ] && SMQUEUE="QUEUE" [ -f /usr/sbin/sendmail ] || exit 0 

Nämä näyttävät käyttävän && – ja || -operaattoreita saadakseen vastauksia perustuen testejä, mutta en ole pystynyt kaivamaan dokumentaatiota näiden operaattoreiden erityisestä käytöstä. Voiko kukaan selittää, mitä nämä tekevät tässä yhteydessä?

Vastaa

&& arvioidaan vain, jos vasemman puolen poistumistila on nolla (eli tosi). || on päinvastainen: se arvioi oikean puolen vain, jos vasemman puolen poistumistila ei ole nolla (ts. väärä).

Voit harkita [ ... ] olevan ohjelma, jolla on paluuarvo. Jos sisällä oleva testi arvioi arvon tosi, se palauttaa nollan; se palauttaa muuten nollan.

Esimerkkejä:

$ false && echo howdy! $ true && echo howdy! howdy! $ true || echo howdy! $ false || echo howdy! howdy! 

Lisähuomautukset:

Jos teet which [, saatat nähdä, että [ osoittaa itse asiassa ohjelmaa! Se ei kuitenkaan yleensä ole skripteinä toimiva; suorita type [ nähdäksesi, mitä todella suoritetaan. Jos haluat kokeilla ohjelmaa, anna vain koko polku kuten joten: /bin/[ 1 = 1.

Kommentit

  • Kun näet ” X tai Y ”, testaat X: n. Jos se ’ on totta, tiedät jo vastauksen ” X tai Y ” (se ’ on tosi), joten Y: tä ei tarvitse testata. ’ tosi, et tiedä ’ et tiedä vastausta ” X tai Y ”, joten sinun on testattava Y. Kun näet ” X ja Y ” , testaat X: n. Jos se ’ on väärä, tiedät jo vastauksen ” X: ään ja Y ” (se ’ s väärä), s o ei tarvitse testata Y: tä. Jos X on tosi, sinun on kuitenkin testattava Y, jotta voidaan nähdä, ovatko ” X ja Y ” true.
  • ” -kohdan sijaan, jos vasen puoli palauttaa nollan ”, kirjoitan ”, jos vasemmanpuoleisen komennon ’ poistumistila on nolla ”. Mielestäni ” return ” on hieman epäselvä, koska sekä lähtöä että poistumistilaa voidaan pitää ” paluuarvot ”
  • Voit paitsi ” ottaa huomioon [ ... ] ohjelmaksi ”, monissa tapauksissa se on . ’ on tavallisesti tiedostossa /bin/[ tai /usr/bin/[.
  • C-ohjelmoijat pitävät tätä erittäin hämmentävänä. Siellä 0 tarkoittaa väärää … Kun simpukankirjoituksessa 0 tarkoittaa totta … Mieli puhallettu.
  • @Calmarius Jos ’ olet tottunut C: hen, ajattele return -tilat, ei boolean-arvot, joissa return 0 tarkoittaa menestystä.

Vastaa

Tässä huijausarkki:

  • ”A; B ”Suorita A ja sitten B riippumatta A: n onnistumisesta
  • ” A & & B ”Suorita B jos A onnistui
  • ”A || B ”Suorita B, jos A epäonnistui
  • ” A & ”Suorita A taustalla.

Kommentit

  • Siellä ’ joitain mielenkiintoisia lambda calculus -paralleeleja, jotka täällä käyvät, osoitetaan toimivassa JavaScriptissä (määritä muuttujat järjestyksessä); ” vasen (alias true) ”: (a => b => a). ” oikea (alias väärä) ”: (a => b => b). ” A; B ” ” sitten ” (a => b => (() => b())(a())). ” A & & B ” ” jos ilman muuta (milloin) ” (a => b => a()(() => right)(b)).” A || B ” ” muu ilman if (ellei) ” (a => b => a()(b)(() => right)). ” a & & b || c ” ” ifThenElse ” (a => b => c => (unless(when(a)(b))(c))()) .
  • huomaa, että bashissa vasen on analoginen 0 / tyhjä merkkijono, oikea analoginen on kaikki muu.
  • Entä yksi pystypalkki?

Vastaa

laajentaaksesi @ Shawn-j-Goffin vastausta ylhäältä, && on looginen AND, ja || on looginen TAI.

Katso tämä Advanced Bash Scripting Guide. Jotkut linkin sisällöstä alla olevan käyttäjän viitteeksi.

& & JA

if [ $condition1 ] && [ $condition2 ] # Same as: if [ $condition1 -a $condition2 ] # Returns true if both condition1 and condition2 hold true... if [[ $condition1 && $condition2 ]] # Also works. # Note that && operator not permitted inside brackets #+ of [ ... ] construct. 

|| OR

if [ $condition1 ] || [ $condition2 ] # Same as: if [ $condition1 -o $condition2 ] # Returns true if either condition1 or condition2 holds true... if [[ $condition1 || $condition2 ]] # Also works. # Note that || operator not permitted inside brackets #+ of a [ ... ] construct. 

Vastaa

Kokemukseni mukaan käytän & & an d || pienentää if-käsky yhdelle riville.

Sano, että etsimme tiedostoa nimeltä /root/Sample.txt, perinteinen iteraatio olisi seuraava kuoressa:

if [ -f /root/Sample.txt ] then echo "file found" else echo "file not found" fi 

Nämä 6 riviä voidaan supistaa yhdeksi riviksi:

[[ -f /root/Sample.txt ]] && echo "file found" || echo "file not found" 

Kun suoritetaan muutama iteraatio muuttujien asettamiseksi tai Jos haluat luoda tiedostoja jne., elämä on helpompaa ja komentosarja näyttää ohuemmalta käyttämällä yhtä riviä, jos funktio, ainoa haittapuoli on, että useiden komentojen toteuttaminen yhdestä iteraatiosta on hieman vaikeampi, mutta voit käyttää toimintoja.

kommentit

  • Tämä on hienoa. Muistuttaa minua objc-koodista (a == b)? val = 1: val = 2;
  • Kuinka voin käyttää tätä komentoa, kun haluan suorittaa prosessin taustalla ” & ”? Saan syntaksivirheen kohteelle ./someScript.sh & && echo 'ok' || echo 'ko'
  • muodossa: foo && bar || baz, jos foo onnistuu, sitten bar epäonnistuu, baz suoritetaan, joten se eroaa hienovaraisesti if lauseke.
  • Minun on huomattava, että useita komentoja peräkkäin voidaan suorittaa sulkeissa {}, käyttämällä && tai ||, kuten: pidof udpxy > /dev/null 2>&1 && echo "udpxy is up!" || { echo "udpxy is down!"; /etc/init.d/udpxy restart; }. On myös syytä mainita, että if..then..else on luotettavampi ” -tunnistin ” true / väärät ehdot kuin käyttämällä && ja ||.

Vastaa

On olemassa käsite ”pikaleikkauksesta”.

Kun arvioidaan (expr1 && expr2)expr2 arvioidaan vain, jos exp1 on” true ”. Tämä johtuu siitä, että molempien expr1 JA expr2 on oltava totta, jotta (expr1 && expr2) voi olla totta. Jos expr1 arvioidaan vääräksi expr2 EI arvioida (pikakuvake), koska (expr1 && expr2) on jo ”flase”.

Kokeile seuraavaa – oletetaan, että tiedosto F1 on olemassa & tiedosto F2 ei ole olemassa:

( [ -s F1 ] && echo "File Exists" ) # will print "File Exists" - no short cut ( [ -s F2 ] && echo "File Exists" ) # will NOT print "File Exists" - short cut

Vastaavasti || (tai) – mutta lyhyt leikkaus on päinvastainen.

Kommentit

  • Logiikkaa kutsutaan yleensä nimellä ” oikosulku ”. En ’ ole koskaan nähnyt lausetta ” lyhytleikkaus ”. Mainitsen tämän auttaakseni löytämään viitteitä.

Vastaus

Shawn J.Goffin vastauksen esimerkit ovat oikeita, mutta selitys on päinvastoin. Tarkista:

& & arvioidaan vain, jos vasemman puolen poistumistila on NONZERO. || on päinvastainen: se arvioi oikean puolen vain, jos vasemman puolen poistumistila on NOLLA.

Kommentit

  • Olet tietoinen siitä, että kuorien nolla poistumiskoodi on true ja siten ei nolla -koodia && johtaa siihen, että koko lauseke palauttaa false ?
  • Joku ei hyväksynyt muokkauksiasi, koska se ei ollut vastauksesi.Jos mielestäsi jokin vastaus on väärä, äänestä se alhaalla ja jätä kommentti. jos luulet, että se vaatii muutosta, jätä kommentti. Muokkauksella korjataan kielioppi-, muotoilu- ja kirjoitusvirheet, jotka eivät muuta vastauksen merkitystä.
  • @countermode I ’ Anteeksi, olet oikeassa, Ajattelin Linuxissa nolla = väärä ja nolla = tosi (kuten C: ssä ja monissa muissa kielissä / ympäristöissä / alustoissa). Pahoittelen väärinkäsitystä.

Vastaa

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