Crear tus propios scripts usando bash

Aprendiendo Linux

Con independencia de la distribución de Linux que estemos usando, ―qué duda cabe que mi preferida es Ubuntu― en cuanto nos adentramos en el uso de este sistema nos surgen determinadas necesidades de automatización. Es decir: crear nuestros comandos propios que realicen de forma personalizada determinados comandos. Esta necesidad puede obedecer a determinadas causas:

  • Simplificar la sintaxis de los comandos que habitualmente ejecutamos.
  • Efectuar acciones que cubran alguna necesidad que no esté prevista en el sistema operativo.
  • Secuenciar ordenes que asiduamente repetimos.

Aunque un script bash puede ser ejecutado en/desde cualquier directorio, por lo general se crea un directorio para albergar estos scripts. En mi caso:

$ mkdir /home/pedro/.bin

Creo este directorio (oculto al llevar el punto delante del nombre) para albergar ahí todos los scripts que uso. Que el nombre del directorio está oculto no tiene otra significación que ―a no ser que se especifique explicitamente lo contrario― no aparecerá cuando visualice /home/pedro desde el visualizador de archivos en modo gráfico.

Ahora hay que informar a Linux que debe también buscar en ese lugar (/home/pedro/.bin) las órdenes que se ejecuten desde el terminal.

$ PATH=$PATH;/home/pedro/.bin

De esta forma el sistema buscará ahí nuestras órdenes hasta que cerremos la sesión. Para hacer esta asociación permanente:

$ sudo nano /etc/environment

y añadimos

:/home/pedro/.bin

al final de la línea PATH, es muy importante no olvidar los dos puntos antes de la dirección del directorio que estamos incluyendo, ya que este es el mecanismo de adición.

Nuestro primer Script paso a paso

Creamos nuestro archivo, así en mi caso:

$ touch ~/.bin/donde

Y para editarlo, se puede usar vuestro editor preferido o seguir esta indicación:

$ gedit ~/.bin/donde &

Y añadimos el siguiente contenido:

#!/usr/bin/env bash

if [ $# -lt 1 ];
then
    echo "Necesitas pasar un parámetro"
else
    whereis $1
fi

Análisis del script

Nuestra línea primera llamada «shebang» (#!/usr/bin/env bash) pide a Linux que informe dónde se encuentra el intérprete de comandos bash y que lo que viene a continuación sea ejecutado conforme a los requerimientos de bash. Esta precaución es conveniente para asegurarnos que nuestros scripts funcionan en cualquier instalación. Otra posible shebang sereía:

#!/bin/bash

La diferencia entre ellas puede llegar a ser muy friki, y paso a explicarla. En esta última asumo que en nuestro sistema el intérprete de comandos bash está en la dirección /bin/bash. Sin embargo, en la que propongo en el script supongo que no sé dónde está el intérprete bash. Le pido al sistema que él proporcione esa dirección.

Tercera línea: Como se puede apreciar la segunda linea se trata de un if. Para bash los carácteres “$# contienen el número de parámetros que estamos pasando desde la linea de comandos. Por tanto, ” if [ $# -lt 1 ];” literalmente significa “si el número de parámetros es menor que 1”.

Cuarta linea: Then (traduciendo literalmente del ingés: entonces), aquí se indica que lo que viene a continuación va a ser ejecutado cuando la evaluación de la condición if sea cierta: en otras palabras el número de parámetros sea menor 1, o sea, cero.

Quinta línea: Si ejecutamos nuestro script sin parámetro alguno mostramos en el terminal “Necesitas pasar un parámetro”.

Sexta línea: Indica que lo que viene a continuación va a ejecutarse cuando la condición que hemos declarado no sea cierta.

Séptima línea: Se ejecuta el comando “whereis acompañado del contenido que nosotros hemos pasado como primer parámetro.

Octava línea: con “fi” se indica que finaliza el bloque if.

Probando nuestro Script

Es importante añadir permisos de escritura al script:

$ chmod -x ~/.bin/donde

Sin ello nos aparecería un error de “permiso denegado”. Tras eso, podemos ejecutar nuestro script.

$ donde php

Debería mostrarnos la localización del los binarios de php, sus archivos fuente, y páginas de manual. Algo así:

php: /usr/bin/php7.0 /usr/bin/php /usr/lib/php /etc/php 
/usr/share/php7.0-readline /usr/share/php7.0-json /usr/share/php7.0-opcache 
/usr/share/php7.0-common /usr/share/php /usr/share/man/man1/php.1.gz

Recapitulando

  • Habilitamos un directorio “.bin” para albergar nuestros scripts.
  • Proporcionamos información a Linux para que incluya este directorio en sus búsquedas de comandos.
  • Creamos nuestro script.
  • Diferencia entre distintos shebang.
  • Utilización del número de parámetros pasados con $#.
  • Utilización del primer parámetro con $1.

Espero y deseo que este script sea de vuestra utilidad.


4 comentarios

  1.   miguel dijo

    Muy bueno y bien explicado, pero a que se refiere con un parametro?

    1.    Pedro Ruiz Hidalgo dijo

      ¡Gracias Miguel!

      Entiendo por parámetro toda información complementaria que se suministra a un programa, función o sistema. Como esto puede ser engorroso, permíteme que te responda con unos ejemplos.

      En la orden de linux para copiar el fichero a.txt al fichero b.txt, escribiríamos lo siguiente:

      $ cp a.txt b.txt

      El programa cp aquí recibe dos parámetros que son los nombres de dos archivos, el primero (debe existir) a.txt y el segundo b.txt.

      Otro ejemplo: Si envías a imprimir desde la consola con la orden

      $ lp archivo.pdf

      En este caso “archivo.pdf” es un parámetro para el programa lp.

      Espero haber satisfecho tus dudas.

      Saludos

  2.   miguel dijo

    No salen mis comentarios, es una falta de respeto, no vuelvo mas a este foro.

    1.    Pedro Ruiz Hidalgo dijo

      Ignoro qué ha ocurrido, en cualquier caso este sí que se ha publicado.

      Saludos.

Escribe un comentario