GNU/Linux >> Tutoriales Linux >  >> Linux

¿Expansión de una variable de shell y efecto de Glob y Split en ella?

Esta publicación en realidad contiene dos preguntas separadas, pero creo que agruparlas brindará más contexto. He revisado esta pregunta sobre las comillas en torno a las variables, pero no entiendo muy bien qué expansión de variables decir en primer lugar. Así que mi primera pregunta es:

  1. ¿Qué es la expansión de variables? en unix/linux hablar?

Una segunda parte de mi pregunta se relaciona con los siguientes términos:

  1. globo
  2. dividir

¿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 globbing y dividir sino que usa esos términos directamente al responder otras preguntas como esta reciente.

Respuesta aceptada:

Expansión de variables (el término estándar es expansión de parámetros , y a veces también se le llama sustitución de variables ) básicamente significa reemplazar la variable por su valor. Más precisamente, significa reemplazar el $VARIABLE construcción (o ${VARIABLE} o ${VARIABLE#TEXT} u 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).

  1. Toma el valor de la variable, que es una cadena. Si la variable no está definida, use la cadena vacía.
  2. Si la construcción incluye una transformación, aplíquela. Por ejemplo, si la construcción es ${VARIABLE#TEXT} , y el valor de la variable comienza con TEXT , elimina TEXT desde el principio del valor.
  3. Si el contexto requiere una sola palabra (por ejemplo, entre comillas dobles, o en el lado derecho de una tarea, o dentro de un documento aquí), deténgase aquí. De lo contrario, continúe con los siguientes pasos.
  4. Dividir el valor en palabras separadas en cada secuencia de espacios en blanco. (La variable 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 contiene solo espacios en blanco.
  5. Trate cada elemento de la lista como un patrón comodín de nombre de archivo, es decir, un globo . Si el patrón coincide con algunos archivos, se reemplaza por la lista de nombres de archivos coincidentes; de lo contrario, se deja solo.

Por ejemplo, supongamos que la variable foo contiene a* b* c* y el directorio actual contiene los archivos bar , baz y paz . Entonces ${foo#??} se expande de la siguiente manera:

  1. El valor de la variable es la cadena de 8 caracteres a* b* c* .
  2. #?? significa eliminar los dos primeros caracteres, lo que da como resultado la cadena de 6 caracteres  b* c* (con un espacio inicial).
  3. Si la expansión está en un contexto de lista (es decir, no entre comillas dobles u otro contexto similar), continúe.
  4. Divida la cadena en palabras delimitadas por espacios en blanco, lo que da como resultado una lista de dos cadenas:b* y c* .
  5. La cadena b* , interpretado como un patrón, coincide con dos archivos:bar y baz . La cadena c* no coincide con ningún archivo, por lo que se deja solo. El resultado es una lista de tres cadenas:bar , baz , c* .

Por ejemplo echo ${foo#??} imprime bar baz c* (el comando echo une sus argumentos con un espacio entre ellos).

Relacionado:¿Qué NO poner en un SSD?

Para obtener más detalles, consulte:

  • Expansión de parámetros en el estándar POSIX, seguida de división de campos y expansión de nombre de ruta
  • Expansión de parámetros de Shell en el manual de bash, seguida de división de palabras y expansión de nombre de archivo
  • $VAR vs ${VAR} y cotizar o no cotizar
  • ¿Cuándo son necesarias las comillas dobles?

Linux
  1. ¿Almacenar la salida del comando en la variable de Shell?

  2. ¿Cómo obtener la dirección IP propia y guardarla en una variable en un script de Shell?

  3. ¿Cómo aplazar la expansión variable?

  4. ¿Por qué Regex en Bash funciona solo si es una variable y no directamente?

  5. Shell script cambia de directorio con variable

5 formas de dividir tu terminal Linux

Cómo configurar su variable $PATH en Linux

Cómo instalar y usar Nu Shell en Linux

Comando de exportación en Linux explicado

¿Qué es Subshell en Linux?

Copie y sobrescriba un archivo en el script de Shell