bash risposta specifica
Dato che mi piace ridurre forchette e bash che permettono molti trucchi, c'è il mio scopo:
todate=2013-07-18
cond=2013-07-15
Bene ora:
{ read todate; read cond ;} < <(date -f - +%s <<<"$todate"$'\n'"$cond")
Questo ripopolerà entrambe le variabili $todate
e $cond
, usando solo un fork, con l'output del quale date -f -
prenderà stdio per leggere una data per riga.
Infine, potresti rompere il ciclo con
((todate>=cond))&&break
O come una funzione :
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
}
L'uso dell'integrato di bashprintf
che potrebbe rendere l'ora della data con i secondi dall'epoca (vedi man bash
;-)
Questo script usa solo un fork.
Alternativa con forchette limitate e funzione di lettura della data
Ciò creerà un sottoprocesso dedicato (solo un fork):
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
Poiché input e output sono aperti, è possibile eliminare la quinta voce.
La funzione:
myDate() {
local var="${@:$#}"
shift
echo >&99 "${@:1:$#-1}"
read -t .01 -u 98 $var
}
Nota Al fine di prevenire forche inutili come todate=$(myDate 2013-07-18)
, la variabile deve essere impostata dalla funzione stessa. E per consentire la sintassi libera (con o senza virgolette per il datestring), il nome della variabile deve essere l'ultimo argomento.
Quindi data confronto:
myDate 2013-07-18 todate
myDate Mon Jul 15 2013 cond
(( todate >= cond )) && {
printf "To: %(%c)T > Cond: %(%c)T\n" $todate $cond
break
}
può rendere:
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
se al di fuori di un ciclo.
Oppure usa la funzione bash del connettore shell:
wget https://github.com/F-Hauri/Connector-bash/raw/master/shell_connector.bash
o
wget https://f-hauri.ch/vrac/shell_connector.sh
(Che non sono esattamente gli stessi: .sh
contengono script di test completi se non forniti)
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
}