bash câu trả lời cụ thể
Vì tôi muốn giảm dĩa và bash cho phép rất nhiều mánh khóe, nên có mục đích của tôi:
todate=2013-07-18
cond=2013-07-15
Chà, bây giờ:
{ read todate; read cond ;} < <(date -f - +%s <<<"$todate"$'\n'"$cond")
Điều này sẽ điền lại cả hai biến $todate
và $cond
, chỉ sử dụng một ngã ba, với ouptut của date -f -
wich mất stdio để đọc một ngày theo dòng.
Cuối cùng, bạn có thể phá vỡ vòng lặp của mình với
((todate>=cond))&&break
Hoặc như một chức năng :
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
}
Sử dụng công cụ dựng sẵn của bashprintf
có thể hiển thị thời gian ngày bằng giây từ epoch (xem man bash
;-)
Kịch bản này chỉ sử dụng một ngã ba.
Thay thế với dĩa giới hạn và chức năng đọc ngày
Điều này sẽ tạo ra một quy trình con chuyên dụng (chỉ một ngã ba):
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
Khi đầu vào và đầu ra được mở, mục nhập fifo có thể bị xóa.
Chức năng:
myDate() {
local var="${@:$#}"
shift
echo >&99 "${@:1:$#-1}"
read -t .01 -u 98 $var
}
Nota Để ngăn chặn các nhánh vô dụng như thế todate=$(myDate 2013-07-18)
, biến phải được đặt bởi chính hàm. Và để cho phép cú pháp miễn phí (có hoặc không có dấu ngoặc kép để xác thực), tên biến phải là đối số cuối cùng .
Sau đó so sánh ngày:
myDate 2013-07-18 todate
myDate Mon Jul 15 2013 cond
(( todate >= cond )) && {
printf "To: %(%c)T > Cond: %(%c)T\n" $todate $cond
break
}
có thể kết xuất:
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
nếu bên ngoài một vòng lặp.
Hoặc sử dụng chức năng bash shell-Connector:
wget https://github.com/F-Hauri/Connector-bash/raw/master/shell_connector.bash
hoặc là
wget https://f-hauri.ch/vrac/shell_connector.sh
(Không hoàn toàn giống nhau: .sh
không chứa tập lệnh kiểm tra đầy đủ nếu không có nguồn gốc)
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
}