korn shell中的测试日期逻辑

时间:2016-01-28 17:13:50

标签: shell

我正在寻找一种方法来测试不同日期和时间的以下korn shell日期逻辑。我没有root权限来更改系统上的实际日期。

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

2 个答案:

答案 0 :(得分: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 "$@" +'%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

如果您不想使用"$@",并且不介意特定于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')
  ...
}

...仅当-d "$for_date"设置为非空值时才会传递for_date

答案 1 :(得分: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。