bash özel cevap
Çatalları düşürmeyi sevdiğimden ve bash bir çok hile yapmaya izin verirse, amacım:
todate=2013-07-18
cond=2013-07-15
İyi şimdi:
{ read todate; read cond ;} < <(date -f - +%s <<<"$todate"$'\n'"$cond")
Bu, her iki değişkenleri yeniden doldurur $todate
ve $cond
bir ouptut ile sadece bir çatal kullanarak, date -f -
wich almak stdio hattı ile bir tarih okumak için.
Sonunda döngüsünü bozabilirsin
((todate>=cond))&&break
Veya bir işlev olarak :
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
}
Kullanılması bash 'nin yerleşik printf
wich ile tarih saat render olabilir çağdan saniye (bkz man bash
;-)
Bu komut dosyası yalnızca bir çatal kullanır.
Sınırlı çatal ve tarih okuyucu işleviyle alternatif
Bu özel bir alt işlem yaratacaktır (sadece bir çatal):
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
Giriş ve çıkış açık olduğundan, beş giriş silindi.
İşlev:
myDate() {
local var="${@:$#}"
shift
echo >&99 "${@:1:$#-1}"
read -t .01 -u 98 $var
}
Not: Faydasız çatalları önlemek için todate=$(myDate 2013-07-18)
, değişken fonksiyonun kendisi tarafından ayarlanmalıdır. Ve serbest sözdizimine izin vermek için (tarih işaretine tırnaklı veya tırnaksız), değişken ismi son argüman .
Ardından tarih karşılaştırması:
myDate 2013-07-18 todate
myDate Mon Jul 15 2013 cond
(( todate >= cond )) && {
printf "To: %(%c)T > Cond: %(%c)T\n" $todate $cond
break
}
yapabilir:
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
eğer bir döngünün dışındaysa.
Veya kabuk-bağlayıcı bash işlevini kullanın:
wget https://github.com/F-Hauri/Connector-bash/raw/master/shell_connector.bash
veya
wget https://f-hauri.ch/vrac/shell_connector.sh
( .sh
Tamamen aynı değildir: kaynaklanmadıysa tam test senaryosu içerir)
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
}