A string nula e “” a mesma string?

4

O manual do Bash diz:

A parameter is set if it has been assigned a value. The null string is a valid value.

...

If value is not given, the variable is assigned the null string.

A string nula é igual a "" ?

Os comprimentos são iguais a zero? Ambos podem ser testados por expressões condicionais -z ou -n , que testa se o comprimento de uma string é zero ou diferente de zero?

    
por Tim 01.05.2016 / 20:41

2 respostas

6

Sim. Usando o teste de esta resposta :

$ [ -n "${a+1}" ] && echo "defined" || echo "not defined"
not defined
$ a=""
$ [ -n "${a+1}" ] && echo "defined" || echo "not defined"
defined
$ b=
$ [ -n "${b+1}" ] && echo "defined" || echo "not defined"
defined

Portanto, definir a variável como "" é o mesmo que defini-la como valor vazio. Portanto, valor vazio e "" são os mesmos.

    
por 01.05.2016 / 20:48
5

Sim, uma cadeia nula nesse contexto é uma cadeia de comprimento 0 que não contém nenhum byte. Em bash :

var=
var=''
var=""
var=$''
var=$""
var=$(true) # or any command that outputs nothing or only newline
            # characters
var='true'
var=${null_or_unset_var}
var=''""$''$""$(true)"'true'"

Mas também em bash , como um efeito colateral de bash (ao contrário de zsh ) não suportando bytes NUL em suas variáveis (já que usa strings C delimitadas por NUL internamente):

var=$'
var=
var=''
var=""
var=$''
var=$""
var=$(true) # or any command that outputs nothing or only newline
            # characters
var='true'
var=${null_or_unset_var}
var=''""$''$""$(true)"'true'"
' var=$'\u0000' var=$'\c@' var=$'\x00' var=$'
var=$'%pre%'
var=$'\u0000'
var=$'\c@'
var=$'\x00'
var=$'%pre%%pre%%pre%%pre%%pre%'
%pre%%pre%%pre%%pre%'

Em todos esses casos, $var será definido, mas não conterá nada (a string nula). echo "${#var}" produzirá 0 , [ -z "$var" ] retornará true e printf %s "$var" não produzirá nada.

Após unset var (mas cuidado com o bug / má qualidade de bash , mksh e yash onde unset pode revelar uma versão de $var de um escopo externo em vez de desatá-lo se você fazendo isso de uma função chamada de outra função que tinha declarado a variável local ), $var não tem valor, nulo ou não.

No entanto, $var ainda se expande para nada (para a cadeia nula), a menos que a opção nounset esteja ativada. Existem outras diferenças entre variáveis não definidas e variáveis com um valor vazio:

  • ${var?} dispara um erro quando $var não está definido
  • ${var+x} expande para x se $var tiver qualquer valor (mesmo nulo)
  • ${var-x} se expande para x se $var não estiver definido
  • [[ -v var ]] retorna falso se $var não estiver definido
  • se a variável estiver marcada para export , então var= será passado no ambiente de cada comando se estiver definido ou não for passado de outra forma.
por 24.07.2017 / 18:05

Tags