Esta publicación en realidad contiene dos preguntas separadas, pero creo que agruparlas juntas dará más contexto. He revisado esta pregunta sobre citas alrededor de variables, pero no entiendo qué significa expansión de variables en primer lugar. Entonces mi primera pregunta es:
- ¿Qué es la expansión variable en unix / linux speak?
Una segunda parte de mi pregunta se relaciona con los siguientes términos:
- glob
- división
¿Qué significa lo anterior y cómo afectan la expansión variable? La respuesta a la pregunta original menciona lo siguiente:
Piense en la ausencia de comillas (en contextos de lista) como el operador split + glob.
Como si echo $ test fuera echo glob (split ("$ test")).
No pude encontrar ninguna respuesta que aborde directamente el concepto de engorde y división, sino que utiliza esos términos directamente al responder otras preguntas como esta reciente .

Respuestas:
Expansión de variables (el término estándar es expansión de parámetros , y a veces también se llama sustitución de variables ) básicamente significa reemplazar la variable por su valor. Más precisamente, significa la sustitución de la
$VARIABLEconstrucción (o${VARIABLE}o${VARIABLE#TEXT}o de otras construcciones) por algún otro texto que se construye a partir del valor de la variable. Este otro texto es la expansión de la variable.El proceso de expansión es el siguiente. (Solo discuto el caso común, algunas configuraciones de shell y extensiones modifican el comportamiento).
${VARIABLE#TEXT}, y el valor de la variable comienza conTEXT, elimineTEXTdesde el principio del valor.IFSse puede cambiar para dividir en caracteres que no sean espacios en blanco). El resultado ya no es una cadena, sino una lista de cadenas. Esta lista puede estar vacía si el valor contenía solo espacios en blanco.Por ejemplo, suponga que la variable
foocontienea* b* c*y el directorio actual contiene los archivosbar,bazypaz. Luego${foo#??}se expande de la siguiente manera:a* b* c*.#??significa quitar los dos primeros caracteres, lo que da como resultado la cadena de 6 caracteresb* c*(con un espacio inicial).b*yc*.b*, interpretada como un patrón, coincide con dos archivos:barybaz. La cadenac*no coincide con ningún archivo, por lo que se deja sola. El resultado es una lista de tres cadenas:bar,baz,c*.Por ejemplo,
echo ${foo#??}imprimebar baz c*(el comandoechoune sus argumentos con un espacio intermedio).Para más detalles, ver:
fuente
$var) y otros tipos de parámetros como$1,$#,$?,$-...glob / split
Tomaré el glob / split primero. La respuesta de @ Stephane a la que se vinculó es usar esos términos en un sentido general. No son comandos reales ni nada por el estilo, solo pseudo operaciones.
El
split("$test")dividiría el contenido de "$ test" en una "matriz" de elementos.La
glob(...)entonces tener cuidado para expandir cualquiera de estos elementos que contienen la cáscara globbing caracteres tales como*o rangos[1-2].Ejemplo
Digamos que nuestra cadena
$testes la siguiente.También digamos que tenemos un directorio con algunos archivos.
Ahora, si tratamos de repetirlo sin comillas, debería notar que nuestra cadena se dividió en espacios, y luego se expandió cualquier carácter global.
Sin embargo, si tuviéramos que citar la variable cuando la pasamos como un argumento
echo, obtendríamos la cadena literal original.expansión variable
El término expansión variable está destinado a cubrir la operación básica que realiza el shell como parte de sus operaciones básicas. El shell es responsable de analizar la entrada y luego ejecutar esta entrada una vez que se considera sintácticamente correcta.
En nuestro ejemplo anterior. Cuando la variable
$testse presentó sinechocomillas, le estábamos diciendo al shell que siguiera adelante y dividiera esos argumentos y luego los englobara.Cuando fue citado, esencialmente estábamos deshabilitando esa característica con cualquier variable que envolviéramos con comillas dobles.
Ejemplo
Aquí hay algunos ejemplos adicionales de engrosamiento y división.
glob / división se produce automáticamente
Glob / división deshabilitado mediante comillas dobles
fuente