En scripting cáscara, lo que es la diferencia entre estos 2 cuando se asigna una variable a otra:Citando vs no citando a la variable en el RHS de asignación de variable
a=$b
y
a="$b"
y cuando debería usar uno sobre el otro?
En scripting cáscara, lo que es la diferencia entre estos 2 cuando se asigna una variable a otra:Citando vs no citando a la variable en el RHS de asignación de variable
a=$b
y
a="$b"
y cuando debería usar uno sobre el otro?
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.
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
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).
É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"
..
Este es un buen consejo en general, pero en el caso específico que menciona el OP, la cita no sirve para nada. – user000001
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. –
¿Qué guía recomendarías? –