Hola compañeros de la shell,
En esta entrada vamos a dejar escritas algunas funciones genéricas que pueden ayudarnos a acelerar la escritura de diversos scripts. Se recomienda usar todas en conjunto por si hubiera alguna referencia a variables definidas en estas funciones.
#!/bin/bash
###################################################################################
# Script: nameScript.ksh
# Version: 1.00
#
# Descripcion: Lorem ipsum
#
# (Descripcion de los codigos de salida del script)
# Salida: 0 = Con exito
# !=0 Finalizacion incorrecta (error de parametros o anulado por usuario)
#
# Control de versiones:
# v.1.00 (Fecha): Creacion del script
#
####################################################################################
#
### -------------------- Gestion de senyales -------------------------- ####
#
trap 'f_signal 1; exit' 1
trap 'f_signal 2; exit' 2
trap 'f_signal 3; exit' 3
trap 'f_signal 9; exit' 9 # 9 no es atrapable
trap 'f_signal 10; exit' 10
trap 'f_signal 11; exit' 11
trap 'f_signal 14; exit' 14
trap 'f_signal 15; exit' 15
trap 'f_signal 19; exit' 19
trap 'f_signal 23; exit' 23
trap 'f_signal 30; exit' 30
trap 'f_signal 31; exit' 31
#
### -------------------- Variables -------------------------- ####
#
# Globales
PARAMETROS=$@
MIN_PARAM=2
MAX_PARAM=2
CERO=0
YES="Y"
NO="N"
# Directorios
INIDIR=`basename $0 | sed '1,$s#\..*##g'`
CFGDIR=${INIDIR}/cfg
LOGDIR=${INIDIR}/logs
TMPDIR=${INIDIR}/tmp
SQLDIR=${INIDIR}/sql
# Ficheros
LOGFILE=${LOGDIR}/`basename $0 | sed '1,$s#\..*##g'`_$$_`date +'%Y%m%d_%H%M%S'`.log
CFGFILE=${CFGDIR}/`basename $0 | awk -F"." '{print $1}'`.cfg
# Global
# Errores criticos contemplados
ERR_PARAM=1 # Parametros pasados al script erroneos
#
### -------------------- Funciones -------------------------- ####
#
f_fecha_hora()
{
# Escribe la fecha y la hora en un mismo formato para todo el script
# Llamar a esta funcion cada vez que se quiera escribir la hora
# Hacer llamadas frecuentes para controlar los tiempos de cada fase del proceso
FECHA=`date +'%d-%m-%Y'`
HORA=`date +'%H:%M:%S'`
echo "[${FECHA} ${HORA}]"
# Ejemplo de uso:
# echo "`f_fecha_hora` - [`basename $0`] : Que me estas contando" | tee -a ${LOGFILE}
}
f_signal ()
{
# Funcion que gestiona las senyales atrapadas mediante trap
SALIDA=300
SIGNAL=$1
echo | tee -a ${LOGFILE}
echo | tee -a ${LOGFILE}
echo " f_fecha_hora **** INTERRUPCION -> RECIBIDA SIGNAL ${SIGNAL} !!!" | tee -a ${LOGFILE}
echo | tee -a ${LOGFILE}
echo " DETENIDO POR EL USUARIO !!!" | tee -a ${LOGFILE}
echo " DETENIDO POR EL USUARIO !!!" | tee -a ${LOGFILE}
echo " DETENIDO POR EL USUARIO !!!" | tee -a ${LOGFILE}
echo | tee -a ${LOGFILE}
echo " f_fecha_hora **** INTERRUPCION -> RECIBIDA SIGNAL ${SIGNAL} !!!" | tee -a ${LOGFILE}
echo | tee -a ${LOGFILE}
echo "`f_fecha_hora` - Ejecucion interrumpida" | tee -a ${LOGFILE}
mv $LOGFILE echo $LOGFILE | sed 's#\.log#.KO.log#g'
}
f_checkExec ()
{
# Si el primer parametro que recibe es distinto de 0 sale con ese codigo
C_EXIT=${1}
C_MESSAGE=${2}
if [ "X${C_EXIT}" != "X0" ]
then
echo -e "\n\t${C_MESSAGE} : ERROR ${C_EXIT}" | tee -a ${LOGFILE}
mv $LOGFILE `echo $LOGFILE | sed 's#\.log#.KO.log#g'`
exit ${C_EXIT}
fi
}
f_help ()
{
# Funcion de ayuda
echo
echo " + Script: `basename $0`"
echo
echo " + Descripcion: Lorem ipsum"
echo ""
echo " + Pre-requisitos:"
echo ""
echo " 1. Lorem ipsum"
echo
echo " + Ejecucion:"
echo
echo " basename $0 -a:Lorem ipsum -b:Lorem ipsum"
echo
echo " + Ejemplo de ejecucion:"
echo
echo " basename $0 -a:Lorem ipsum -b:Lorem ipsum"
}
f_getParams ()
{
# Funcion encargada del trato de parametros.
if [ $# -lt $MIN_PARAM ] || [ $# -gt $MAX_PARAM ]
then
f_help
f_checkExec $ERR_PARAM "- ERROR $ERR_PARAM: Parametros incorrectos"
fi
for i in "$@"
do
ARG=$i
PARAM=`echo $ARG | cut -d":" -f1`
VALOR=`echo $ARG | cut -d":" -f2`
case $PARAM in
-a)
LO_QUE_SEA=0
;;
-b)
LO_QUE_SEA2=0
;;
*)
f_help
f_checkExec $ERR_PARAM "- ERROR $ERR_PARAM: Parametros incorrectos"
esac
done
# Comprobamos parametros
if ! echo ${LO_QUE_SEA2} | egrep "^[+-]?[0-9]*$" 2>/dev/null 1>&2
then
f_help
f_checkExec $ERR_N_NO_NUM "- ERROR $ERR_N_NO_NUM: El parametro -n: debe ser numero entero."
fi
}
f_createFilesDirs ()
{
# Funcion que crea los ficheros y directorios necesarios para la ejecucion del script
mkdir -p $INIDIR
mkdir -p $CFGDIR
mkdir -p $LOGDIR
mkdir -p $TMPDIR
mkdir -p $SQLDIR
touch $LOGFILE
# Si no existe creamos el fichero de configuracion por defecto
if ! [ -r ${CFGFILE} ]
then
echo "# Fichero de configuracion `basename $0`" > ${CFGFILE}
echo "# Fecha de modificacion en dias a partir de la cual se eliminan logs" >> ${CFGFILE}
echo "MANTLOGTIME:365" >> ${CFGFILE}
fi
}
f_logHead ()
{
# Funcion que imprime la cabecera del log
HOSTNAME=`hostname`
echo "\n------------------------------------------------------------------------------------------------------------ " > ${LOGFILE}
echo "\n`basename $0` \n" >> ${LOGFILE}
echo "\tHost: ${HOSTNAME}" >> ${LOGFILE}
echo "\tFecha: date " >> ${LOGFILE}
echo "\tEjecucion: basename $0 ${PARAMETROS}" >> ${LOGFILE}
echo "\n------------------------------------------------------------------------------------------------------------ \n" >> ${LOGFILE}
echo >> ${LOGFILE}
}
f_maintenance ()
{
# Funcion para el mantenimiento de logs etc
LOGFILESTR="*.log"
MANTLOGTIME=`cat $CFGFILE | grep -v "#" | grep MANTLOGTIME | awk -F":" '{print $2}'`
cd $LOGDIR
find $PRUNE -mtime +${MANTLOGTIME} -name "$LOGFILESTR" -exec rm -f {} \;
cd $OLDPWD
}
f_exit ()
{
# Funcion fin script
if [ $SALIDA -eq $CERO ]
then
mv $LOGFILE `echo $LOGFILE | sed 's#\.log#.OK.log#g'`
else
mv $LOGFILE `echo $LOGFILE | sed 's#\.log#.KO.log#g'`
fi
exit $SALIDA
}
#
### -------------------- Main - Principal ------------------------- ####
#
f_getParams "$@"
