Este tutorial analiza cómo puede escribir fácilmente sus propios scripts Bash en Linux.

Como administrador del sistema, es muy probable que esté realizando tareas repetitivas que podrían ser automatizadas.

Por suerte para usted, hay un lenguaje de programación que se puede utilizar en Linux con el fin de escribir scripts : el lenguaje de programación Bash.

Usando Bash, puede programar copias de seguridad de todo el sistema especificando tantos comandos como desee en los scripts Bash.

También puede tener scripts personalizados que crean y eliminan usuarios y eliminan sus archivos asociados.

Con Bash, también puedes tener scripts que se ejecuten y vuelquen métricas de rendimiento útiles a un archivo o base de datos.

Bash es un lenguaje de programación muy potente para los administradores de sistemas.

En el tutorial de hoy, vamos a aprender todo lo básico que hay que saber sobre Bash : cómo crear y ejecutar scripts, cómo usar variables y shell built-ins de forma efectiva.

Tabla de contenidos

Lo que aprenderás

Si lees este tutorial hasta el final, vas a aprender los siguientes conceptos sobre Bash

  • Cómo crear y ejecutar scripts en Bash usando la línea de comandos;
  • Qué es shebang y cómo lo usa Linux para hacer scripts;
  • Qué son los build-ins del shell y en qué se diferencian de los programas normales del sistema;
  • Cómo utilizar las variables de Bash y qué son las variables especiales;
  • Cómo utilizar la sustitución de comandos de Bash;
  • Cómo usar sentencias IF simples en Bash;

Como puedes ver, este es un programa bastante largo, así que sin más preámbulos, vamos a empezar por ver cómo puedes crear y ejecutar scripts de Bash.

Comenzando con Bash

Antes de emitir cualquier comando, vamos a tener unas rápidas palabras sobre Bash y las historias comunes de Shell.

Historia de Bash

La primera versión del shell Bash fue lanzada en 1989 por Brian Fox y viene como una implementación de código abierto del shell de Unix.

En aquel entonces, cuando empezaron a surgir los sistemas Unix, dichos sistemas utilizaban shells estándar de Unix denominados Bourne shells.

Imagen de LinuxJournal

En los primeros tiempos de Unix, los sistemas desarrollados por empresas como el MIT o Bell Labs no eran libres y no eran de código abierto.

Aunque se proporcionara documentación para esas herramientas, se convirtió en una prioridad para la iniciativa GNU (liderada por Richard Stallman) tener su propia versión de la Shell de Unix.

Seis años después de anunciar el proyecto GNU, nació la shell Bash (Bourne-Again Shell) con aún más características que la shell Bourne original.

Lenguaje de programación Bash

Cuando se trabaja con un sistema tipo Unix como Linux, Bash suele tener dos significados :

  • Bash es un intérprete de línea de comandos o, en otras palabras, un shell de Unix. Esto significa que cada vez que usted está abriendo un terminal, se enfrentará a un shell Unix que es la mayoría de las veces un shell Bash.

Cuando se escriben los comandos directamente en el terminal, los comandos son interpretados por el shell, ejecutados utilizando las llamadas del sistema y los valores de retorno son devueltos al usuario final.

Si no estás seguro del intérprete actual que estás utilizando, la variable de entorno SHELL indica qué shell estás utilizando actualmente.

$ printenv SHELL

Como puedes ver, en este caso, estamos utilizando correctamente el intérprete de comandos Bash para trabajar.

Es importante tener en cuenta que aunque términos como «Bash scripting» y «Shell scripting» se utilicen indistintamente, en realidad podrían no describir lo mismo dependiendo de su distribución.

Algunas distribuciones recientes (como Debian 10) tienen enlaces simbólicos desde el shell Bourne original (llamado sh) a sus propias implementaciones de shell (en este caso Dash o Debian Almquist shell)

  • Bash también describe un lenguaje de línea de comandos y también se conoce como el lenguaje Bash. Bash expone un conjunto de operadores y operandos que se pueden utilizar para tener algunas características básicas como la canalización o la ejecución de múltiples comandos a la vez.

Al ejecutar algunas canalizaciones básicas, se acostumbra a trabajar con el símbolo «|». Este símbolo es parte del lenguaje de línea de comandos Bash.

