
如何在 shell 中比較兩個日期?
這是我想如何使用它的範例,儘管它不能按原樣工作:
todate=2013-07-18
cond=2013-07-15
if [ $todate -ge $cond ];
then
break
fi
我怎樣才能達到預期的結果?
答案1
正確答案仍然缺失:
todate=$(date -d 2013-07-18 +%s)
cond=$(date -d 2014-08-19 +%s)
if [ $todate -ge $cond ];
then
break
fi
請注意,這需要 GNU 日期。date
BSD 的等效語法date
(預設在 OSX 中找到)是date -j -f "%F" 2014-08-19 +"%s"
答案2
可以使用 ksh 樣式的字串比較來比較 [年、月、日格式的字串] 的時間順序。
date_a=2013-07-18
date_b=2013-07-15
if [[ "$date_a" > "$date_b" ]] ;
then
echo "break"
fi
值得慶幸的是,當[使用 YYYY-MM-DD 格式的字串]按字母順序排序*時,它們也按時間順序排序*。
(* - 排序或比較)
在這種情況下不需要任何花哨的東西。耶!
答案3
您缺少比較的日期格式:
#!/bin/bash
todate=$(date -d 2013-07-18 +"%Y%m%d") # = 20130718
cond=$(date -d 2013-07-15 +"%Y%m%d") # = 20130715
if [ $todate -ge $cond ]; #put the loop where you need it
then
echo 'yes';
fi
您也缺少循環結構,您打算如何獲得更多日期?
答案4
此運算符-ge
僅適用於整數,而您的日期則不適用於整數。
如果您的腳本是 bash、ksh 或 zsh 腳本,則可以改用該<
運算子。該運算子在 dash 或其他不超出 POSIX 標準的 shell 中不可用。
if [[ $cond < $todate ]]; then break; fi
在任何 shell 中,您只需刪除破折號即可將字串轉換為數字,同時尊重日期順序。
if [ "$(echo "$todate" | tr -d -)" -ge "$(echo "$cond" | tr -d -)" ]; then break; fi
或者,您可以採用傳統方式並使用該expr
實用程式。
if expr "$todate" ">=" "$cond" > /dev/null; then break; fi
由於在循環中呼叫子進程可能會很慢,因此您可能更喜歡使用 shell 字串處理結構進行轉換。
todate_num=${todate%%-*}${todate#*-}; todate_num=${todate_num%%-*}${todate_num#*-}
cond_num=${cond%%-*}${cond#*-}; cond_num=${cond_num%%-*}${cond_num#*-}
if [ "$todate_num" -ge "$cond_num" ]; then break; fi
當然,如果您首先可以檢索不帶連字符的日期,您將能夠將它們與-ge
.