it-swarm-eu.dev

Matoucí použití && a || operátory

Procházel jsem souborem /etc/rc.d/init.d/sendmail (Vím, že se to sotva někdy používá, ale studuji na zkoušku), a trochu jsem zmaten ohledně && A || Operátoři. Četl jsem, kde je lze použít v prohlášeních, 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 příkazy s jedním řádkem, jako například:

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

Zdá se, že tyto operátory používají operátory && A || K vyvolání odpovědí založených na testech, ale nedokázala jsem vykopírovat dokumentaci o tomto konkrétním použití těchto operátorů. Může někdo vysvětlit, co to v tomto konkrétním kontextu dělá?

105
josh-cain

Pravá strana && bude vyhodnoceno, pouze pokud je výstupní stav na levé straně nulový (tj. true). || je opak: vyhodnotí pravou stranu, pouze pokud je levý výstupní stav nenulový (tj. nepravdivý).

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

Příklady:

$ false && echo howdy!

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

$ false || echo howdy!
howdy!

Extra poznámky:

Pokud udelas which [, můžete vidět, že [ ve skutečnosti odkazuje na program! Obvykle to však není ten, který běží ve skriptech; spustit type [ abyste viděli, co se vlastně rozběhne. Pokud chcete program zkusit, zadejte úplnou cestu takto: /bin/[ 1 = 1.

159
Shawn J. Goff

Tady je můj cheat sheet:

  • "A; B" Běh A a B, bez ohledu na úspěch A
  • "A && B" Běh B, pokud A uspěl
  • "A || B" Spustit B, pokud A selhalo
  • "A &" Spustit A na pozadí.
67
user177073

rozbalit odpověď na @ Shawn-j-Goff shora, && je logický AND a || je logický NEBO.

Viz this část Průvodce pokročilým skriptováním skriptů. Část obsahu z odkazu pro reference uživatele, jak je uvedeno níže.

&& AND

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.
30
Tim Kennedy

Ze svých zkušeností používám && a || pro zmenšení příkazu if na jediný řádek.

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

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

Těchto 6 řádků lze zredukovat na jeden řádek:

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

Při spuštění několika iterací pro nastavení proměnných nebo pro vytváření souborů atd. Je život jednodušší a skript vypadá úhledně s použitím jediného řádku, pokud je funkce, je to pouze nevýhoda, že je obtížnější implementovat více příkazů z jedné iterace. můžete využít funkcí.

13
syme89

Existuje pojem „zkrácení“.

Když (expr1 && expr2) vyhodnoceno - expr2 je vyhodnoceno, pouze pokud exp1 vyhodnocuje jako „true“. Je to proto, že obě expr1 A expr2 musí platit pro (expr1 && expr2) aby to byla pravda. Pokud expr1 vyhodnoceno jako „false“ expr2 NENÍ hodnoceno (zkratka), protože (expr1 && expr2) je již „falešný“.

Zkuste následující - předpokládejme soubor F1 existuje a 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áceno.

4
Larry