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 retorna verdadeiro (sucesso, código de saída 0) então o comando B é executado.
Se A falhar (assim retornará false - código de saída diferente de 0) e / ou B falhará (retornando false ) então o comando C será executado.
O operador &&
também é usado como AND nas verificações de condição e o operador ||
funciona como OR 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ção como seu exemplo ou pode ser usado para encadear comandos e garantir que uma série de comandos seja executada se os comandos anteriores tiverem uma saída bem-sucedida código 0 .
É 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 parte echo "Something"
será executada apenas se mkdir test
tiver êxito e a operação tiver retornado 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 juntos.
Se você tentar implementar "chains" acima com if - então - else você precisará de muito mais comandos e verificações (e assim mais código para escrever - mais coisas para 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 diferirem e 0 se não o fizerem). Tais comandos precisam ser tratados com cuidado em & & e || .
Além disso, apenas para ter todo o quebra-cabeça, 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 saída do comando A
e B
.