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