Operadores booleanos Unix ( & & & , - a,|/, - o)
&&
, ||
, -a
, e -o
operadores Unix?
quais são as restrições ao uso de ambos os tipos?
é simplesmente que os operadores &&
e ||
devem ser usados ao usar bandeiras na condição?
como em:
[ "$1" = "yes" ] && [ -r $2.txt ]
Versus:
[ "$1" = "yes" -a $2 -lt 3 ]
2 answers
Regra geral: usar -a
e -o
dentro de parêntesis rectos, &&
e ||
fora.
É importante compreender a diferença entre a sintaxe shell e a sintaxe da [
comando .
&&
e {[3] } são operadores de fachada. Eles são usados para combinar os resultados de dois comandos. Porque são sintaxe de shell, eles têm significado sintático especial e não podem ser usados como argumentos para comando.[
não é uma sintaxe especial. Na verdade, é um comando com o nome[
, também conhecido comotest
. Uma vez que[
é apenas um comando regular, ele usa-a
e-o
para os seus e e ou operadores. Não pode usar&&
e||
porque são sintaxe de shell que os comandos não conseguem ver.
[[ ]]
. Se você usar parêntesis rectos duplos, você tem acesso a coisas como regexes e wildcards. Você também pode usar operadores de shell como &&
, ||
, <
, e >
livremente dentro dos parêntesis porque, ao contrário de [
, a forma double bracketed é sintaxe especial da shell. Bash parses [[
para que possas escrever coisas como [[ $foo == 5 && $bar == 6 ]]
.
- a e-o são os mais antigos e/ou operadores para o comando de teste. && e / / são e / ou operadores para a shell. Então (assumindo uma concha antiga) no seu primeiro caso,
[ "$1" = 'yes' ] && [ -r $2.txt ]
A shell está a avaliar a condição e o estado. No seu segundo caso,
[ "$1" = 'yes' -a $2 -lt 3 ]
O comando de teste (ou teste de builtin) está a avaliar a e condição.
É claro que em todas as conchas modernas ou semi-modernas, o comando de teste é construído dentro da concha, então não há realmente nenhuma ou muita diferença. Na moderna shells, a declaração if pode ser escrita:[[ $1 == yes && -r $2.txt ]]
Que é mais semelhante às linguagens de programação modernas e, portanto, é mais legível.