La misma lógica va para el símbolo «&&» que ejecuta el segundo comando si, y sólo si, el primer comando tuvo éxito.

$ command1 && command2

Crear y ejecutar scripts Bash

Ahora que tiene algunos antecedentes sobre el shell Bash y el lenguaje de línea de comandos Bash, vamos a empezar por crear y ejecutar scripts Bash simples.

Para crear tu primer script Bash, simplemente crea un archivo llamado «script.sh».

Como probablemente ya hayas notado, seguimos usando la extensión «sh» refiriéndonos al shell Bourne original (también denotado como sh).

$ touch script.sh

Ahora bien, crear un archivo que termine con la extensión «sh» no es suficiente para que su script sea considerado como un script de Shell.

De hecho, puede ver que su archivo aún no es considerado como un script de Shell ejecutando el comando file.

$ file script.sh

Como puede ver aquí, su archivo sólo se describe como un simple archivo vacío.

Para que su archivo se describa como un archivo de script de shell, necesita especificar la línea shebang al principio de su archivo.

Especificación de shell usando shebang

Si ha estado usando Linux durante bastante tiempo, es muy probable que ya haya encontrado la línea shebang al principio de su archivo.

Shebang, abreviatura de «Hash + «Bang», es una línea que se pone al principio de los scripts de shell para especificar qué shell se va a utilizar para interpretar este script.

#!/bin/<shell>

En nuestro caso, queremos trabajar con scripts Bash. En otras palabras, queremos que nuestros scripts sean interpretados por un intérprete de Bash.

Para determinar la ruta al intérprete, puedes usar el comando «which».

$ which bash/bin/bash

Ahora que sabes la ruta a tu intérprete, edita tu archivo de script y añade la línea shebang al principio de tu archivo.

#!/bin/bash

Ahora que has añadido esta línea al principio de tu archivo, vuelve a ejecutar el comando «file» para ver la diferencia.

Como puedes ver, la salida es ligeramente diferente: esta vez, tu script se ve como un «script de shell Bourne-Again» y más importante, como un ejecutable.

Así que lo que sucedería si no se especifica la línea shebang en la parte superior de la secuencia de comandos.

Cuando no se especifica la línea shebang, la secuencia de comandos se ejecuta utilizando el shell actual utilizado con el fin de iniciar el comando de ejecución.

Ahora que usted sabe cómo crear secuencias de comandos Bash, vamos a ver cómo se puede ejecutar.

Ejecutar scripts Bash

Para ejecutar scripts Bash en Linux, tienes esencialmente dos opciones :

  • Especificando el intérprete de shell que quieres usar y el archivo de script;
  • Usando la ruta al archivo de script

Especificando el intérprete de shell

El primer método es bastante sencillo.

Para ejecutar tu script bash, vas a especificar el intérprete que quieres usar por ti mismo.

$ bash <script>$ /bin/bash <script>

Usando el ejemplo que usamos antes, esto nos daría la siguiente salida.

Como puedes ver, este método ni siquiera requiere los permisos de ejecución en el archivo, sólo necesitas poder usar el ejecutable bash.

Como puedes ver, cuando inicias sesión como otro usuario, sin permisos de ejecución, sigo siendo capaz de ejecutar este script.

Esta es una observación importante porque puede que quieras almacenar tus archivos de script en directorios protegidos (a los que sólo tú puedes acceder) para evitar que otros usuarios ejecuten tus archivos.

Especificando la ruta al script

La otra forma de ejecutar scripts bash es especificando la ruta al archivo.

Para utilizar este método, el archivo necesita tener permisos de ejecución.

Primero, utilice el comando «chmod» para establecer los permisos de ejecución para el usuario actual.

$ chmod u+x <script>

Como puedes ver, el color del archivo es bastante diferente: tu terminal actual resalta los archivos ejecutables usando colores específicos, en este caso el color verde.

Ahora que tu script es ejecutable, puedes ejecutarlo especificando la ruta relativa o absoluta al script.

Usando un archivo llamado «script.sh» ubicado en mi directorio de trabajo actual, el script se puede ejecutar ejecutando

$ ./script.sh

Si estás en otro directorio, tendrás que especificar la ruta absoluta al archivo del script.

$ /home/user/script.sh

