O operador && executa o próximo comando se o comando anterior teve uma execução bem-sucedida (código de saída retornado ($?) 0 = true lógico).
No formulário A && B || C
, o comando (ou condição) A é avaliado e, se A retornar verdadeiro (êxito, código de saída 0), o comando B será executado. Se A falhar (retornará um código de saída falso diferente de 0) e / ou B falhar (retornar falso ), o comando C será executado.
Além disso, o &&
operador é usado como um E nas verificações de condição e o operador ||
trabalha como OU nas verificações de condição.
Dependendo do que você deseja fazer com seu script, o formulário A && B || C
pode ser usado para verificações de condições como o seu exemplo ou para encadear comandos e garantir que uma série de comandos seja executada se os comandos anteriores tiverem um código de saída 0 bem-sucedido .
É por isso que é comum ver comandos como:
do_something && do_something_else_that_depended_on_something
.
Exemplos:
apt-get update && apt-get upgrade
se a atualização falhar, a atualização não será executada (faz sentido no mundo real ...).
mkdir test && echo "Something" > test/file
A peça echo "Something"
será executada apenas se mkdir test
for bem-sucedida e a operação retornar o código de saída 0 .
./configure --prefix=/usr && make && sudo make install
Geralmente encontrado na compilação de tarefas para encadear comandos dependentes necessários.
Se você tentar implementar as "cadeias" acima com o if - then - else , precisará de muito mais comandos e verificações (e, portanto, mais código para escrever - mais coisas dar errado) para uma tarefa simples.
Além disso, lembre-se de que comandos encadeados com && e || são lidos pelo shell da esquerda para a direita. Pode ser necessário agrupar comandos e verificações de condição com colchetes para depender da próxima etapa da saída bem-sucedida de alguns comandos anteriores. Por exemplo, veja isto:
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
Ou um exemplo da 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
Lembre-se de que alguns comandos retornam códigos de saída diferentes, dependendo do processo executado, ou retornam códigos diferentes, dependendo de suas ações (por exemplo, comando GNU diff
, retorna 1 se dois arquivos diferem e 0 se não). Tais comandos precisam ser tratados com cuidado em && e || .
Além disso, apenas para ter todo o quebra-cabeça em conjunto, lembre-se da concatenação de comandos usando o ;
operador. Com um formato, A;B;C
todos os comandos serão executados em série, independentemente do código de comando A
e de saída B
.