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
  2. Yo uso otro sistema para verificar persmisos de root:
    if [[ $EUID -ne 0 ]]; then
    echo "This script must be run as root"
    exit 1
    fi

    ResponderEliminar

Publicar un comentario