El operador && ejecuta el siguiente comando si el comando anterior tuvo una ejecución exitosa (código de salida devuelto ($?) 0 = lógico verdadero).
En el formulario A && B || C
, se evalúa el comando (o condición) A y si A devuelve verdadero (éxito, código de salida 0), se ejecuta el comando B. Si A falla (por lo tanto devolverá falso - el código de salida es diferente a 0) y / o B falla (devolver falso ), entonces se ejecutará el comando C.
También el &&
operador se utiliza como AND en las comprobaciones de condición y el operador ||
funciona como OR en las comprobaciones de condición.
Dependiendo de lo que desee hacer con su script, el formulario A && B || C
puede usarse para verificaciones de condición como su ejemplo o puede usarse para encadenar comandos y garantizar una serie de comandos que se ejecutarán si los comandos anteriores tuvieron un código de salida 0 exitoso .
Por esta razón, es común ver comandos como:
do_something && do_something_else_that_depended_on_something
.
Ejemplos:
apt-get update && apt-get upgrade
si la actualización falla, la actualización no se ejecuta (tiene sentido en el mundo real ...).
mkdir test && echo "Something" > test/file
La parte echo "Something"
se ejecutará solo si mkdir test
fue exitosa y la operación devolvió el código de salida 0 .
./configure --prefix=/usr && make && sudo make install
Generalmente se encuentra en la compilación de trabajos para encadenar los comandos dependientes necesarios.
Si intenta implementar "cadenas" anteriores con if , entonces , de lo contrario , necesitará muchos más comandos y comprobaciones (y, por lo tanto, más código para escribir, más cosas que saldrán mal) para una tarea simple.
Además, tenga en cuenta que los comandos encadenados con && y || son leídos por shell de izquierda a derecha. Es posible que deba agrupar comandos y verificaciones de condición con corchetes para depender del siguiente paso en la salida exitosa de algunos comandos anteriores. Por ejemplo, mira esto:
root@debian:$ true || true && false;echo $?
1
#read from left to right
#true OR true=true AND false = false = exit code 1=not success
root@debian:$ true || (true && false);echo $?
0
# true OR (true AND false)=true OR false = true = exit code 0 = success
O un ejemplo de la vida real:
root@debian:$ a=1;b=1;c=1;[[ $a -eq 1 ]] || [[ $b -eq 1 ]] && [[ $c -eq 2 ]];echo $?
1
#condition $a = true OR condition b = true AND condition $c = false
#=> yields false as read from left to right, thus exit code=1 = not ok
root@debian:$ a=1;b=1;c=1;[[ $a -eq 1 ]] || [[ $b -eq 1 && $c -eq 2 ]];echo $?
0
#vars b and c are checked in a group which returns false,
#condition check of var a returns true, thus true OR false yields true = exit code 0
Tenga en cuenta que algunos comandos devuelven diferentes códigos de salida según el proceso ejecutado, o devuelven diferentes códigos según sus acciones (por ejemplo, el comando GNU diff
, devuelve 1 si dos archivos difieren y 0 si no lo hacen). Dichos comandos deben tratarse con cuidado en && y || .
También solo para tener todo el rompecabezas juntos, tenga en cuenta la concatenación de comandos utilizando el ;
operador. Con un formato, A;B;C
todos los comandos se ejecutarán en serie sin importar cuál fue el código de comando de salida A
y B
.