Como probablemente ya te has dado cuenta, este método no es muy conveniente si tienes que especificar la ruta del script cada vez.

Por suerte para ti, hay una manera de ejecutar tu script simplemente escribiendo el nombre del archivo en la línea de comandos.

Añadir el script al PATH

La extensión «.sh» no es necesaria para que un script sea considerado un archivo de script.

Para simplificar, vamos a renombrar el archivo existente «script.sh» existente a «script».

Para renombrar archivos en Linux, basta con utilizar el comando «mv» y especificar los objetivos de origen y destino.

$ mv script.sh script

Ahora, ¿qué pasa si quieres ejecutar tu script escribiendo «script»?

Para ello, tienes que añadir la ruta de tu script a tu variable de entorno PATH.

Para imprimir el valor actual de tu variable de entorno PATH, utiliza «printenv» con el argumento «PATH».

$ printenv PATH

Para actualizar el PATH en su entorno de trabajo actual, edite la variable de entorno PATH utilizando la siguiente sintaxis.

$ export PATH="<path_to_script>:$PATH"

Ahora, el comando «script» que acaba de definir estará directamente disponible sin especificar ninguna ruta : puede lanzarlo como cualquier otro comando.

Nota : si quieres que tus cambios sean permanentes, sigue estos pasos para actualizar tu variable PATH correctamente.

Explicación de los «built-ins» del shell

Antes de declarar cualquier variable en tu script del shell, es importante que conozcas los «built-ins» del shell.

Cuando se trabaja con el shell Bash, la mayor parte del tiempo se ejecutan «programas».

Ejemplos de programas son «ls», «fdisk» o «mkdir». La ayuda para esos comandos se puede encontrar utilizando el comando «man», abreviatura de «manual».

Sin embargo, ¿has intentado alguna vez leer la documentación del comando «source»?

No podrías leer la documentación utilizando «man» porque el comando «source» es una función incorporada en el shell.

Para leer la documentación de las funciones incorporadas en el shell, tienes que utilizar el comando «help».

$ help <command>

La lista de shell built-ins es bastante extensa pero aquí hay una captura de pantalla de cada comando incorporado de bash que puede encontrar en los sistemas Ubuntu.

Usando las variables de Bash

Ahora que sabes sobre los build-ins de Bash, es hora de que empieces a escribir tus propios scripts de Bash.

Como recordatorio, los comandos escritos en su terminal pueden ser usados en un script Bash de la misma manera.

Por ejemplo, si quiere un script que simplemente ejecute el comando «ls -l», simplemente edite su script, agregue la línea shebang y el comando.

#!/bin/bash# This simple script executes the ls commandls -l

Ahora, ¿qué pasa si quiere tener variables Bash?

Las variables Bash son simples variables de programa que pueden almacenar una amplia variedad de entradas diferentes.

Para declarar una variable Bash, simplemente especifica el nombre de la variable y su valor separados por un signo igual.

VAR=value

Para poder utilizar el contenido de tu variable Bash en tu script, utiliza «$» y añade el nombre de tu variable.

echo $VAR

Aunque puede utilizar esta sintaxis para tener el valor de la variable, también puede utilizar la notación de «paréntesis».

echo ${VAR}

Usando esta sintaxis, las variables se pueden combinar entre sí.

Si tienes dos variables Bash llamadas VAR1 y VAR2 por ejemplo, puedes hacer que ambas se impriman usando la siguiente sintaxis

echo "${VAR1}${VAR2}"

Ejecutar comandos dentro de scripts

Para ejecutar comandos dentro de scripts Bash, tienes que usar la sustitución de comandos.

La sustitución de comandos es una técnica utilizada en los shells de Bash para almacenar el resultado de un comando en una variable.

Para sustituir un comando en Bash, utilice el signo de dólar y encierre su comando entre paréntesis.

VAR=$(command)

Por ejemplo, para obtener el resultado de los números de archivos en su directorio actual, usted escribiría

#!/bin/bashNUMBER=$(ls -l | wc -l)echo "${NUMBER} files in this directory!"

Como puede ver, la sustitución de comandos es bastante útil porque se puede utilizar para ejecutar dinámicamente comandos en un script de shell y devolver el valor al usuario.

