2010-10-18 8 views

Respuesta

2

Advanced Bash-Scripting Guide: Chapter 5: Quoting

Al hacer referencia a una variable, es general es aconsejable incluir su nombre entre comillas dobles. Esto evita la reinterpretación de de todos los caracteres especiales dentro de la cadena entre comillas. Utilice comillas dobles para evitar la división de la palabra . Un argumento incluido en comillas dobles se presenta como una sola palabra , incluso si contiene separadores de espacios en blanco.

+2

Este es un buen consejo en general, pero en el caso específico que menciona el OP, la cita no sirve para nada. – user000001

+0

De hecho, este es en general un buen consejo (y eso es casi sorprendente viniendo del ABS, ya que tiene una tendencia a hacer sugerencias poco buenas e ignorar las buenas prácticas) pero no es relevante para la pregunta que se hace. –

+0

¿Qué guía recomendarías? –

4

Creo que no hay gran diferencia aquí. Sí, es aconsejable incluir una variable entre comillas dobles cuando se hace referencia a esa variable. Sin embargo, no parece que se haga referencia aquí al $x en su pregunta.

y=$x por sí solo no afecta cómo se manejarán los espacios en blanco. Solo cuando se usa $y, la cita es importante. Por ejemplo:

$ x=" a b " 
$ y=$x 
$ echo $y 
a b 
$ echo "$y" 
a b 
4

No existen (buenas) razones para duplicar las comillas del RHS de una asignación de variable cuando se utiliza como una declaración por sí mismo.

La RHS de una declaración de asignación no está sujeta a división de palabras (o expansión de llave), etc. por lo que no puede necesitar citas para asignar correctamente. Todas las demás expansiones (hasta donde yo sé) ocurren en el RHS pero también aparecen entre comillas dobles, por lo que las citas no sirven para nada.

Dicho esto, hay motivos no para citar el RHS. A saber, how to address error "bash: !d': event not found" in Bash command substitution (específicamente vea mi respuesta y la respuesta de rici).

2

Éstos son algunos otros ejemplos: (tener dos archivos en el directorio actual t.sh y file)

a='$(ls)'  # no command substitution 
b="$(ls)"  # command substitution, no word splitting 
c='*'   # no filename expansion 
d="*"   # no filename expansion 
e=*    # no filename expansion 
f=$a    # no expansions or splittings 
g="$a"   # no expansions or splittings 
h=$d    # no expansions or splittings 

echo ---'$a'--- 
echo $a   # no command substitution 
echo ---'$b'--- 
echo $b   # word splitting 
echo ---'"$b"'--- 
echo "$b"  # no word splitting 
echo ---'$c'--- 
echo $c   # filename expansion, word splitting 
echo ---'"$c"'--- 
echo "$c"  # no filename expansion, no word splitting 
echo ---'$d'--- 
echo $d   # filename expansion, word splitting 
echo ---'"$d"'--- 
echo "$d"  # no filename expansion, no word splitting 
echo ---'"$e"'--- 
echo "$e"  # no filename expansion, no word splitting 
echo ---'$e'--- 
echo $e   # filename expansion, word splitting 
echo ---'"$f"'--- 
echo "$f"  # no filename expansion, no word splitting 
echo ---'"$g"'--- 
echo "$g"  # no filename expansion, no word splitting 
echo ---'$h'--- 
echo $h   # filename expansion, word splitting 
echo ---'"$h"'--- 
echo "$h"  # no filename expansion, no word splitting 

Salida:

---$a--- 
$(ls) 
---$b--- 
file t.sh 
---"$b"--- 
file 
t.sh 
---$c--- 
file t.sh 
---"$c"--- 
* 
---$d--- 
file t.sh 
---"$d"--- 
* 
---"$e"--- 
* 
---$e--- 
file t.sh 
---"$f"--- 
$(ls) 
---"$g"--- 
$(ls) 
---$h--- 
file t.sh 
---"$h"--- 
* 

Una cosa interesante a observar es que la sustitución de comandos se produce en la variable asignaciones si están entre comillas dobles, y si el RHS se da explícitamente como "$(ls)" y no implícitamente como "$a" ..

Cuestiones relacionadas