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.