2016-01-28 85 views
0

我正在尋找一種方法來測試以下korn shell日期邏輯的不同日子和時間。我沒有root訪問權限來更改系統上的實際日期。korn shell中的測試日期邏輯

CUR_DAY=$(TZ="US/Eastern" date +%a) 
typeset -i CUR_HOUR=$(TZ="US/Eastern" date +%H) 

# Set the start and end hour given in eastern time 
typeset -i START_HOUR=22 
typeset -i END_HOUR=7 

case $CUR_DAY in 
    Sun) 
     if [[ $CUR_HOUR -ge $START_HOUR ]] 
     then 
     echo "Send message1" 
     fi;; 
    Mon|Tue|Wed|Thu) 
     if [[ $CUR_HOUR -ge $START_HOUR || $CUR_HOUR -lt $END_HOUR ]] 
     then 
     echo "Send message2" 
     fi;; 
    Fri) 
     if [[ "$CUR_HOUR" -lt $END_HOUR ]] 
     then 
     echo "Send message3" 
     fi;; 
esac 
+0

哪個版本? ksh93的? ksh88?克隆如mksh?你可以依靠有GNU日期嗎? –

+0

順便說一句,你自己的變量的大寫名字是不好的形式 - 這個名字空間是爲系統或shell特有的變量保留的;請參閱http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html的第四段,請記住,環境變量和shell變量共享一個名稱空間。 –

+0

你的星期四邏輯應該是'開始<=當前&&當前結束' - 你現在擁有的是:*任何*小時都可以:小時23是> = 7,小時3 <22 –

回答

1

測試最簡單的方法是將-d參數有條件地添加到date(假設GNU執行),通過它,你打算測試函數的行爲的具體日期和時間。

下面直通到date傳遞參數,允許調用,以適應酌情:

check_dates() { 
    typeset cur_day cur_hour start_hour end_hour 

    # call external date command only once to minimize external process overhead 
    read -r cur_day cur_hour < <(TZ="US/Eastern" date "[email protected]" +'%a %H') 

    # trim leading 0s -- otherwise, values will be seen as octal when performing math 
    cur_day=${cur_day#0}; cur_hour=${cur_hour#0} 

    start_hour=22 
    end_hour=8 

    case $cur_day in 
     Sun) 
      if ((cur_hour <= start_hour)); then 
       echo "Send message1" 
      fi 
      ;; 
     Mon|Tue|Wed|Thu) 
      if ((cur_hour >= start_hour)) || ((cur_hour < end_hour)); then 
       echo "Send message2" 
      fi 
      ;; 
     Fri) 
      if ((cur_hour < end_hour)); then 
       echo "Send message3" 
      fi 
      ;; 
    esac 
} 

其後:

check_dates        # check for current date and time 
check_dates -d '2015-01-06 03:00:00 UTC' # check for a specific date and time 

如果你傾向於不使用"[email protected]" ,並且不介意特定於GNU日期的硬編碼行爲,請考慮:

check_dates() { 
    typeset cur_day cur_hour for_date 
    for_date=$1 

    read -r cur_day cur_hour < <(TZ="US/Eastern" date ${for_date:+ -d "$for_date"} +'%a %H') 
    ... 
} 

...僅當for_date設置爲非空值時才通過-d "$for_date"

+0

ksh(ksh93無論如何)對於無效的八進制數似乎沒有問題:'((09> = 7))&& echo ok' –

+1

Good to知道。爲了便於攜帶,我仍然傾向於保留這些代碼,因爲它提供的代碼也適用於bash。 –

+0

對。請注意,cur_day將不會有任何零。 –

1

如果你想測試只是邏輯(而不是date正常工作),然後讓你的腳本接受CUR_DAYCUR_HOUR作爲參數或通過環境,而不是始終運行date

通過環境(CUR_DAY=9 CUR_HOUR=22 myscript

: ${CUR_DAY:=$(date +%a)} 
: ${CUR_HOUR:=$(date +%H)} 

通過參數(myscript 9 22

CUR_DAY=${1:-$(date +%a)} 
CUR_HOUR=${2:-$(date +%H)} 

兩種方法都將在任何兼容POSIX的shell工作。

+0

嘿。我實際上是這樣開始的,然後改變了主意並退出了。 (我的答案的第一個修訂版留下了遺留的痕跡,使用'$ {1:-...}'作爲cur_day而不是cur_hour)。 –

+0

......可以說,測試'date'的行爲是很重要的:如果我沒有回溯並做出這個決定,我就不會拿出將0作爲八進制開始的值的shell的兼容性問題。 –

+0

'date'是一個外部依賴項,所以你需要以不同的方式進行測試。如果你將依賴注入推向極端,你甚至不需要對'date'命令進行硬編碼;您可以爲(腳本)提供日期參數的(外部)命令的名稱。 – chepner