Introducción a las expansiones de parámetros de shell bash

Introducción a las expansiones de parámetros de shell bash

Un shell es una parte crucial de un sistema operativo basado en UNIX y es la interfaz principal que podemos usar para interactuar con el sistema mismo. Bash es sin duda el shell más utilizado en la mayoría de las distribuciones de Linux: nació como reemplazo de software libre para el Bourne Shell (Bash es el acrónimo de Bourne-Again Shell) dentro del proyecto GNU. En este tutorial aprenderemos cómo funcionan algunas de las expansiones bash más útiles.

En caso de que aún no esté familiarizado con Bash, o simplemente necesite actualizar su memoria, se recomienda visitar nuestro tutorial de scripting bash para principiantes, antes de sumergirse en el concepto de expansiones de shell bash a continuación.

En este tutorial aprenderás:

  • Cómo usar varias expansiones de parámetros bash



Requisitos y convenciones de software utilizados

Requisitos de software y convenciones de línea de comandos de Linux
Categoría Requisitos, convenciones o versión de software utilizada
Sistema Independiente de la distribución
Software Una cáscara de fiesta
Otro Conocimiento básico de Bash
Convenciones # - requiere que los comandos de Linux dados se ejecuten con privilegios raíz directamente como un usuario raíz o mediante el uso de sudo dominio
ps - Requiere que los comandos de Linux dados se ejecuten como un usuario regular no privilegiado

La expansión más simple posible

La sintaxis de expansión de parámetros más simple posible es la siguiente:

$ parámetro

Cuando usamos esta sintaxis, parámetro se sustituye por su valor. Veamos un ejemplo:

$ sitio = "LinuxConfig.org "$ echo" $ sitio "Linuxconfig.organizar

Creamos el sitio variable y asignado el "LinuxConfig.org " Cadena. Luego usamos el eco Comando para mostrar el resultado de la expansión variable. Siendo esta una expansión básica, habría funcionado incluso sin el uso de aparatos ortopédicos alrededor del nombre de la variable:

$ echo "$ sitio" Linuxconfig.organizar


¿Por qué usamos el aparatos ortopédicos entonces? Los aparatos ortopédicos rizados, al realizar expansiones de parámetros, se utilizan para delimitar el nombre de la variable:

$ Echo "Estás leyendo este artículo en $ Site_!"Estás leyendo este artículo en

Qué pasó? Dado que el nombre de la variable no fue delimitado, el _ el personaje fue considerado como parte de él. El caparazón intentó expandirse $ sitio_ variable, por lo tanto, no se devolvió nada. Envolver la variable con aparatos ortopédicos rizados resuelve este problema:

$ echo "Estás leyendo este artículo en $ Sitio _!"Estás leyendo este artículo en LinuxConfig_!

Si bien el uso de aparatos ortopédicos rizados no siempre es necesario con la expansión de los parámetros básicos, es obligatorio realizar todas las demás expansiones que veremos en este artículo.

Antes de continuar, déjame darte un consejo. En el ejemplo anterior, el shell intentó expandir una variable inexistente, produciendo un resultado en blanco. Esto puede ser muy peligroso, especialmente cuando se trabaja con nombres de rutas, por lo tanto, al escribir scripts, siempre se recomienda usar el sustantivo opción que hace que el shell salga con error siempre que se haga referencia a una variable no existente:

$ set -o nomento de nomenta $ echo "Estás leyendo este artículo en $ Site_!"Bash: Site_: variable no unida

Trabajando con indirección

El uso del ps!parámetro Sintaxis, agrega un nivel de indirección a nuestra expansión de parámetros. Qué significa? El parámetro que el shell intentará expandirse no es parámetro ; en su lugar, intentará usar el valor de parámetro Como el nombre de la variable a expandir. Expliquemos esto con un ejemplo. Todos sabemos el HOGAR Variable se expande en la ruta del directorio de inicio del usuario en el sistema, a la derecha?

$ echo "$ home" /home /egdoc

Muy bien, si ahora asignamos la cadena "Inicio", a otra variable, y usamos este tipo de expansión, obtenemos:

$ variable_to_inspect = "home" $ ​​echo "$ !variable_to_inspect " /home /egdoc

Como puede ver en el ejemplo anterior, en lugar de obtener "hogar" como resultado, como hubiera sucedido si realizáramos una expansión simple, el shell usó el valor de variable_to_inspect Como el nombre de la variable para expandir, es por eso que hablamos de un nivel de indirección.

Expansión de modificación de casos

Esta sintaxis de expansión del parámetro cambiemos el caso de los caracteres alfabéticos dentro de la cadena resultante de la expansión del parámetro. Digamos que tenemos una variable llamada nombre; Para capitalizar el texto devuelto por la expansión de la variable, usaríamos el $ parámetro^ sintaxis:

$ name = "egidio" $ echo "$ name^" Egidio

