Jeg skumrede gennem en /etc/rc.d/init.d/sendmail
-fil (jeg ved, at dette næsten aldrig er brugt, men jeg er studerer til en eksamen), og jeg er blevet lidt forvirret over operatørerne &&
og ||
. Jeg har læst, hvor de kan bruges i udsagn som:
if [ test1 ] && [ test2 ]; then echo "both tests are true" elif [ test1 ] || [ test2 ]; then echo "one test is true" fi
Dette script viser dog enkeltlinjesætninger som:
[ -z "$SMQUEUE" ] && SMQUEUE="QUEUE" [ -f /usr/sbin/sendmail ] || exit 0
Disse ser ud til at bruge &&
og ||
til at fremkalde svar baseret på test, men jeg har ikke været i stand til at grave op dokumentation om netop denne brug af disse operatører. Kan nogen forklare, hvad disse gør i netop denne sammenhæng?
Svar
Højre side af &&
evalueres kun, hvis udgangsstatus for venstre side er nul (dvs. sand). ||
er det modsatte: det vil kun evaluere højre side, hvis status for venstre udgang ikke er nul (dvs. falsk).
Du kan overveje [ ... ]
for at være et program med en returværdi. Hvis testen inden evalueres til sand, returnerer den nul; det returnerer ellers nul.
Eksempler:
$ false && echo howdy! $ true && echo howdy! howdy! $ true || echo howdy! $ false || echo howdy! howdy!
Ekstra noter:
Hvis du gør which [
, kan du se, at [
faktisk peger på et program! Det er dog som regel ikke den, der kører i scripts; kør type [
for at se, hvad der rent faktisk bliver kørt. Hvis du vil prøve at bruge programmet, skal du bare give den fulde sti som så: /bin/[ 1 = 1
.
Kommentarer
Svar
Her er mit snydeark:
- “A; B “Kør A og derefter B, uanset succes A
- ” A & & B “Kør B hvis A lykkedes
- “A || B “Kør B, hvis A mislykkedes
- ” A & “Kør A i baggrunden.
Kommentarer
- Der ‘ er nogle interessante lambda-beregningsparalleller, der foregår her demonstreret i fungerende JavaScript (definer variablerne i rækkefølge); ” venstre (aka true) “:
(a => b => a)
. ” højre (aka false) “:(a => b => b)
. ” A; B ” ” derefter ”(a => b => (() => b())(a()))
. ” A & & B ” ” hvis uden andet (når) ”(a => b => a()(() => right)(b))
.” A || B ” ” andet uden hvis (medmindre) ”(a => b => a()(b)(() => right))
. ” a & & b || c ” ” ifThenElse ”(a => b => c => (unless(when(a)(b))(c))())
. - bemærk, at i bash er venstre analog 0 / tom streng, højre analog er alt andet.
- Hvad med en enkelt lodret bjælke?
Svar
for at udvide svaret på @ Shawn-j-Goff ovenfra, &&
er en logisk AND, og ||
er en logisk ELLER.
Se denne del af Advanced Bash Scripting Guide. Noget af indholdet fra linket til brugerhenvisning som nedenfor.
& & OG
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.
|| ELLER
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.
Svar
Fra min erfaring bruger jeg & & og d || for at reducere en if-sætning til en enkelt linje.
Sig, at vi leder efter en fil kaldet /root/Sample.txt, så vil den traditionelle iteration være som følger i shell:
if [ -f /root/Sample.txt ] then echo "file found" else echo "file not found" fi
Disse 6 linjer kan reduceres til en enkelt linje:
[[ -f /root/Sample.txt ]] && echo "file found" || echo "file not found"
Når du kører et par iterationer for at indstille variabler eller for at oprette filer osv. er livet lettere og scriptet ser glattere ud ved hjælp af den enkelt linje hvis funktion, det er kun ulempen at det bliver lidt sværere at implementere flere kommandoer fra en enkelt iteration, men du kan gøre brug af funktioner.
Kommentarer
- Dette er sejt. Mind mig om objc-kode (a == b)? val = 1: val = 2;
- Hvordan kan jeg bruge denne kommando, når jeg vil køre en proces i baggrunden med ” & “? Jeg får en syntaksfejl for
./someScript.sh & && echo 'ok' || echo 'ko'
- I form:
foo && bar || baz
, hvisfoo
lykkes, såbar
mislykkes,baz
køres, så det adskiller sig subtilt fra enif
udsagn. - Jeg skal bemærke, at det er muligt at udføre flere kommandoer i en række i
{}
parenteser ved hjælp af&&
eller||
, såsom:pidof udpxy > /dev/null 2>&1 && echo "udpxy is up!" || { echo "udpxy is down!"; /etc/init.d/udpxy restart; }
. Det er også værd at nævne, atif..then..else
er en mere pålidelig ” genkender ” af true / falske forhold end at bruge&&
og||
.
Svar
Der er en forestilling om “genvej”.
Når (expr1 && expr2)
vurderes – expr2
evalueres kun, hvis exp1
evalueres til” true “. Dette skyldes, at både expr1
OG expr2
skal være sandt for at (expr1 && expr2)
skal være sandt. Hvis expr1
evalueres til “falsk”, expr2
IKKE evalueres (genvej), fordi (expr1 && expr2)
er allerede “flase”.
Prøv følgende – antag, at filen F1
findes & -fil F2
findes ikke:
( [ -s F1 ] && echo "File Exists" ) # will print "File Exists" - no short cut ( [ -s F2 ] && echo "File Exists" ) # will NOT print "File Exists" - short cut
Tilsvarende for ||
(eller) – men kort klipning er omvendt.
Kommentarer
- Logikken kaldes normalt ” kortslutning “. Jeg ‘ har aldrig set udtrykket ” genvej ” brugt. Jeg nævner dette for at hjælpe med at finde referencer.
Svar
Eksemplerne i svaret af Shawn J. Goff er korrekte, men forklaringen er omvendt. Kontroller venligst:
Højre side af & & vil kun blive evalueret, hvis udgangsstatus for venstre side er NONZERO. || er det modsatte: den evaluerer kun højre side, hvis status for venstre udgang er NUL.
Kommentarer
- Du er opmærksom på, at for skaller nul udgangskode evalueres til sand og dermed ikke-nul udgangskode på venstre side af
&&
resulterer i, at hele udtrykket returnerer false ? - Nogen godkendte ikke dine redigeringer, fordi det ikke var dit svar.Hvis du mener, at et eller andet svar er forkert, skal du nedstemme det og eventuelt efterlade en kommentar. hvis du mener, at det kræver en ændring, skal du efterlade en kommentar. Redigering er til at rette grammatik, formatering og stavefejl, der ikke ændrer betydningen af svaret.
- @countermode I ‘ Jeg er ked af, du har ret, Jeg tænkte i Linux zero = false og nonzero = true (som i C og mange andre sprog / miljøer / platforme). Jeg undskylder for misforståelsen.
[ ... ]
for at være et program “, i mange tilfælde er . Det ‘ er almindeligt i filen/bin/[
eller/usr/bin/[
.return
status, ikke booleanske, hvorreturn 0
betyder succes.