A (z) & & és || operátorok

Átfutottam egy /etc/rc.d/init.d/sendmail fájlt (tudom, hogy ezt soha nem használják, de “m vizsgára tanulok), és kissé összezavarodtam a && és a || operátorok miatt. Olvastam, hol használhatók olyan állításokban, mint:

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

Ez a szkript azonban egy soros utasításokat mutat, például:

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

Úgy tűnik, hogy ezek a && és || operátorokat használják válaszok kiváltására a teszteket, de még nem sikerült feltárnom a dokumentációt ezeknek az operátoroknak a sajátos használatával kapcsolatban. Meg tudja valaki magyarázni, hogy ezek mit csinálnak ebben a kontextusban?

Válasz

A && csak akkor kerül kiértékelésre, ha a bal oldal kilépési állapota nulla (azaz igaz). A || ellentétes: csak akkor értékeli a jobb oldalt, ha a bal oldali kilépési állapot nem nulla (azaz hamis).

Fontolhatja a [ ... ] visszatérési értékű programnak lenni. Ha a teszt belül igaznak bizonyul, akkor nullát ad vissza; egyébként nem nullát ad vissza.

Példák:

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

További megjegyzések:

Ha which [, láthatja, hogy a [ valójában egy programra mutat! Ez általában valójában nem az, amely szkriptekben fut; futtassa az type [ parancsot, hogy megnézze, mi fut valójában. Ha meg akarja próbálni a programot, adja meg a teljes elérési utat, mint például így: /bin/[ 1 = 1.

Megjegyzések

  • Amikor megjelenik a ” X vagy Y “, akkor tesztelje az X-et. Ha igaz ‘, akkor már tudja a választ a ” X vagy Y ” (ez ‘ s igaz), ezért nincs szükség Y tesztelésére. ‘ s igaz, nem tudod ‘ tudni a választ ” X vagy Y “, ezért tesztelnie kell Y-t. Amikor megjelenik a ” X és Y ” , akkor tesztelje X-et. Ha ‘ hamis, akkor már tudja a ” X és Y (ez ‘ s hamis), s o nincs szükség az Y tesztelésére. Ha X igaz, akkor tesztelnie kell Y-t, hogy lássa,

X és Y ” igaz.

  • A ” helyett, ha a bal oldal nulla értéket ad meg “, akkor a következőt írnám: ” ha a bal oldali ‘ parancs kilépési állapota nulla “. A ” return ” -et kissé kétértelműnek találom, mivel a kimenet és a kilépés állapota ” visszatérési értékek ”
  • Nem csak ” figyelembe veheti [ ... ] program ” programnak, sok esetben is . ‘ általában a /bin/[ vagy /usr/bin/[ fájlban található.
  • C programozók ezt szuper zavarosnak találják. Ott 0 jelentése hamis … Míg a kagylóírásban a 0 igazat jelent … Elme fújt.
  • @Calmarius Ha ‘ hozzászokott a C-hez, gondoljon a return állapotok, nem logikai értékek, ahol az return 0 sikert jelent.
  • Válasz

    Itt van a csalólapom:

    • “A; B “A, majd B futtatás, függetlenül A sikerétől
    • ” A & & B “B futás ha A sikeres volt
    • “A || B “B futás, ha A nem sikerült
    • ” A & “A futás a háttérben.

    Megjegyzések

    • Van ‘ s néhány érdekes lambda kalkulus párhuzam, amely itt zajlik, működő JavaScriptben (a változókat sorrendben definiálva); ” balra (más néven igaz) “: (a => b => a). ” jobbra (másképpen hamis) “: (a => b => b). ” A; B ” ” majd ” (a => b => (() => b())(a())). ” A & & B ” ” ha más nélkül (mikor) ” (a => b => a()(() => right)(b)).” A || B ” ” más nélkül, ha (hacsak) ” (a => b => a()(b)(() => right)). ” a & & b || c ” ” ifThenElse ” (a => b => c => (unless(when(a)(b))(c))()) .
    • vegye figyelembe, hogy a bash-ban a bal analóg 0 / üres karakterlánc, a jobb analóg minden más.
    • Mi a helyzet egyetlen függőleges sávval?

    Válasz

    a @ Shawn-j-Goff válaszának felülről történő kibővítéséhez, && egy logikai ÉS, és a || logikai VAGY.

    Lásd a ezt a részt Haladó Bash parancsfájlkezelési útmutató. A hivatkozás néhány tartalma felhasználói hivatkozáshoz, az alábbiak szerint.

    & & ÉS

    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. 

    || VAGY

    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. 

    Válasz

    Tapasztalatom szerint a & & an d || az if utasítás egyetlen sorra való csökkentése.

    Tegyük fel, hogy /root/Sample.txt nevű fájlt keresünk, akkor a hagyományos iteráció a következő lesz a shellben:

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

    Ez a 6 sor egyetlen sorra redukálható:

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

    Amikor néhány iterációt futtat a változók beállításához, ill. fájlok stb. létrehozásához az élet könnyebb, és a parancsfájl karcsúbbnak tűnik az egyetlen sorban, ha a function, csak az a hátránya, hogy kissé nehezebb több parancsot végrehajtani egyetlen iterációban, azonban használhatja a függvényeket.

    Megjegyzések

    • Ez klassz. Emlékeztet az objc kódra (a == b)? val = 1: val = 2;
    • Hogyan használhatom ezt a parancsot, ha egy folyamatot a háttérben szeretnék futtatni ” & “? Szintaxis hibát kapok a ./someScript.sh & && echo 'ok' || echo 'ko'
    • formában: foo && bar || baz, ha foo sikerül, akkor bar nem sikerül, a baz futtatásra kerül, tehát finoman eltér egy if utasítás.
    • Meg kell jegyeznem, hogy a {} zárójelben sorban több parancs is végrehajtható a && vagy ||, például: pidof udpxy > /dev/null 2>&1 && echo "udpxy is up!" || { echo "udpxy is down!"; /etc/init.d/udpxy restart; }. Érdemes megemlíteni azt is, hogy a if..then..else megbízhatóbb ” felismerő ” igaz / hamis feltételek, mint a && és a || használatakor.

    Válasz

    Van egy fogalom a „rövid vágásról”.

    A (expr1 && expr2) kiértékelésekor – csak akkor kerül kiértékelésre, ha a exp1 értéke” true “. Ennek az az oka, hogy a expr1 ÉS a expr2 mindkettőnek igaznak kell lennie ahhoz, hogy a (expr1 && expr2) igaz legyen. Ha a expr1 értéket hamisra értékeli expr2 NEM értékelik (rövidítés), mert (expr1 && expr2) már “flase”.

    Próbálja ki a következőket – tegyük fel, hogy a F1 fájl létezik & fájl F2 nem létezik:

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

    Hasonlóan a || (vagy) – de rövid a vágás megfordult.

    Megjegyzések

    • A logikát általában ” rövidzárlat “.

    még soha nem láttam a ” rövidítés ” kifejezést. Ezt megemlítem, hogy segítsek megtalálni a referenciákat.

    Válasz

    Shawn J. Goff válaszában szereplő példák helyesek, de a magyarázat fordítva van. Kérjük, ellenőrizze:

    A & & jobb oldala csak akkor kerül kiértékelésre, ha a bal oldal kilépési állapota NONZERO. || az ellenkezője: csak akkor értékeli a jobb oldalt, ha a bal oldali kilépési állapot Nulla.

    Megjegyzések

    • Tudja, hogy a héjak esetében a nulla kilépési kód true értéket ad, és így nem nulla kilépési kódot jelent a && eredményeként az egész kifejezés visszaadja a hamis ?
    • valaki nem hagyta jóvá a szerkesztéseket, mert nem ez volt a válaszod.Ha úgy gondolja, hogy néhány válasz helytelen, akkor értékelje le, és hagyjon megjegyzést; ha úgy gondolja, hogy változtatást igényel, hagyjon megjegyzést. A szerkesztés a nyelvtan, a formázás és a helyesírási hibák kijavítására szolgál, amelyek nem változtatják meg a válasz értelmét.
    • @countermode I ‘ sajnálom, igazad van, Azt hittem Linux alatt nulla = hamis és nem nulla = igaz (mint például a C-ben és sok más nyelvben / környezetben / platformon). Elnézést kérek a félreértésért.

    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