Por que [[-n $ var]] em vez de [[$ var]]?

7

Em esta resposta eu tinha um código que dizia:

if [[ $ZSH_VERSION ]]; then

Esta foi editada :

if [[ -n $ZSH_VERSION ]]; then

Atualização: Acabei de ver o comentário de edição:

[[ x ]] didn't work until recently in zsh

Analisei as zsh notas da versão e não consegui encontrar referência para isso.

Qual zsh versão permitiu primeiro [[ x ]] ?

    
por Tom Hale 03.09.2018 / 15:52

2 respostas

9

Dos documentos zsh 5.5.1 para CONDITIONAL EXPRESSIONS

For compatibility, if there is a single argument that is not syntactically significant, typically a variable, the condition is treated as a test for whether the expression expands as a string of non-zero length. In other words, [[ $var ]] is the same as [[ -n $var ]]. It is recommended that the second, explicit, form be used where possible.

Com a árvore de origem,

% grep -rl 'if there is a single argument' .
./Doc/Zsh/cond.yo
% git blame ./Doc/Zsh/cond.yo | grep 'if there is a single argument'
d082827c83 (Jun T             2014-05-18 22:03:35 +0900 198) For compat...

A inspeção de git log mostra que a alteração do código ocorreu um pouco antes da documentação:

commit 9d47e8398d299e53ffe4e7ddf3731d2fedae9948
...
Date:   Tue May 13 08:16:50 2014 -0700

    32609: [[ $var ]] behaves as [[ -n $var ]] for bash/ksh compatibility

O mapeamento do arquivo ChangeLog para git tag não está claro para mim, mas aparece zsh 5.0.6 (qui 28 de agosto 19:07:04 2014 +0100) é a primeira versão com essa alteração .

    
por 03.09.2018 / 16:26
1

É mais explícito mostrar o que o código está fazendo.

Pessoalmente, neste caso eu prefiro um pouco [[ -n $ZSH_VERSION ]] porque mostra que está testando o não-esvaziamento do valor do var.

Mas muitas vezes tenho vars significados para o significado booleano em meus scripts e nomeio-os de acordo, como is_logged_in ou running_in_background . Se essas variáveis não estiverem definidas em meus scripts, elas serão false . E nesses casos eu prefiro usar [[ running_in_background ]] , só porque isso é melhor sem a parte -n , como uma frase normal:

if [[ running_in_background ]] ; then
    echo "something" | logger -t myprog
fi

Mas IMO é apenas uma questão de gosto e, como tal, não deveria ter sido editada: é o seu código

.     
por 03.09.2018 / 16:05

Tags