2012-12-05 175 views
2

考慮以下僞代碼檢查當前時間定義的時間範圍內對UNIX

#!/bin/ksh 

rangeStartTime_hr=13 
rangeStartTime_min=56 
rangeEndTime_hr=15 
rangeEndTime_min=05 


getCurrentMinute() { 
    return `date +%M | sed -e 's/0*//'`; 
    # Used sed to remove the padded 0 on the left. On successfully find&replacing 
    # the first match it returns the resultant string. 
    # date command does not provide minutes in long integer format, on Solaris. 
} 

getCurrentHour() { 
    return `date +%l`; # %l hour (1..12) 
} 

checkIfWithinRange() { 
    if [[ getCurrentHour -ge $rangeStartTime_hr && 
      getCurrentMinute -ge $rangeStartTime_min ]]; then 
    # Ahead of start time. 
     if [[ getCurrentHour -le $rangeEndTime_hr && 
        getCurrentMinute -le $rangeEndTime_min]]; then 
      # Within the time range. 
      return 0; 
     else 
      return 1; 
     fi 
    else 
     return 1; 
    fi 
} 

是否有實施checkIfWithinRange()的更好的辦法? UNIX中是否有內置功能可以使上述操作更容易?我是korn腳本編程新手,希望能爲您提供幫助。

+0

什麼語言或環境是這樣嗎?標籤說'ksh',但看起來不像[Korn Shell](http://www.kornshell.com/)代碼。 –

+1

爲了擴展我的問題,Unix是一個操作系統(操作系統家族),而不是一種編程語言。如何與日期進行交互將取決於您的編程語言而不是您的操作系統。 Unix上的兩種標準編程環境是shell和C,但您的示例代碼既不是。是的,你將不得不存儲開始時間和結束時間,並將它們與當前時間進行比較。你如何做到這一點取決於你使用的語言和環境; C中的struct,shell中的變量或文件,Java中的對象,數據庫中的列。 –

+0

@BrianCampbell謝謝!我是UNIX新手,並且編寫了我想在korn shell中實現的示例僞代碼。在我自己嘗試後幾分鐘內會更新這個問題。 –

回答

2

return命令用於返回退出狀態,而不是任意字符串。這與許多其他語言不同。您可以使用stdout來傳遞數據:

getCurrentMinute() { 
    date +%M | sed -e 's/^0//' 
    # make sure sed only removes zero from the beginning of the line 
    # in the case of "00" don't be too greedy so only remove one 0 
} 

此外,您還需要更多的語法調用函數。目前您在文字字符串"getCurrentMinute"在if條件

if [[ $(getCurrentMinute) -ge $rangeStartTime_min && ... 

我會做比較,如果稍有不同

start=13:56 
end=15:05 

checkIfWithinRange() { 
    current=$(date +%H:%M) # Get's the current time in the format 05:18 
    [[ ($start = $current || $start < $current) && ($current = $end || $current < $end) ]] 
} 

if checkIfWithinRange; then 
    do something 
fi 
+0

謝謝@glenn的詳細解釋。將確認我的代碼,並返回.. –

相關問題