Teste -n dá resultado inesperado

6

Eu entendo test -n <expression> para retornar false se a expressão for avaliada como um tamanho de string maior que 0. Por que então ocorre o seguinte?

Macbook:~ echo ${#undeclared_variable}
0
Macbook:~ test -n $undeclared_variable && echo Foo
Foo

Bash 4.x

Minha expectativa é que, como test -n $undeclared_variable deve avaliar false, esse Foo não deve ser ecoado. Se eu usar [[ ]] em vez de testar, funcionará como esperado.

    
por Gregg Leventhal 06.07.2014 / 21:07

1 resposta

12

Você precisa citar suas variáveis. Sem aspas, você está escrevendo test -n em vez de test -n <expression> . O comando test não tem idéia de que você forneceu uma variável que foi expandida para nada.

Na sintaxe shell, $VARIABLE fora das aspas duplas é o operador “split + glob”: o valor da variável é dividido em uma lista de palavras delimitadas por espaços em branco, e cada palavra é interpretada como um padrão curinga e substituída pelos nomes dos arquivos correspondentes (ou deixados sozinhos se não houver nenhum arquivo correspondente). Se o valor da variável estiver vazio, a lista de palavras após a divisão é uma lista vazia. Para obter o valor da variável sem processamento adicional, a expansão da variável precisa estar entre aspas duplas.

O motivo [[ funciona porque é uma sintaxe especial bash e não um comando; nessa sintaxe especial, $VARIABLE significa "valor de VARIABLE " (exceto no lado direito dos operadores de correspondência de padrão = , == , != e =~ ). Usar [ funcionaria da mesma forma que test . O que se segue faz o que você quer:

test -n "$undeclared_variable" && echo "Foo"
    
por 06.07.2014 / 21:26