Matoucí použití & & a || operátoři

Procházel jsem soubor /etc/rc.d/init.d/sendmail (vím, že se to sotva někdy používá, ale já jsem Studuji na zkoušku) a já jsem trochu zmatený ohledně operátorů && a ||. Četl jsem, kde je lze použít v příkazech, jako jsou:

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

Tento skript však zobrazuje jednořádkové příkazy, například:

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

Zdá se, že používají operátory && a || k vyvolání odpovědí na základě testy, ale nebyl jsem schopen vykopat dokumentaci týkající se konkrétního použití těchto operátorů. Může někdo vysvětlit, co dělají v tomto konkrétním kontextu?

Odpověď

Pravá strana && bude hodnoceno pouze v případě, že je stav ukončení levé strany nulový (tj. pravdivý). || je pravý opak: vyhodnotí pravou stranu pouze v případě, že je stav ukončení levé strany nenulový (tj. nepravdivý).

Můžete zvážit [ ... ] být programem s návratovou hodnotou. Pokud se test uvnitř vyhodnotí jako true, vrátí nulu; jinak vrátí nenulovou hodnotu.

Příklady:

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

Zvláštní poznámky:

Pokud which [, můžete vidět, že [ ve skutečnosti ukazuje na program! Obvykle to však není ten, který běží ve skriptech; spuštěním type [ zjistíte, co se vlastně spustí. Pokud chcete program zkusit použít, zadejte úplnou cestu jako takže: /bin/[ 1 = 1.

Komentáře

  • Když uvidíte “ X nebo Y “ otestujete X. Pokud je to ‚ pravda, už znáte odpověď na “ X nebo Y “ (je to ‚ pravda), takže Y není třeba testovat. Pokud ano ‚ s pravdou, neznáte ‚ odpověď na “ X nebo Y „, takže musíte otestovat Y. Když uvidíte “ X a Y “ , otestujete X. Pokud je to ‚ s false, již znáte odpověď na “ X a Y “ (it ‚ s false), s o není třeba testovat Y. Je-li X pravdivé, je třeba Y testovat, zda “ X a Y “ jsou true.
  • Místo “ pokud levá strana vrátí nulu „, napsal bych “ je-li stav výstupu příkazu ‚ na levé straně nulový „. Zdá se mi “ return “ trochu nejednoznačný, protože výstup i stav ukončení lze považovat za “ návratové hodnoty “
  • nejen můžete “ zvážit [ ... ] být programem „, v mnoha případech je . Je ‚ běžně v souboru /bin/[ nebo /usr/bin/[.
  • Programátorům C to připadá velmi matoucí. Tady 0 znamená falešně … Zatímco ve skořápkách 0 znamená pravda … Mind blown.
  • @Calmarius Pokud jste ‚ zvyklí na C, pomyslete na return stavy, nikoli booleans, kde return 0 znamená úspěch.

Odpověď

Zde je můj cheat sheet:

  • „A; B „Spustit A a poté B, bez ohledu na úspěch A
  • “ A & & B „Spustit B pokud A uspělo
  • „A || B „Spustit B, pokud A selhalo
  • “ A & „Spustit A na pozadí.

Komentáře

  • Zde ‚ jsou zde ukázány některé zajímavé paralely lambda kalkulu, které jsou ukázány v pracovním JavaScriptu (definujte proměnné v pořadí); “ vlevo (aka true) „: (a => b => a). “ vpravo (aka false) „: (a => b => b). “ A; B “ “ poté “ (a => b => (() => b())(a())). “ A & & B “ “ pokud bez else (when) “ (a => b => a()(() => right)(b)).“ A || B “ “ jinak bez if (pokud) “ (a => b => a()(b)(() => right)). “ a & & b || c “ “ ifThenElse “ (a => b => c => (unless(when(a)(b))(c))()) .
  • Všimněte si, že v bash je levý analogický 0 / prázdný řetězec, pravý analogický je vše ostatní.
  • A co jeden svislý pruh?

Odpověď

pro rozšíření odpovědi @ Shawn-j-Goff shora, && je logické AND a || je logické OR.

Viz tuto část Průvodce pro pokročilé skriptování Bash. Část obsahu odkazu pro níže uvedenou referenci.

& & A

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. 

|| NEBO

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. 

Odpovědět

Z mé zkušenosti používám & & d || snížit příkaz if na jeden řádek.

Řekněme, že hledáme soubor s názvem /root/Sample.txt, pak by tradiční iterace v prostředí shellu vypadala takto:

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

Těchto 6 řádků lze zmenšit na jeden řádek:

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

Při spuštění několika iterací k nastavení proměnných nebo vytváření souborů atd., život je jednodušší a skript vypadá úhledněji pomocí funkce jednoho řádku if, jedinou nevýhodou je, že implementace více příkazů z jedné iterace je o něco obtížnější, ale funkce můžete využít.

Komentáře

  • To je skvělé. Připomíná mi to kód objc (a == b)? val = 1: val = 2;
  • Jak mohu použít tento příkaz, když chci spustit proces na pozadí s “ & „? Zobrazuje se mi chyba syntaxe pro ./someScript.sh & && echo 'ok' || echo 'ko'
  • ve tvaru: foo && bar || baz, if foo uspěje, pak bar selže, baz bude spuštěn, takže se nenápadně liší od if prohlášení.
  • Musím poznamenat, že je možné provést několik příkazů v řadě v {} závorkách pomocí && nebo ||, například: pidof udpxy > /dev/null 2>&1 && echo "udpxy is up!" || { echo "udpxy is down!"; /etc/init.d/udpxy restart; }. Za zmínku také stojí, že if..then..else je spolehlivější “ rozpoznávač “ true / falešné podmínky než použití && a ||.

Odpovědět

Existuje pojem „zkratka“.

Při hodnocení (expr1 && expr2)expr2 se vyhodnotí, pouze pokud exp1 se vyhodnotí jako“ true „. Je tomu tak proto, že expr1 A expr2 musí platit, aby platila (expr1 && expr2). Pokud se expr1 vyhodnotí na „false“ expr2 NENÍ hodnoceno (zkratka), protože (expr1 && expr2) již je „flase“.

Zkuste následující – předpokládejme, že soubor F1 existuje & soubor F2 neexistuje:

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

Podobně pro || (nebo) – ale krátké řezání je obrácené.

Komentáře

  • Logika se obvykle označuje jako “ zkrat „. Použitou frázi “ shortcut “ jsem nikdy neviděl ‚. Zmínil jsem to, abych pomohl s hledáním odkazů.

Odpověď

Příklady v odpovědi Shawna J. Goffa jsou správné, ale vysvětlení je naopak. Zkontrolujte prosím:

Pravá strana & & bude hodnoceno pouze v případě, že je stav opuštění levé strany NONZERO. || je pravý opak: vyhodnotí pravou stranu pouze v případě, že je stav ukončení levé strany NULA.

Komentáře

  • Jste si vědomi, že u mušlí je nulový výstupní kód vyhodnocen jako true a tedy nenulový výstupní kód na levé straně && způsobí, že celý výraz vrátí false ?
  • Někdo neschválil vaše úpravy, protože to nebyla vaše odpověď.Pokud si myslíte, že některá odpověď není správná, měli byste ji odmítnout a případně zanechat komentář; pokud si myslíte, že to vyžaduje změnu, měli byste zanechat komentář. Úpravy slouží k opravě gramatických, formátovacích a pravopisných chyb, které nemění význam odpovědi.
  • @countermode I ‚ omlouvám se, máte pravdu, Myslel jsem, že v Linuxu nula = false a nenulová = true (jako v C a mnoha dalších jazycích / prostředích / platformách). Omlouvám se za nedorozumění.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *