2017-08-04 438 views
0

此代碼的用途是打印1小時前的間隔。我有下面的代碼,但是具有麻煩從和到日期之間循環Bash循環遍歷日期時間+%Y-%m-%d%H:%M格式

to_dt=`date "+%Y-%m-%d %H:%M"` 
from_dt=`date -d "${to_dt} 1 hour ago" "+%Y-%m-%d %H:%M"` 

echo $from_dt $to_dt 

2017-08-04 01:54 2017-08-04 02:54 

while [ "${from_dt}" -lt "${to_dt}" ] 
do 

    from_dt=`date -d "${from_dt} 1 minute" "+%Y-%m-%d %H:%M"` 
    end_dt_min_after=`date -d "${from_dt} 1 minute" "+%Y-%m-%d %H:%M"` 

done 

我得到以下錯誤

線10:[:2017年8月4日02:01:整數表達預期

預期結果:

2017年8月4日01:55 2017年8月4日02:56

2017年8月4日01:56 2017年8月4日02:57

....

....

是有可能使用,而每個循環期間從日期即遞增1分鐘到迭代?

回答

1

我已經使用EPOC爲簡單起見,這裏。應該爲你的使用案例工作:

#!/bin/sh 

if [ -z $1 ];then 
echo Please pass number of seconds 
exit 1 
fi 

epoc_now=`date "+%s"` 

epoc_after_hour=`expr $epoc_now + $1` 

while [ "${epoc_after_hour}" -gt "${epoc_now}" ] 
do 
     epoc_now=`expr $epoc_now + 60` 
     date -d "@$epoc_now" 
done 
+0

謝謝。我圍繞這個使用原因玩耍​​,並能夠獲得理想的結果 – Dvusrgme

0

-lt運算符期望兩個操作數都是整數。

您應該在運行循環之前將日期變量轉換爲EPOCH秒值。

to_dt=$(date "+%s") 
from_dt=$(date -d "@$to_dt" -d "-1 hour" "+%s") 

while [ "$from_dt" -lt "$to_dt" ]; do 
    # add 1 minute 
    from_dt=$(date -d "@$from_dt" -d "+1 minute" '+%s') 
    echo "inside the loop" 
done 
+0

因某種原因只循環一次,我看到from_dt裏面大於to_date。雖然,我們設置from_dt小於to_dt – Dvusrgme

1

我會處理數字時間戳,直到打印時。 所以,你開始:

from_dt=$(($(date +%s -d "1 hour ago"))) 
to_dt=$(($(date +%s))) 

在循環增量from_dt 60每一次,然後打印時間戳可讀格式:

echo "$(date -d @$from_dt)" 
+0

謝謝,與@asatsi類似的用例。但是,我喜歡使用「1小時前」而不是減去秒數,因爲這可以非常容易地靈活地返回一個月。 – Dvusrgme

相關問題