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
$vary${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,
$fooy${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$fooo${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
$fooo${foo}, el shell dividirá el valor guardado en la variable en el espacio en blanco (esto se puede cambiar configurando laIFSvariable 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
fooy*, 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
rmlugar deechosin 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 envarningún lado.