¿Qué pasa si queremos superar toda la cadena, en lugar de capitalizarla?? Fácil! Usamos el $ parámetro ^^ sintaxis:

$ echo "$ nombre ^^" Egidio

Del mismo modo, para minúsculas el primer carácter de una cadena, usamos el $ parámetro, Sintaxis de expansión:

$ name = "egidio" $ echo "$ name," egidio

Para minúsculas toda la cadena, en su lugar, usamos el $ parámetro ,, sintaxis:

$ name = "egidio" $ echo "$ name ,," Egidio

En todos los casos a patrón también se puede proporcionar un solo personaje. Cuando se proporciona el patrón, la operación se aplica solo a las partes de la cadena original que lo coincide:

$ name = "egidio" $ echo "$ name ,, [dio]" Egidio


En el ejemplo anterior, encerramos los personajes de los soportes cuadrados: esto hace que alguien de ellos se emparme como un patrón.

Al usar las expansiones, explicamos en este párrafo y el parámetro es una matriz suscrita por @ o *, La operación se aplica a todos los elementos contenidos en él:

$ my_array = (uno dos tres) $ echo "$ my_array [@] ^^" uno dos tres

Cuando se hace referencia al índice de un elemento específico en la matriz, en cambio, la operación se aplica solo a él:

$ my_array = (uno dos tres) $ echo "$ my_array [2] ^^" tres

Remoción de subcadena

La próxima sintaxis que examinaremos nos permite eliminar un patrón desde el principio o desde el final de la cadena resultante de la expansión de un parámetro.

Eliminar el patrón coincidente desde el comienzo de la cadena

La próxima sintaxis examinaremos, $ parámetro#patrón, nos permite eliminar un patrón desde el comienzo del
cadena resultante de la parámetro expansión:

$ name = "egidio" $ echo "$ name#egi" dio

Se puede obtener un resultado similar utilizando el "$ parámetro ## patrón" sintaxis, pero con una diferencia importante: contrario a la que usamos en el ejemplo anterior, que elimina el Patrón de juego más corto Desde el comienzo de la cadena, elimina el el más largo uno. La diferencia es claramente visible cuando se usa el * personaje en el patrón:

$ name = "Egidio Docile" $ Echo "$ name#*i" Dio Docile

En el ejemplo anterior usamos * como parte del patrón que debe eliminarse de la cadena resultante por la expansión del nombre variable. Este comodín coincide con cualquier personaje, por lo que el patrón en sí se traduce en el personaje "'I' y todo antes". Como ya dijimos, cuando usamos el $ parámetro#patrón Sintaxis, se elimina el patrón de coincidencia más corto, en este caso es "EGI". Veamos qué sucede cuando usamos el "$ parámetro ## patrón" Sintaxis en su lugar:

$ name = "Egidio Docile" $ echo "$ name ##*i" le

Esta vez se elimina el patrón de coincidencia más largo ("Egidio Doci"): la coincidencia más larga posible incluye la tercera 'I' y todo antes. El resultado de la expansión es solo "le".

Eliminar el patrón coincidente del final de la cadena

La sintaxis que vimos arriba elimina el patrón de coincidencia más corto o más largo desde el comienzo de la cadena. Si queremos que el patrón se quite del fin de la cadena, en cambio, debemos usar el $ parámetro%patrón o $ parámetro %% patrón expansiones, eliminar, respectivamente, la coincidencia más corta y más larga desde el final de la cadena:

$ name = "Egidio Docile" $ echo "$ nombre%i*" Egidio Doc

En este ejemplo, el patrón que proporcionamos se traduce aproximadamente en el carácter "'I' y todo después de él desde el final de la cadena". El partido más corto es "Ile", entonces lo que se devuelve es "Egidio Doc". Si intentamos el mismo ejemplo pero usamos la sintaxis que elimina la coincidencia más larga que obtenemos:

$ name = "Egidio Docile" $ echo "$ name %% i*" EG

En este caso, la vez más larga se elimina, lo que se devuelve es "por ejemplo".

En todas las expansiones que vimos arriba, si parámetro es una matriz y se suscrito con * o @, La eliminación del patrón de coincidencia se aplica a todos sus elementos:

$ my_array = (uno dos tres) $ echo "$ my_array [@]#*o" ne tres


Buscar y reemplazar el patrón

Utilizamos la sintaxis anterior para eliminar un patrón de coincidencia desde el principio o desde el final de la cadena resultante de la expansión de un parámetro. ¿Y si queremos reemplazar patrón con algo más? Podemos usar el $ parámetro/patrón/string o $ parámetro // patrón/string sintaxis. El primero reemplaza solo la primera ocurrencia del patrón, el segundo todos los acontecimientos:

$ frase = "amarillo es el sol y el amarillo es el limón" $ echo "$ frase/amarillo/rojo" El rojo es el sol y el amarillo es el limón

