Existe uma diferença no bash ou um uso preferido de negação de uma declaração?
if ! [[ -z "${var}" ]]; then
do_something
fi
Contra
if [[ ! -z "${var}" ]]; then
do_something
fi
Existe uma diferença no bash ou um uso preferido de negação de uma declaração?
if ! [[ -z "${var}" ]]; then
do_something
fi
Contra
if [[ ! -z "${var}" ]]; then
do_something
fi
Isso será verdadeiro se todo o teste retornar falso
Isso será verdadeiro se a expressão individual retornar falso.
Como o teste pode ser uma expressão composta, isso pode ser muito diferente. Por exemplo:
Pessoalmente, prefiro usar a negação dentro da construção de teste, quando aplicável, mas está perfeitamente bem fora, dependendo da sua intenção.
A
! cmd
é na verdade um pipe e!
nega o código de saída de todo o pipe.Do man bash:
Nesse sentido, um:
É a negação (
!
) do código de saída do todo[[
(uma vez que todo ele foi executado). Assim, isso tem um código de saída de 0:No entanto
A
[[ ! ]]
é um comando composto (não um pipe). Do man bash:Portanto, isso tem um código de saída de 1:
Porque isso é realmente equivalente a isso:
Que, por avaliação de curto-circuito, o lado direito do
&&
nunca é avaliado e é na verdade equivalente a esta expressão muito mais curta:Que sempre será falso (1).
Resumindo: dentro
[[
do , o ! afeta partes da expressão.Preferido
Usar o
!
interior[[
é muito mais comum (e portátil para mais shells (com[
)), mas às vezes pode ser confuso se não for explicitamente controlado pelo uso criterioso de()
para delimitar a extensão da negação (o que pode se tornar um problema dentro de[
construções).Mas (em bash, ksh e zsh) o resultado de
! [[
é bem definido e mais fácil de entender: execute o todo[[
e negue o resultado.Qual deve ser usado é uma questão de preferência pessoal (e compreensão).