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
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, iffoouspěje, pakbarselže,bazbude spuštěn, takže se nenápadně liší odifprohláš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í, žeif..then..elseje 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í.
[ ... ]být programem „, v mnoha případech je . Je ‚ běžně v souboru/bin/[nebo/usr/bin/[.returnstavy, nikoli booleans, kdereturn 0znamená úspěch.