En un script de shell, si defino una variable como FOO=25
, ¿hay alguna diferencia entre hacer referencia a ella como $FOO$
y ${FOO}$
?
command-line
scripts
Karnivaurus
fuente
fuente
$
al final! Se tratará como un carácter normal y no como parte del nombre de la variable.Respuestas:
En la mayoría de situaciones tanto
$var
y${var}
son los mismos. (¡Tenga en cuenta que no debe usar$
a al final!)Un ejemplo en el que necesita llaves es cuando necesita poner una variable en una cadena continua.
Ejemplo:
es la salida
hello
.fuente
Para responder a su pregunta principal,
${foo}
se llama "expansión de parámetros" . Para ser precisos, el$
mismo inicia la expansión de parámetros, en{ }
realidad son opcionales según la especificación POSIX , pero pueden ser útiles para indicar el final del nombre de la variable:Básicamente,
$foo
y${foo}
son idénticos. Además de casos como el anterior o cuando está haciendo manipulación de cadenas , son completamente equivalentes.Sin embargo, no deberías usar ninguno de ellos. La regla general es que, con muy pocas excepciones, siempre debe usar
"$foo"
o"${foo}"
y nunca$foo
o${foo}
. Siempre debe citar sus variables para evitar invocar al operador split + glob (más sobre eso más adelante). Ciertamente no quieres$foo$
. La final$
es irrelevante:Entonces, aunque las variables sin comillas a veces están bien:
Por lo general, no lo son y realmente deberían evitarse:
Tenga en cuenta que los corchetes tampoco ayudan aquí:
Cuando usa
$foo
o${foo}
, el shell dividirá el valor guardado en la variable en el espacio en blanco (esto se puede cambiar configurando laIFS
variable a otra cosa) en una lista y luego, cada elemento de la lista se trata como un patrón global y se expande en cualquier archivo o directorio que coincida. Esto se conoce como el operador split + glob . Para ilustrar, considere un directorio con dos archivos:Ahora, configuremos una variable para
foo *
:¿Qué sucede si intentamos verificar si existe un archivo con ese nombre?
La variable se dividió en
foo
y*
, y dado que*
es un comodín que coincide con cualquier cadena, el shell le dice quefoo *
existe un archivo llamado exxists. Sin embargo, si lo citamos correctamente, esto no sucede:Ese fue un ejemplo trivial para ilustrar el punto. Imagínese si hubiera usado en
rm
lugar deecho
sin embargo.Entonces, primera regla: siempre cita tus variables. Puede usar cualquiera
"$foo"
o"${foo}"
pero citarlo de cualquier manera. Para obtener más detalles sobre el uso seguro de variables, eche un vistazo a estas publicaciones:fuente
$ var="foo *"
ser así$ foo="foo *"
. No lo usas envar
ningún lado.