En esta breve guía sobre Bash Scripting aprenderás a iniciarte en la creación de Scripts Bash, cómo utilizar variables y cómo debe usarse una de sus características más importantes llamada globs.
Creación de Scripts en Bash
Antes de comenzar debemos saber que Bash
es el Shell más utilizado en Linux y no sólo es un intérprete donde poder ejecutar comandos, sino que también es un Lenguaje de Scripting.
Podemos utilizar Bash para escribir scripts sencillos donde poder ejecutar comandos como ps, free, uptime, etc … por lo que si necesitamos ejecutar varios de estos comandos al mismo tiempo, evitando hacerlo de uno en uno, podemos crear un script en Bash.
Creamos un fichero, que debe tener extensión .sh y le asignamos permisos de ejecución.
1 2 3 |
$ touch script.sh $ chmod +x script.sh $ vi script.sh |
Editamos el fichero, incluimos el shebang
con la ruta del intérprete de comandos y añadimos las siguientes líneas de ejemplo:
1 2 3 4 5 6 |
#! /bin/bash echo "Servidor iniciado el: $(date)" echo "Uptime" uptime echo |
Lo siguiente será ejecutar el script y para ello podemos utilizar cualquiera de las siguientes opciones:
1 2 |
$ sh ./script.sh $ ./script.sh |
Si comprobamos la salida por pantalla, vemos que obtenemos la fecha en la que ha sido iniciado el Sistema Operativo y el tiempo que ha estado disponible desde el último reinicio:
1 2 3 |
Fecha inicio: Sat Nov 6 03:20:30 UTC 2021 Uptime 03:20:30 up 36 days, 6:36, 1 user, load average: 0.00, 0.03, 0.00 |
Ahora que ya sabemos cómo crear un sencillo script, podemos pasar al siguiente paso que será aprender a utilizar variables y hacer uso de globs.
Uso de Variables y Globs
Al ser un lenguaje de Scripting, Bash nos permite crear variables y asignar valores a ellas, crear operaciones, hacer uso de condicionales, bucles, funciones, etc …
Para poder establecer un valor a una variable utilizamos el operador =
(igual) y para poder acceder a su valor tenemos que usar como prefijo el símbolo $
(dolar). Es muy importante no dejar espacios en blanco, porque nos devolverá un error.
1 2 |
subject="Hola, este es un mensaje de prueba" echo $subject |
Todas las variables que definamos son establecidas localmente en el entorno que estemos utilizando en ese momento. Por lo que si necesitamos usarlas en otro entorno necesitamos usar la palabra clave export
.
El lenguaje de Scripting Bash no soporta el uso de expresiones regulares, pero podemos hacer uso de una de sus características más importantes denominada globs
, que permiten buscar equivalencias de grupos de caracteres, lo que nos permite encontrar coincidencias en el sistema de ficheros o en su propio contenido.
El *
(asterisco) y la ?
(interrogación) son los comodines más comunes. Con ellos podemos crear secuencias de ficheros y también podemos utilizarlos como parámetros en los comandos que ejecutamos.
1 2 3 |
$ ls -l *.sh -rw-r--r-- 1 artegrafico.net psacln 809 Aug 13 2019 backup-databases.sh -rw-r--r-- 1 artegrafico.net psacln 1835 Aug 13 2019 backup-domains.sh |
En el ejemplo anterior estamos listando todos aquellos ficheros con extensión .sh. En cambio si hacemos uso de la ?
(interrogación) este tan sólo equivaldrá a un sólo carácter.
1 2 |
$ ls -l ??.sh -rw-r--r-- 1 artegrafico.net psacln 761 Aug 13 2019 bd.sh |
Los []
(corchetes) nos permiten crear patrones.
- [:upper] ó [A-Z], todas las mayúsculas del alfabeto.
- [:lower] ó [a-z], todas las minúsculas del alfabeto.
- [:digit] ó [0-9], cualquier dígito.
- [:alpha] ó [a-zA-Z], todas las mayúsculas y minúsculas.
- [:alnum] ó [a-zA-Z0-9], mayúsculas, minúsculas y dígitos.
Por lo que si queremos listar aquellos ficheros que contengan el carácter b, c o d, haremos lo siguiente:
1 2 3 |
$ ls -l [b-d]* -rw-r--r-- 1 artegrafico.net psacln 809 Aug 13 2019 backup-databases.sh -rw-r--r-- 1 artegrafico.net psacln 1835 Aug 13 2019 backup-domains.sh |
El ^
(circunflejo) nos permite buscar patrones cuyas líneas comiencen por el patrón que indiquemos. En el ejemplo estamos buscando aquellas líneas que comiencen por la letra a.
1 2 |
$ grep '^[a]' domains.lst artegrafico.net |
La !
(admiración) nos permite encontrar cualquier coincidencia en cada línea dentro del fichero.
1 2 |
$ grep '[!k]' domains.lst ilovemarketing.es |
El símbolo del $
(dolar) establece cual debe ser el final de una cadena.
1 2 |
$ grep s$ domains.lst ilovemarketing.es |
Si hacemos uso de {}
(llaves) podemos encontrar coincidencias con diferentes patrones. Cada patrón debe estar separado por comillas simples y no deben contener espacios.
1 |
$ ls -l {*.sh,*.txt} |
Las |
(tuberías) permiten indicar más de una condición en cada patrón, por lo que cada patrón debe estar separado por el símbolo |
.
1 2 3 |
$ ls -la d*+(.sh|.lst) -rw-r--r-- 1 artegrafico.net psacln 140 Aug 13 2019 databases.lst -rw-r--r-- 1 artegrafico.net psacln 144 Aug 13 2019 domains.lst |
Recuerda que podemos utilizar esta funcionalidad en Scripts escritos en Python, haciendo uso del módulo glob.