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
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
, josfoo
onnistuu, sittenbar
epäonnistuu,baz
suoritetaan, joten se eroaa hienovaraisestiif
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ä.
[ ... ]
ohjelmaksi ”, monissa tapauksissa se on . ’ on tavallisesti tiedostossa/bin/[
tai/usr/bin/[
.return
-tilat, ei boolean-arvot, joissareturn 0
tarkoittaa menestystä.