El parámetro (frase) se expande y la coincidencia más larga del patrón (amarillo) se combina contra él. La coincidencia es reemplazada por el proporcionado cadena (rojo). Como puede observar, solo se reemplaza el primer hecho, por lo que el limón permanece amarillo! Si queremos cambiar todas las ocurrencias del patrón, debemos prefijarlo con el / personaje:

$ frase = "amarillo es el sol y el amarillo es el limón" $ echo "$ frase // amarillo/rojo" rojo es el sol y el rojo es el limón

Esta vez, todas las ocurrencias de "amarillo" han sido reemplazadas por "rojo". Como puede ver, el patrón coincide donde se encuentre en la cadena resultante de la expansión de parámetro. Si queremos especificar que debe coincidir solo al principio o al final de la cadena, debemos prefijarlo respectivamente con el # o De % personaje.

Al igual que en los casos anteriores, si parámetro es una matriz suscrita por cualquiera * o @, La sustitución ocurre en cada uno de sus elementos:

$ my_array = (uno dos tres) $ echo "$ my_array [@]/o/u" une twu tres

Expansión de la subestring

El $ parámetro: offset y $ parámetro: offset: longitud expansiones Permitamos expandir solo una parte del parámetro, devolviendo una subcadena que comienza en la especificada compensar y longitud personajes mucho. Si la longitud no se especifica, la expansión avanza hasta que el final de la cadena original. Este tipo de expansión se llama expansión de la subestring:

$ name = "Egidio Docile" $ echo "$ name: 3" Dio Docile

En el ejemplo anterior proporcionamos solo el compensar, sin especificar el longitud, Por lo tanto, el resultado de la expansión fue la subcadena obtenida al comenzar en el carácter especificado por el desplazamiento (3).

Si especificamos una longitud, la subcadena comenzará en compensar y será longitud Personajes Long:

$ echo "$ nombre: 3: 3" dio 

Si el compensar es negativo, se calcula desde el final de la cadena. En este caso, se debe agregar un espacio adicional después de : de lo contrario, el caparazón lo considerará como otro tipo de expansión identificado por :- que se utiliza para proporcionar un valor predeterminado si el parámetro a expandir no existe (hablamos de ello en el artículo sobre la gestión de la expansión de las variables bash vacías o no set):

$ echo "$ nombre: -6" Dollat

Si el proporcionado longitud es negativo, en lugar de ser interpretado como el número total de caracteres, la cadena resultante debe ser larga, se considera como un desplazamiento a partir del final de la cadena. El resultado de la expansión será, por lo tanto, una subcadena que comienza en compensar y terminando en longitud Caracteres del final de la cadena original:

$ echo "$ nombre: 7: -3" doc 

Al usar esta expansión y parámetro es una matriz indexada suscrita por * o @, el compensar es relativo a los índices de los elementos de la matriz. Por ejemplo:

$ my_array = (uno dos tres) $ echo "$ my_array [@]: 0: 2" uno dos $ echo "$ my_array [@]: -2" dos tres


Un negativo longitud , En cambio, genera un error de expansión:

$ echo "$ my_array [@]: 0: -2" Bash: -2: Expresión de subcadena < 0 

Expansión de "longitud"

Al usar el $ #parámetro expansión, el resultado de la expansión no es el valor del parámetro, por su longitud:

$ name = "egidio" $ echo "$ #name" 6

Cuando parámetro es una matriz, y se suscrito con * o @, El número de elementos contenidos en él se devuelve:

$ my_array = (uno dos tres) echo "$ #my_array [@]" 3

Cuando se hace referencia a un elemento específico de la matriz, su longitud se devuelve en su lugar:

$ echo "$ #my_array [2]" 5

Poniendo todo

En este artículo vimos muchas expansiones sintaxis. Vimos cómo en minúsculas o mayúsculas la primera letra de la cadena resultante de la expansión de una variable, cómo usar un nivel de indirección, cómo realizar la eliminación de la subcadena y hacer que un parámetro se amplíe en la longitud de su valor, en lugar de su valor en sí mismo.

Esta no es una lista exhaustiva de todas las posibles expansiones que podemos realizar con Bash: consulte la documentación de GNU si desea saber más. En el artículo también mencionamos matrices: Para saber más sobre ellos, puede leer nuestro artículo dedicado de matrices de bash.

Tutoriales de Linux relacionados:

  • Cosas para instalar en Ubuntu 20.04
  • Cosas que hacer después de instalar Ubuntu 20.04 fossa focal Linux
  • Sistema colgado de Linux? Cómo escapar a la línea de comando y ..
  • Una introducción a la automatización, herramientas y técnicas de Linux
  • Cosas que hacer después de instalar Ubuntu 22.04 Jellyfish de Jammy ..
  • Mint 20: Mejor que Ubuntu y Microsoft Windows?
  • Ubuntu 20.04 Guía
  • Cosas para instalar en Ubuntu 22.04
  • Instale Arch Linux en VMware Workstation
  • Descarga de Linux