我正在寻找一种方法来测试不同日期和时间的以下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
答案 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_DAY
和CUR_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。