respuesta específica bash
Como me gusta reducir los tenedores y bash permiten muchos trucos, ahí está mi propósito:
todate=2013-07-18
cond=2013-07-15
Bien ahora:
{ read todate; read cond ;} < <(date -f - +%s <<<"$todate"$'\n'"$cond")
Esto volverá a llenar ambas variables $todate
y $cond
, usando solo una bifurcación, con una salida date -f -
que toma el estándar para leer una fecha por línea.
Finalmente, podrías romper tu ciclo con
((todate>=cond))&&break
O como una función :
myfunc() {
local todate cond
{ read todate
read cond
} < <(
date -f - +%s <<<"$1"$'\n'"$2"
)
((todate>=cond))&&return
printf "%(%a %d %b %Y)T older than %(%a %d %b %Y)T...\n" $todate $cond
}
Uso de bash 's incorporado printf
que podría representar la fecha y hora con segundos de época (ver man bash
;-)
Este script solo usa una bifurcación.
Alternativa con horquillas limitadas y función de lector de fecha
Esto creará un subproceso dedicado (solo una bifurcación):
mkfifo /tmp/fifo
exec 99> >(exec stdbuf -i 0 -o 0 date -f - +%s >/tmp/fifo 2>&1)
exec 98</tmp/fifo
rm /tmp/fifo
Como la entrada y la salida están abiertas, se puede eliminar la entrada de fifo.
La función:
myDate() {
local var="${@:$#}"
shift
echo >&99 "${@:1:$#-1}"
read -t .01 -u 98 $var
}
Nota Para evitar tenedores inútiles como todate=$(myDate 2013-07-18)
, la variable debe ser establecida por la función misma. Y para permitir la sintaxis libre (con o sin comillas para la cadena de fechas), el nombre de la variable debe ser el último argumento.
Entonces la fecha de comparación:
myDate 2013-07-18 todate
myDate Mon Jul 15 2013 cond
(( todate >= cond )) && {
printf "To: %(%c)T > Cond: %(%c)T\n" $todate $cond
break
}
puede representar:
To: Thu Jul 18 00:00:00 2013 > Cond: Mon Jul 15 00:00:00 2013
bash: break: only meaningful in a `for', `while', or `until' loop
si fuera de un bucle
O use la función bash de conector de shell:
wget https://github.com/F-Hauri/Connector-bash/raw/master/shell_connector.bash
o
wget https://f-hauri.ch/vrac/shell_connector.sh
(Que no son exactamente iguales: .sh
contienen un script de prueba completo si no se obtiene)
source shell_connector.sh
newConnector /bin/date '-f - +%s' @0 0
myDate 2013-07-18 todate
myDate "Mon Jul 15 2013" cond
(( todate >= cond )) && {
printf "To: %(%c)T > Cond: %(%c)T\n" $todate $cond
break
}