Shell lógico não

4

o que é preferido entre

if ! [ ... ]; then

e

if [ ! ... ]; then

na verdade eles fazem o mesmo resultado, existe uma sintaxe preferida? na antiga sintaxe, o não avaliado é o shell embutido, enquanto no segundo o não é o test , faz alguma diferença?

    
por Matteo Croce 05.10.2016 / 15:33

2 respostas

4

Há uma consideração de portabilidade.

A palavra-chave ! é POSIX, mas não Bourne, enquanto ! foi suportada pelo comando [ / test desde o início.

Portanto, [ ! ... ] é mais portável do que ! [ ... ] .

Caso contrário, desde que você não use os operadores binários -o e -a , eles devem ser equivalentes (se deixarmos de lado os erros de análise em algumas implementações de teste antigas).

Na verdade, no shell Bourne, fazer

if ! cmd1; then
  cmd2
fi

Você tinha que fazer:

if cmd1; then
  :
else
  cmd2
fi

(ou use cmd1 || cmd2 , embora isso possa resultar em um status de saída diferente no final).

    
por 05.10.2016 / 16:50
0

[ … ] é igual a test … , portanto, ! [ … ] é igual a ! test … . Isso significa que você nega o resultado do comando test . Nesse caso, ! é um comando shell.

De info bash , por ex. na seção «gasodutos»:

If the reserved word '!' precedes the pipeline, the exit status is the logical negation of the exit status as described above.

Por outro lado, [ ! … ] significa test ! … . Isso significa que você nega uma expressão dentro do teste. Veja ! em man test :

   ! EXPRESSION
          EXPRESSION is false

Portanto, pode ter um significado diferente. Se você tiver expressões complexas, a negação só pode se aplicar a uma parte.

Cabe a você, o que você prefere.

    
por 05.10.2016 / 16:17

Tags