Hablando de devolver resultados al usuario final, ¿cómo se manejan los scripts que no terminan correctamente?

¿Qué pasa si un comando dentro del script no se ejecutó correctamente?

Entendiendo los estados de salida

Cuando está ejecutando un script, incluso si no está devolviendo un valor, el script siempre devuelve lo que llamamos «un estado de salida».

Un estado de salida en los scripts Bash indica si la ejecución del script fue exitosa o no.

Si el código de estado es cero, su ejecución del script fue exitosa. Sin embargo, si el valor es diferente de cero (digamos uno, dos o más), indica que la ejecución del script no fue exitosa.

Para demostrar el estado de salida, ejecute cualquier comando válido en su shell bash.

echo "This is a simple working command"

Ahora, use este comando para inspeccionar el estado de salida del último comando ejecutado.

echo ${?}

Como puede ver, la salida de este comando es «0» o el estado de salida del último comando que ejecuté.

Esta sintaxis («${?}») se puede utilizar en los scripts para asegurarse de que los comandos se ejecutan correctamente.

El estado de salida se puede utilizar en los scripts para salir del script con un código de estado específico.

Por ejemplo, si quieres salir del script con un error, puedes usar el siguiente comando en tu script.

exit 1

De forma similar, puedes usar el código de salida «cero» para especificar que el script se ejecutó con éxito.

exit 0

Para verificar si el código de estado era correcto, vas a necesitar sentencias condicionales básicas como la sentencia IF.

Manipulación de condiciones en Bash

A veces, la ejecución de scripts bash no se trata sólo de tener varios comandos uno al lado del otro : quieres tener acciones condicionales.

En algunos casos, podría ser útil tener una condición que compruebe si el usuario actual es el usuario root (o sólo un usuario específico en su sistema).

Una forma sencilla de tener condiciones en Bash es utilizar la sentencia if.

«If» está incorporado en el shell, como consecuencia, el manual está disponible a través del comando «help»

$ help if

La página de ayuda describe la sintaxis del comando if utilizando puntos y comas, pero vamos a utilizar esta sintaxis (que es equivalente)

if ]then <commands>else <command>fi

Caso práctico : Comprobando si el usuario es root

Para mostrar para qué se puede utilizar la sentencia if, vamos a escribir un sencillo script comprobando si un usuario es el usuario root o no.

Como recordatorio, el usuario root siempre tiene el UID a cero en cualquier sistema Unix.

Conociendo esta información, vamos a comprobar si el UID está a cero, si es así, vamos a ejecutar el resto del script, en caso contrario vamos a salir del script.

Como se ha explicado en otros tutoriales (sobre administración de usuarios), se puede obtener el UID actual utilizando el comando «id».

$ id -u1000

Vamos a utilizar este comando para comprobar si el usuario que ejecuta el script es root o no.

Crea un nuevo script y añádele la línea shebang.

#!/bin/bash

Justo debajo, añade el comando «id» y almacena el resultado en una variable llamada «USERID» utilizando la sustitución de comandos.

USERID=$(id -u)

Ahora que el «USERID» contiene el ID de usuario actual, utilice una sentencia IF para comprobar si el ID de usuario es cero o no.

Si es el caso, escriba un simple mensaje informativo, si no salga del script con un estado de salida de 1.

if ]then echo "This is root"else exit 1fi

Ahora si ejecuta el script como su usuario actual, el script simplemente saldrá con un estado de salida de uno.

Ahora, intente ejecutar el script como usuario root (con el comando sudo)

Como puede ver, su mensaje informativo fue mostrado y el script salió con un código de error de cero.

Conclusión

En este tutorial, usted aprendió sobre el lenguaje de programación Bash y cómo se puede utilizar con el fin de crear scripts Bash en su sistema.

También aprendió sobre los estados de salida y las declaraciones condicionales que son clave con el fin de tener una lógica personalizada en sus scripts.

Ahora que tienes más conocimientos sobre Bash, deberías empezar a escribir tus propios scripts para tus necesidades: puedes empezar con un tutorial sobre la creación de archivos de copia de seguridad, por ejemplo.

Si estás interesado en la administración de sistemas Linux, tenemos una sección completa dedicada a ello en el sitio web, así que asegúrate de comprobarlo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.