
¿Cómo se pueden comparar dos fechas en un caparazón?
Aquí hay un ejemplo de cómo me gustaría usar esto, aunque no funciona como está:
todate=2013-07-18
cond=2013-07-15
if [ $todate -ge $cond ];
then
break
fi
¿Cómo puedo lograr el resultado deseado?
Respuesta1
Aún falta la respuesta correcta:
todate=$(date -d 2013-07-18 +%s)
cond=$(date -d 2014-08-19 +%s)
if [ $todate -ge $cond ];
then
break
fi
Tenga en cuenta que esto requiere la fecha GNU. La sintaxis equivalente date
para BSD date
(como la que se encuentra en OSX de forma predeterminada) esdate -j -f "%F" 2014-08-19 +"%s"
Respuesta2
Puede utilizar una comparación de cadenas de estilo ksh para comparar el orden cronológico [de cadenas en formato de año, mes y día].
date_a=2013-07-18
date_b=2013-07-15
if [[ "$date_a" > "$date_b" ]] ;
then
echo "break"
fi
Afortunadamente, cuando [las cadenas que usan el formato AAAA-MM-DD] se ordenan* en orden alfabético, también se ordenan* en orden cronológico.
(* - ordenado o comparado)
En este caso no se necesita nada sofisticado. ¡Hurra!
Respuesta3
Te falta el formato de fecha para la comparación:
#!/bin/bash
todate=$(date -d 2013-07-18 +"%Y%m%d") # = 20130718
cond=$(date -d 2013-07-15 +"%Y%m%d") # = 20130715
if [ $todate -ge $cond ]; #put the loop where you need it
then
echo 'yes';
fi
También te faltan estructuras en bucle, ¿cómo planeas conseguir más fechas?
Respuesta4
El operador -ge
solo funciona con números enteros, que no son sus fechas.
Si su script es bash, ksh o zsh, puede usar el <
operador en su lugar. Este operador no está disponible en guión ni en otros shells que no vayan mucho más allá del estándar POSIX.
if [[ $cond < $todate ]]; then break; fi
En cualquier shell, puede convertir las cadenas en números respetando el orden de las fechas simplemente eliminando los guiones.
if [ "$(echo "$todate" | tr -d -)" -ge "$(echo "$cond" | tr -d -)" ]; then break; fi
Alternativamente, puedes volverte tradicional y usar la expr
utilidad.
if expr "$todate" ">=" "$cond" > /dev/null; then break; fi
Como la invocación de subprocesos en un bucle puede ser lenta, es posible que prefiera realizar la transformación utilizando construcciones de procesamiento de cadenas de shell.
todate_num=${todate%%-*}${todate#*-}; todate_num=${todate_num%%-*}${todate_num#*-}
cond_num=${cond%%-*}${cond#*-}; cond_num=${cond_num%%-*}${cond_num#*-}
if [ "$todate_num" -ge "$cond_num" ]; then break; fi
Por supuesto, si puedes recuperar las fechas sin los guiones en primer lugar, podrás compararlas con -ge
.