Introducción a las expansiones de parámetros de shell bash
- 4366
- 1001
- Berta Solano
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
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 dominiops - 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