Á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
, hafoo
sikerül, akkorbar
nem sikerül, abaz
futtatásra kerül, tehát finoman eltér egyif
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 aif..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.