¿Cuáles son las ventajas y desventajas de usar && o || versus si / elif / else?

0

En bash, puedo hacer que una condición de prueba utilice && y / o || en lugar de un bloque if / elif / else.

Cuando corresponde, yo uso tienden a usar && y / o || en lugar de construir un bloque if. ¿Hay alguna ventaja en el mundo real para una construcción sobre la otra?

Considere los siguientes ejemplos:

1)

[[ -f /shared_disk/backups/daily.tar.bz2 ]] && echo "the coast is clear" || echo "run the dump"

2)

if [[ -f /shared_disk/backups/daily.tar.bz2 ]]; then
    echo "the coast is clear"
else
    echo "run the dump"
fi
derek_jenkins
fuente

Respuestas:

5

Las dos formas que presentas no son exactamente iguales.

En la forma: A && B || C, Cserá ejecutado si cualquiera Ao Bevalúan como falso.

Por ejemplo:

$ true && true || echo C
$ true && false || echo C
C
$

Esto ofrece una ventaja real del if-then-elseformulario sobre el A && B || Cformulario y es la claridad. Es más claro lo que if-then-elseestá haciendo el formulario, pero debe comprender las reglas de evaluación para comprender lo que A && B || Cestá haciendo el formulario.

Sin embargo, a menudo puede ser beneficioso usar A && Bo A || B. Eso es más claro y puede ser útil cuando se ejecutan comandos simples. A veces, una línea en lugar de tres es más clara, especialmente cuando intentas asimilar una gran cantidad de código.

camh
fuente
44
OMI lo más confusa acerca del uso && ||en lugar de if then elsees que puede ejecutar tanto el comando entonces-como y el comando cosa similar (si el primer comando se ejecuta correctamente y la segunda falla). Realmente no esperas que un echocomando falle, pero puede suceder, y será realmente muy confuso si alguna vez lo hace. Una if then elsedeclaración adecuada ejecuta los thencomandos o los elsecomandos, nunca ambos.
Gordon Davisson
@GordonDavisson: ¿Por qué no publicas eso como respuesta?
Scott
@Scott: Considero que la respuesta de Camh es completamente correcta, solo estoy señalando una consecuencia particularmente preocupante.
Gordon Davisson