Aprendiendo bash #1

Si eres un usuario de Gnu/Linux y te gustaría automatizar tus tareas este es el sitio perfecto para ti. En esta serie de blogs te enseñaremos que es Bash, como se utiliza y como crear scripts para automatizar tus tareas o simplemente para divertirte creando herramientas que te ayuden como desarrollador.

¿Qué es “bash“?

El nombre Bash viene de un acrónimo para “Bourne Again SHell”, por sus siglas (B-A-SH). 

Bash es un intérprete de comandos para los sistemas operativos tipo Unix, es decir sistemas operativos como Gnu/LinuxMacOS o los poco menos conocidos como los *BSD.

También actúa como lenguaje de comandos, el cual es un lenguaje para controlar tareas en la computación. Estos lenguajes pueden utilizarse para automatizar tareas que normalmente realizamos en nuestro sistema día a día o para automatizar tareas repetitivas que podrían tardar una buena cantidad de tiempo si las realizáramos de manera convencional. 

Bash como lenguaje de comandos posee varias ventajas, al ser un lenguaje de “dominio específico” su sintaxis es sencilla, es un lenguaje interpretado y su curva de aprendizaje es sencilla a comparación de otros lenguajes de programación que pueden volverse una pesadilla rápidamente cuando escalamos en su curva de dificultad.

En resumen, un lenguaje de comandos es un programa de computadora diseñado para ejecutarse en una línea de comandos y, será utilizado para acciones repetitivas como manipulación de archivos, ejecución de programas, salida de texto, limpieza y mantenimiento de la computadora, etc.

Bash además es una línea de comandos extensible, teniendo su propia sintaxis y mejoras por encima de un interprete estándar pero sin despegarse del mismo completamente, pues Bash también tiene la opción de ser competente con el estándar “POSIX“. 

Bash normalmente se ejecutaba en terminales o en pantallas pequeñas, hoy en día eso ha quedado atrás y los usuarios de los sistemas tipo UNIX pueden disfrutar de Bash en la comunidad de las ventanas que les ofrece su sistema operativo.

Si estamos en un sistema operativo Gnu/Linux como Ubuntu, Debian, Linux Mint, etc. Ya habremos visto antes una terminal en nuestro menú principal.

Para este blog utilizaremos Ubuntu 20.04 “Focal Fossa“, un editor de texto y mucho entusiasmo en aprender.

¡Hola Mundo!

Bash normalmente se utiliza en modo interactivo, esto quiere decir que, ingresaremos comandos y éste los ejecutara una vez presionemos enter.

Comencemos por un hola mundo sencillo: 

echo "Hello World"

Esto deberá imprimir la palabra “Hola Mundo” en nuestra terminal

Echo es una función integrada en bash que escribe los argumentos que recibe hacia la salida estándar y además, añade una nueva línea al final.

Bash No Interactivo

Bash también puede ser ejecutado de forma no-interactiva desde un archivo o un script, haciendo que la ejecución de nuestros programas requieran de poca a ninguna interacción humana para funcionar correctamente. 

Desde Unix V7 se declaró que el comportamiento del modo interactivo y de la ejecución de un script debería ser el mismo, por lo tanto todo lo que puede ser hecho a mano puede ejecutarse en un script y en sentido opuesto.

Veamos como funcionaría nuestro “Hola Mundo” en un script.

Primero debemos crear un archivo con el nombre hello-world.sh

La extensión .sh le indica a nuestra distribución que estaremos creando un script para la terminal. Aunque las extensiones no son realmente necesarias en Linux, pues solo los primeros bytes del archivo determinarán de que tipo es.

Una vez creado dicho script añadiremos las siguientes líneas:

#!/bin/bash
echo "Hello World"

Ahora le daremos permisos de ejecución con el comando chmod +x hello-world.sh y lo ejecutaremos finalmente con  ./hello-world.sh

Perfecto, ahora expliquemos este pequeño programa. 

La primera línea es conocida como un shebang. El cual es una secuencia de carácteres que le indicará al sistema operativo que ejecute el programa utilizando bash, pasando el script como argumento a bash, es decir, en términos cortos lo que hace el shebang es:

/bin/bash hello-world.sh

