Operadores booleanos Unix ( & & & , - a,|/, - o)

Alguém pode explicar a diferença entre 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 ]
Author: Benjamin W., 2013-12-08

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 como test. 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.

Mas espera! Bash tem uma sintaxe de teste mais sofisticada na forma de [[ ]]. 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 ]].
 107
Author: John Kugelman, 2013-12-08 04:07:55

- 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.

 12
Author: Brad Lanam, 2016-09-16 21:02:14