Siempre puede mostrar los efectos de las comillas variables con printf
.
División de palabras realizada en var1
:
$ var1="hello world"
$ printf '[%s]\n' $var1
[hello]
[world]
var1
citado, por lo que no hay división de palabras:
$ printf '[%s]\n' "$var1"
[hello world]
Palabra dividida en el var1
interior $()
, equivalente a echo "hello" "world"
:
$ var2=$(echo $var1)
$ printf '[%s]\n' "$var2"
[hello world]
No hay división de palabras var1
, no hay problema con no citar el $()
:
$ var2=$(echo "$var1")
$ printf '[%s]\n' "$var2"
[hello world]
Palabra dividida de var1
nuevo:
$ var2="$(echo $var1)"
$ printf '[%s]\n' "$var2"
[hello world]
Citando a ambos, la forma más fácil de estar seguro.
$ var2="$(echo "$var1")"
$ printf '[%s]\n' "$var2"
[hello world]
Problema global
No citar una variable también puede conducir a una expansión global de su contenido:
$ mkdir test; cd test; touch file1 file2
$ var="*"
$ printf '[%s]\n' $var
[file1]
[file2]
$ printf '[%s]\n' "$var"
[*]
Tenga en cuenta que esto sucede después de que la variable se expande solo. No es necesario citar un glob durante la asignación:
$ var=*
$ printf '[%s]\n' $var
[file1]
[file2]
$ printf '[%s]\n' "$var"
[*]
Use set -f
para deshabilitar este comportamiento:
$ set -f
$ var=*
$ printf '[%s]\n' $var
[*]
Y set +f
para volver a habilitarlo:
$ set +f
$ printf '[%s]\n' $var
[file1]
[file2]