Atualizar : adicionei como script para destacar algumas das possíveis armadilhas:
Porque ninguém mais mencionou "||", eu irei
Update2 : algumas reformulações importantes aqui
& & é como um "então" de uma declaração "if" que responde a "true"
|| é NÃO como o "else" de uma declaração "if" ..
|| é como um "então" de uma declaração "if" que responde a "false"
Mais especificamente, & & testa o $? valor de retorno da instrução anterior executada mais recentemente e passa o controle para a instrução ou sub-shell imediatamente após o & ... ela só passa o controle se $? é verdade.
|| é semelhante e costuma ser visto após um & & statement, mas testa para um valor de retorno false ($?) da declaração anterior executada mais recentemente ... NB! , Nota Bene! Note bem! .... se a declaração precedente for um & & declaração que retrocede falso quando você espera que seja verdade, então || irá responder ao falso, então misturar ambos na mesma linha pode ser arriscado
O ponto principal que estou tentando fazer é em relação a um erro que cometi. ie:
## [[condition]] & & A || B
é não não se comporta como um ternário de estilo C / C ++. ie:
// (condição)? A: B
Veja o script abaixo para exemplos de resultados "inesperados" de "A"
O teste básico e o & & e o || declaração deve estar na mesma linha ...
Execute este script para ver onde as coisas podem dar errado ao usar & & e ||
A declaração executada mais recentemente pode não ser a que você espera.
[[condição]] & & eco Olá || eco Goodbye .... é tipicamente seguro,
porque um eco bem formado retornará verdadeiro.
mas que tal acessar um arquivo que não sai?
#!/bin/bash
#
# "as expected" return codes" means: expected to behave like a normal AND / OR contition test
#
if [[ "$1" != "" ]] ; then exit $1; fi # recursive call to return an arbitary $? value (decimal)
echo
echo 'test 1: All return codes are "as expected"'
echo ======
((1==1)) && echo " ((1==1)) rc=$? ..&&.. condition is true" || echo " ((1==1)) rc=$? ..||.. condition is false"
$0 0 && echo " \#!/bin/bash
#
# "as expected" return codes" means: expected to behave like a normal AND / OR contition test
#
if [[ "$1" != "" ]] ; then exit $1; fi # recursive call to return an arbitary $? value (decimal)
echo
echo 'test 1: All return codes are "as expected"'
echo ======
((1==1)) && echo " ((1==1)) rc=$? ..&&.. condition is true" || echo " ((1==1)) rc=$? ..||.. condition is false"
$0 0 && echo " \%pre% 0 rc=$? ..&&.. condition is true" || echo " \%pre% 0 rc=$? ..||.. condition is false"
((1!=1)) && echo " ((1!=1)) rc=$? ..&&.. condition is true" || echo " ((1!=1)) rc=$? ..||.. condition is false"
$0 1 && echo " \%pre% 1 rc=$? ..&&.. condition is true" || echo " \%pre% 1 rc=$? ..||.. condition is false"
echo
echo 'test 2: Now throw in some "unexpected" errors into the first of the &&/|| pair'
echo ======
((1==1)) && (echo " ((1==1)) rc=$? ..&&.. condition is true"; $0 1) || echo " ((1==1)) rc=$? ..||.. condition is false"
$0 0 && (echo " \%pre% 0 rc=$? ..&&.. condition is true"; $0 2) || echo " \%pre% 0 rc=$? ..||.. condition is false"
((1!=1)) && (echo " ((1!=1)) rc=$? ..&&.. condition is true"; $0 3) || echo " ((1!=1)) rc=$? ..||.. condition is false"
$0 1 && (echo " \%pre% 1 rc=$? ..&&.. condition is true"; $0 4) || echo " \%pre% 1 rc=$? ..||.. condition is false"
echo
echo 'test 3: Now swap the order of && and || statements, using "as expected" return codes'
echo ======
((1==1)) || echo " ((1==1)) rc=$? ..||.. condition is true" && echo " ((1==1)) rc=$? ..&&.. condition is false"
$0 0 || echo " \%pre% 0 rc=$? ..||.. condition is true" && echo " \%pre% 0 rc=$? ..&&.. condition is false"
((1!=1)) || echo " ((1!=1)) rc=$? ..||.. condition is true" && echo " ((1!=1)) rc=$? ..&&.. condition is false"
$0 1 || echo " \%pre% 1 rc=$? ..||.. condition is true" && echo " \%pre% 1 rc=$? ..&&.. condition is false"
echo
echo 'test 4: With the order of && and || statements still swapped, introduce "unexpected" errors into the first of the &&/|| pair'
echo ======
((1==1)) && (echo " ((1==1)) rc=$? ..&&.. condition is true"; $0 1) || echo " ((1==1)) rc=$? ..||.. condition is false"
$0 0 && (echo " \%pre% 0 rc=$? ..&&.. condition is true"; $0 2) || echo " \%pre% 0 rc=$? ..||.. condition is false"
((1!=1)) && (echo " ((1!=1)) rc=$? ..&&.. condition is true"; $0 3) || echo " ((1!=1)) rc=$? ..||.. condition is false"
$0 1 && (echo " \%pre% 1 rc=$? ..&&.. condition is true"; $0 4) || echo " \%pre% 1 rc=$? ..||.. condition is false"
exit
0 rc=$? ..&&.. condition is true" || echo " \%pre% 0 rc=$? ..||.. condition is false"
((1!=1)) && echo " ((1!=1)) rc=$? ..&&.. condition is true" || echo " ((1!=1)) rc=$? ..||.. condition is false"
$0 1 && echo " \%pre% 1 rc=$? ..&&.. condition is true" || echo " \%pre% 1 rc=$? ..||.. condition is false"
echo
echo 'test 2: Now throw in some "unexpected" errors into the first of the &&/|| pair'
echo ======
((1==1)) && (echo " ((1==1)) rc=$? ..&&.. condition is true"; $0 1) || echo " ((1==1)) rc=$? ..||.. condition is false"
$0 0 && (echo " \%pre% 0 rc=$? ..&&.. condition is true"; $0 2) || echo " \%pre% 0 rc=$? ..||.. condition is false"
((1!=1)) && (echo " ((1!=1)) rc=$? ..&&.. condition is true"; $0 3) || echo " ((1!=1)) rc=$? ..||.. condition is false"
$0 1 && (echo " \%pre% 1 rc=$? ..&&.. condition is true"; $0 4) || echo " \%pre% 1 rc=$? ..||.. condition is false"
echo
echo 'test 3: Now swap the order of && and || statements, using "as expected" return codes'
echo ======
((1==1)) || echo " ((1==1)) rc=$? ..||.. condition is true" && echo " ((1==1)) rc=$? ..&&.. condition is false"
$0 0 || echo " \%pre% 0 rc=$? ..||.. condition is true" && echo " \%pre% 0 rc=$? ..&&.. condition is false"
((1!=1)) || echo " ((1!=1)) rc=$? ..||.. condition is true" && echo " ((1!=1)) rc=$? ..&&.. condition is false"
$0 1 || echo " \%pre% 1 rc=$? ..||.. condition is true" && echo " \%pre% 1 rc=$? ..&&.. condition is false"
echo
echo 'test 4: With the order of && and || statements still swapped, introduce "unexpected" errors into the first of the &&/|| pair'
echo ======
((1==1)) && (echo " ((1==1)) rc=$? ..&&.. condition is true"; $0 1) || echo " ((1==1)) rc=$? ..||.. condition is false"
$0 0 && (echo " \%pre% 0 rc=$? ..&&.. condition is true"; $0 2) || echo " \%pre% 0 rc=$? ..||.. condition is false"
((1!=1)) && (echo " ((1!=1)) rc=$? ..&&.. condition is true"; $0 3) || echo " ((1!=1)) rc=$? ..||.. condition is false"
$0 1 && (echo " \%pre% 1 rc=$? ..&&.. condition is true"; $0 4) || echo " \%pre% 1 rc=$? ..||.. condition is false"
exit