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