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
$VARIABLE
construcció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
, elimineTEXT
desde el principio del valor.IFS
se 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
foo
contienea* b* c*
y el directorio actual contiene los archivosbar
,baz
ypaz
. 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:bar
ybaz
. 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 comandoecho
une 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
$test
es 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
$test
se presentó sinecho
comillas, 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