เนื่องจากฉันชอบลดส้อมและทุบตีจึงอนุญาตให้ใช้กลอุบายได้มากมายมีจุดประสงค์ของฉัน:
todate=2013-07-18
cond=2013-07-15
ตอนนี้ดี:
{ read todate; read cond ;} < <(date -f - +%s <<<"$todate"$'\n'"$cond")
สิ่งนี้จะเติมข้อมูลทั้งสองตัวแปรอีกครั้ง$todate
และ$cond
ใช้ส้อมเดียวเท่านั้นโดยมี ouptut ซึ่งdate -f -
ใช้stdioเพื่ออ่านวันที่ทีละบรรทัด
ในที่สุดคุณสามารถทำลายวงของคุณด้วย
((todate>=cond))&&break
หรือเป็นฟังก์ชั่น :
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
}
การใช้bashของ builtin ซึ่งprintf
สามารถแสดงเวลาวันที่ด้วยวินาทีจากยุค (ดูman bash
;-)
สคริปต์นี้ใช้ส้อมเดียวเท่านั้น
ทางเลือกที่มีส้อม จำกัด และฟังก์ชั่นเครื่องอ่านวันที่
สิ่งนี้จะสร้างกระบวนการย่อยเฉพาะ (หนึ่งส้อมเท่านั้น):
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
เมื่ออินพุตและเอาต์พุตเปิดอยู่ฟีเจอร์ห้ารายการอาจถูกลบได้
ฟังก์ชั่น:
myDate() {
local var="${@:$#}"
shift
echo >&99 "${@:1:$#-1}"
read -t .01 -u 98 $var
}
Notaเพื่อป้องกันการยกส้อมที่ไร้ประโยชน์เช่นtodate=$(myDate 2013-07-18)
นั้นตัวแปรจะถูกกำหนดโดยฟังก์ชั่นของตัวเอง และเพื่ออนุญาตให้ใช้ไวยากรณ์ฟรี (โดยมีหรือไม่มีเครื่องหมายอัญประกาศเพื่อถอดรหัส) ชื่อตัวแปรจะต้องเป็นอาร์กิวเมนต์สุดท้าย
จากนั้นเปรียบเทียบวันที่:
myDate 2013-07-18 todate
myDate Mon Jul 15 2013 cond
(( todate >= cond )) && {
printf "To: %(%c)T > Cond: %(%c)T\n" $todate $cond
break
}
อาจแสดงผล:
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
ถ้าอยู่นอกวง
หรือใช้ฟังก์ชั่นทุบตีเปลือกเชื่อมต่อ:
wget https://github.com/F-Hauri/Connector-bash/raw/master/shell_connector.bash
หรือ
wget https://f-hauri.ch/vrac/shell_connector.sh
(ไม่เหมือนกันทุกประการ: .sh
มีสคริปต์ทดสอบแบบเต็มหากไม่ได้มา)
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
}