Á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.
[ ... ] program ” programnak, sok esetben is . ‘ általában a /bin/[ vagy /usr/bin/[ fájlban található. 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.
& & É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, hafoosikerül, akkorbarnem sikerül, abazfuttatásra kerül, tehát finoman eltér egyifutasí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 aif..then..elsemegbí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.