Rutinas útiles para programación de scripts bash (I)

Hoy voy a escribir un breve post sobre algunas de las rutinas de programación que suelo utilizar muy a menudo en mis scripts bash, y que resultan muy importantes y útiles para resolver muchos problemas.

Una de las verificación más comunes y utilizadas en la programación de scripts es la de validar si un archivo existe o no. Para el intérprete bash, que es el que utilizaré en los ejemplos de aquí en adelante, es tan simple como escribir lo siguiente en un archivo de texto plano y ejecutarlo:

#!/bin/bash
echo "Verificando la existencia de un archivo."
if [ -f /etc/hosts ]; then
    # -- Si existe el archivo.
    echo "El archivo existe!"
else
    # -- Si no existe el archivo.
    echo "El archivo no existe!"
fi

Otro muy importante es verificar si existe un directorio, y en el caso de que no exista proceder a crearlo inmediatamente. Esto lo uso muy a menudo para organizar copias de seguridad en directorios específicos nombrados muchas veces de forma dinámica, la sentencia sería como sigue:
#!/bin/bash
# -- Definición de variable.
DIRECTORIO=/backups/ntop

# -- Creando directorios necesarios.
echo
echo " --> Preparando directorio $DIRECTORIO"
if [ ! -d $DIRECTORIO ]; then
    mkdir -vp $DIRECTORIO
fi

En alguna ocasión también tuve que comprobar que los entornos JDK estuviesen instalados, y determinar sus rutas de instalación para utilizarlos posteriormente, lo dejo a continuación como un caso anecdótico.
#!/bin/bash
# -- Se verifica la existencia de la ruta al JDK
echo -n "Comprobando path del JDK: "
if [ -d $JRE_PATH_SUNJDK ]; then
    JRE_PATH=$JRE_PATH_SUNJDK/jre
    echo "OK -> "$JRE_PATH
elif [ -d $JRE_PATH_OPENJDK ]; then
    JRE_PATH=$JRE_PATH_OPENJDK/jre
    echo "OK -> "$JRE_PATH
else
    echo "Error -> No hay ningún JDK instalado!"
    echo
    exit
fi

Otro muy interesante que he usado en un solo script fue el de verificar que el sistema operativo desde el cual se estaba ejecutando el programa era realmente una distribución de tipo Linux, no un BSD, Unix, etc.
#!/bin/bash
# -- Se verifica que el OS sea un linux.
echo -n "Comprobando sistema operativo: "
ESTE_OS=`uname`
if [ $ESTE_OS != 'Linux' ]; then
    echo "Error"
    echo "Sistema operativo no soportado!"
    exit
else 
    echo "Sistema operativo soportado"
fi

Ahora bien, ya sabemos como identificar si es un Linux o no, ahora toca identificar con que distribución específica de Linux estamos trabajando, para ello podemos hacer lo siguiente:
#!/bin/bash
echo " --> Identificar distribución de Linux"
if [ -f /etc/fedora-release ]; then
    # -- Si es fedora.
    echo "Estamos en una distribucion Fedora!"

elif [ -f /etc/SuSE-release ]; then
    # -- Si es openSUSE.
    echo "Estamos en una distribucion basada en SUSE Linux!"
fi
Sobre lo anterior una pequeña observación, el archivo /etc/"distro"-release no siempre suele ir asociado específicamente con una distribución única. Por ejemplo, en la distribución Oracle Linux (que es clon de RedHad obviamente) encontraremos "sorpresivamente" los archivos oracle-release y redhat-release, que al consultarlos por separado tendremos la siguiente salida en pantalla:
[testsrv ~]# cat /etc/oracle-release
Oracle Linux Server release 6.2
[testsrv ~]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 6.2 (Santiago)
[testsrv ~]#
Lo mismo sucede con CentOS, pero que a diferencia de OL al menos han cambiado el contenido del archivo /etc/redhat-release jaja..
[testsrv ~]# cat /etc/redhat-release
CentOS release 6.2 (Final)  
[testsrv ~]# cat /etc/centos-release
CentOS release 6.2 (Final)
[testsrv ~]#

Pero no nos desviemos tanto, volviendo a las rutinas útiles se encuentra la de identificar si estamos conectados con el usuario root antes de proceder a realizar una acción. En el siguiente script también se utiliza el comando sudo para lanzar un script en modo root, pero es importante aclarar que esto solo funcionará bien en openSUSE debido a que en esta distribución la configuración por defecto del sudo permite implementarlo de esta manera, en las demás distros el comportamiento no será el mismo.
#!/bin/bash
# Antes que nada se verifica que el operador se encuentre conectado
# con el usuario root.
echo -n "Comprobando ejecucion con usuario root: "
if [ $LOGNAME != 'root' ]; then
    echo "Error"
    echo
    echo " - Para ejecutar este script debe estar conectado con el usuario root!"
    echo " - A continuación se le pedirá la contraseña del usuario root:"
    sudo sh configurar_netbeans.sh
    exit
else 
    echo "OK"
fi

Y por último uno de los más sencillos pero del cual nunca me acuerdo, el de listar con un loop los archivos que se encuentran en el directorio en donde se ha ubicado y/o ejecutado el script. A continuación va el correspondiente ejemplo:
#!/bin/bash
# Backup de Proyectos SVN
echo
echo "-->Archivos Logs."
echo "==============================="
cd /var/log
for LOG_FILE_NAME in *.log
do
    ls -l $LOG_FILE_NAME
done

Y por hoy esto ha llegado hasta acá, en el futuro pienso ir ampliado esta saga de Rutinas útiles para programación de scripts bash con la entrega número II, ya que siempre van apareciendo otros trucos y rutinas útiles dignas de ser documentadas.

Comentarios

  1. que pasa con la parte dos del post, ¿no va a llegar nunca?

    ResponderEliminar
    Respuestas
    1. Supongo que ya no más jaja, en realidad estoy muy ocupado con el trabajo, y me queda poco tiempo para dedicarle al blog y principalmente a este tipo de artículos.

      De todas formas quiero encarar nuevos proyectos personales dentro de poco y veremos si tengo algo que contar al respecto.

      Saludos!

      Eliminar

Publicar un comentario

Entradas populares