si el shebang fuese reemplazado con otra “shell” (el cual será ahora nuestra forma de referirnos a bash, sh, zsh y derivados) solo habría que reemplazar la ruta y obtener, por ejemplo: /bin/sh , /bin/zsh , /bin/ksh

La segunda línea ya sabemos que hace, ejecuta el comando echo para escribir “Hola Mundo” a la salida estándar.

Existen varias maneras de ejecutar un script de bash como:

./hello-world.sh # La más usada y recomendada

/bin/bash hello-world.sh

bash hello-world.sh

sh hello-world.sh

Como lo hemos dicho antes, en Linux las extensiones de archivo no son muy importantes que digamos, de hecho, si queremos utilizar Bash en producción es recomendable omitir la extensión .sh y de ser posible poner la ruta de nuestro programa en una variable de entorno conocida como PATH para que podamos ejecutarlo sin problema alguno como cualquier otro comando incluido en Linux.

Otro “shebang” muy común utilizado para scripts bash que necesitan ser portables es:

#!/usr/bin/env bash  en lugar de forzar la ruta de la shell.

Para esto /usr/bin/env debe existir en nuestro sistema, pero lejos de ese punto, bash solo necesitará estar instalado. En muchos sistemas /bin/bash no existe y el shebang debe cambiarse a /usr/local/bin/bash o cualquier otro lugar donde los mantenedores hayan decidido poner bash.

Hola Mundo + ¡Variables!

Ok, es tiempo de aprender como funcionan las variables en bash, para ello es recomendable repetir los pasos del título anterior, creando un nuevo archivo llamado hello.sh y darle permisos de ejecución.a

#!/usr/bin/env bash

# En Bash no está permitido el uso de espacios alrededor del signo "="

Mundo="World"

# Al igual que en C podemos hacer uso de la función printf

printf "Hello, %s\n" "$Mundo"

Si ejecutamos este programa, como es de esperarse, recibiremos el mensaje de “Hola Mundo” que hemos realizado anteriormente, sin embargo aquí debemos explicar como funcionan las variables en bash.

La tercera línea es una declaración de una variable conocida como String, (Hilo o cadena, en español) y en lenguaje humano podemos interpretarlo como:

“La variable ‘Mundo’ tendrá el mismo valor que la palabra ‘World'”

Una cosa que destacamos anteriormente de Bash es que puede inferir tipos, es decir, no es necesario indicar de que tipo es la variable que estamos utilizando a diferencia de otros lenguajes.

La última línea es la interesante, pues aquellos que hayan programado en C conocerán muy bien la función printf, solo que aquí no serán necesarios los paréntesis al momento de llamarla, por el momento no le pondremos mucho lujo de detalle a esta función, solo haremos saber que al igual que echo, imprime en la pantalla los argumentos que se le envían y que  el  %s le indica a la función que imprimiremos un String, (si, %s por %string), finalmente como segundo argumento entre comillas llamaremos a la variable ‘Mundo’ la cual posee un valor de “World”, como resultado obtendremos nuestro “Hello World”.

¿No es hermoso?

¡Hola!…con entrada del usuario

Ok, basta de “Hola Mundos” mejor hagamos que nuestra máquina nos salude cuando ingresemos nuestro nombre. ¿Suena bien?

Perfecto, entonces manos a la obra, hora de crear otro script y asignarle permisos de ejecución.

#!/usr/bin/env bash

echo "¿Quien eres?"

read name

echo "Hola, $name."

Sorpresa, bash puede leer y asignar variables en una sola línea con su función read. 

read es un comando de bash que hace lo opuesto a echo, en lugar de enviar sus argumentos a la salida estándar, este los guarda en la “entrada estándar” y los deposita en una variable del nombre que gustemos.

¿No es genial ahorrarse todas esas líneas de código con una simple función?

Además echo tiene la capacidad de imprimir variables al igual que printf.  De hecho, es más recomendable usar echo en lugar de printf, pues printf puede llevar a errores de formato o de tipos si no se maneja correctamente.

Ejecutemos este programa en nuestra terminal y veamos los resultados.

Por el momento será todo lo que aprenderemos en este blog, trata de experimentar

con la entrada, salida y variables en Bash, trata de imprimir, números enteros, cadenas, o números reales, las posibilidades son ilimitadas 😀

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

A %d blogueros les gusta esto: