Hoy me he encontrado un pequeño problema: quiero ejecutar un script en el cual necesito saber la fecha de ayer. PERO el sistema operativo es HP-UX.
¿Que pasa con este SO (y la mayoría de Unix en general, excepto Linux)? Pues que el comando date no tiene la opción de calcular fechas pasada (ni futuras), con lo que resulta un poco complicado obtener el valor de una fecha pasada para usarlo como parámetro en cualquier programa.
Para poder conseguir esto he montado el siguiente script, que aviso que no soy precisamente un experto en shell script:
!/bin/sh
YEAR=`date "+%Y"`
MONTH=`date "+%m"`
DAY=`date "+%d"`
RESTA=1
DAY=$(($DAY+0))
MONTH=$(($MONTH+0))
if [ $# -gt 0 ] ; then
if [ $1 -gt 1 -a $1 -lt 9999 ] ; then
RESTA=$1
fi
fi
c=1
while [ $c -le $RESTA ]
do
DAY=$(($DAY-1))
if [ $DAY = "0" ] ; then
MONTH=$(($MONTH-1))
DAY=28
if ! [ $MONTH = "2" ]; then
DAY=$(($DAY+2))
fi
if [ $MONTH = "1" -o $MONTH = "3" -o $MONTH = "5" -o $MONTH = "7" -o $MONTH = "8" -o $MONTH = "10" -o $MONTH = "12" ] ; then
DAY=$(($DAY+1))
fi
if [ $MONTH = "2" ] ; then
if [ `expr $YEAR % 4` = 0 -o `expr $YEAR % 400` = 0 ] ; then
if ! [ `expr $YEAR % 400` = 0 ] ; then
DAY=29
fi
fi
fi
fi
if [ $MONTH = "0" ] ; then
MONTH="12"
YEAR=$(($YEAR-1))
fi
c=$(($c+1))
done
if [ $MONTH -lt 10 ] ; then
MONTH=0$MONTH
fi
if [ $DAY -lt 10 ] ; then
DAY=0$DAY
fi
echo $YEAR-$MONTH-$DAY
El código puede que no sea lo más óptimo, pero tiene en cuenta los años bisiestos y si le indicas un número como parámetros, resta esa cantidad de días a la fecha actual.
Lo he limitado a un máximo de 9999 días, pero es por poner algun límite.
El formato de salida es fijo a YYYY-MM-DD. Si alguien quiere otro formato de salida, solo tiene que modificar la última línea y poner lo que mas le interese.
Espero que sea de utilidad, y si alguien optimiza el código, pues se agradece ;)