Você sempre pode mostrar os efeitos da cotação variável com printf
.
Divisão de palavras feita em var1
:
$ var1="hello world"
$ printf '[%s]\n' $var1
[hello]
[world]
var1
citado, portanto, nenhuma divisão de palavras:
$ printf '[%s]\n' "$var1"
[hello world]
Palavra dividida por var1
dentro $()
, equivalente a echo "hello" "world"
:
$ var2=$(echo $var1)
$ printf '[%s]\n' "$var2"
[hello world]
Não há divisão de palavras var1
, não há problema em não citar o $()
:
$ var2=$(echo "$var1")
$ printf '[%s]\n' "$var2"
[hello world]
Palavra dividida var1
novamente:
$ var2="$(echo $var1)"
$ printf '[%s]\n' "$var2"
[hello world]
Citando as duas, a maneira mais fácil de ter certeza.
$ var2="$(echo "$var1")"
$ printf '[%s]\n' "$var2"
[hello world]
Problema de globbing
Não citar uma variável também pode levar à expansão global de seu conteúdo:
$ mkdir test; cd test; touch file1 file2
$ var="*"
$ printf '[%s]\n' $var
[file1]
[file2]
$ printf '[%s]\n' "$var"
[*]
Observe que isso acontece depois que a variável é expandida apenas. Não é necessário citar um globo durante a atribuição:
$ var=*
$ printf '[%s]\n' $var
[file1]
[file2]
$ printf '[%s]\n' "$var"
[*]
Use set -f
para desativar esse comportamento:
$ set -f
$ var=*
$ printf '[%s]\n' $var
[*]
E set +f
para reativá-lo:
$ set +f
$ printf '[%s]\n' $var
[file1]
[file2]