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
, iffoo
uspěje, pakbar
selže,baz
bude spuštěn, takže se nenápadně liší odif
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í, žeif..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í.
[ ... ]
být programem „, v mnoha případech je . Je ‚ běžně v souboru/bin/[
nebo/usr/bin/[
.return
stavy, nikoli booleans, kdereturn 0
znamená úspěch.