bash - Verdadeiro se o comprimento da string for (não) zero?

2
# touch $$
# gzip $$
# gzip --test $$.gz
# echo $?
0
# OUT=$(gzip --test $$.gz)
# echo $OUT

# if [ -z $OUT ] ; then echo $$ ; fi
26521
# if [ -n $OUT ] ; then echo $$ ; fi
26521
# 

de bash(1)

   -z string
          True if the length of string is zero.
   string
   -n string
          True if the length of string is non-zero.

Estou confuso, como é zero e diferente de zero ao mesmo tempo? Como se checa se a chave tem um valor (usando bash )?

    
por alexus 23.05.2018 / 04:50

2 respostas

8

[ .. ] segue as mesmas regras que todos os outros comandos, ou seja, Divisão de palavras . Se OUT estiver vazio (ou não definido), $OUT será expandido para nada, nem mesmo um argumento vazio.

Então, [ -n $OUT ] expande para [ , -n e ] e [ testa se -n não é uma string vazia. É, então o teste retorna verdadeiro.

Você precisa citar $OUT , como em quase todo lugar:

if [ -n "$OUT" ]; then ...

Veja: Quando é necessário fazer uma cotação dupla? e Testes e condicionais no BashGuide.

    
por 23.05.2018 / 05:01
1

O comando

[ -z $OUT ]

é exatamente equivalente a

test -z $OUT

que, se $OUT estiver vazio, é o mesmo que

test -z

O comportamento de test depende do número de parâmetros dados no comando linha. Se for dado apenas um único parâmetro, como em test -n ou test -z , o resultado será "true" se o comprimento desse parâmetro, quando interpretado como uma string, for diferente de zero.

Isso significa que se $OUT estiver vazio e sem aspas, então test -z $OUT e test -n $OUT serão ambos verdadeiros porque -z e -n são sequências de comprimento diferente de zero.

Para corrigir isso, aspas duplas da expansão da variável:

[ -n "$OUT" ]

Veja também

por 03.06.2018 / 16:28