确定由于月份(UTC时区)的冬季或夏令时

时间:2016-07-05 08:26:36

标签: arrays bash time

我正面临着我正在编写的bash脚本的问题。我是bash脚本的新手,所以我很乐意提供一些帮助或输入。

我们正在运行一台Appliance Server。不幸的是,我不允许更改此服务器的时区。所以我需要使用UTC时区。

现在我想创建一个应该在我们的维护时段晚上8点自动运行的脚本。现在问题是,UTC不知道夏季/冬季时间之间的区别。

所以我尝试了以下内容:

#!/bin/bash
array_time=("Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct")

ZONE=`date | cut -c 5-7`
echo $ZONE

if [[ " ${array_time[@]} " == " ${ZONE} " ]]; then
echo "SUMMERTIME CRONJOB"
else
echo "WINTERTIME CRONJOB"
fi

但由于某种原因,这是输出:

./test.sh
Jul
WINTERTIME CRONJOB

因此,即使值Jul是array_time变量的一部分,它也会转到if条件的else部分。我不确定为什么会这样。有人知道为什么吗?或者也许有人有更好的想法如何解决这个问题?

感谢您的帮助

欢呼声

2 个答案:

答案 0 :(得分:3)

根据您的原始目标,您可以定位修改时区,例如:

TZ=EST date
Tue Jul  5 03:54:39 EST 2016

TZ=EST date:执行TZ命令时,它将EST环境变量设置为date

您可以使用正则表达式或fgrep来搜索数组中的月份。

尝试一下:

#!/bin/bash
array_time=("Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct")

ZONE=$(date "+%b")

if [[ "${array_time[@]}" =~ "${ZONE}" ]] ; then
  printf "SUMMERTIME CRONJOB\n"
else
  printf "WINTERTIME CRONJOB\n"
fi

您还可以使用for循环。

首选使用$(...)执行命令。

鼓励使用printf代替echo

----

历史的第一个答案:

#!/bin/bash
array_time=("Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct")

ZONE=$(date "+%b")

if printf "%s\n" ${array_time[@]} | fgrep -q "${ZONE}" ; then
  printf "SUMMERTIME CRONJOB\n"
else
  printf "WINTERTIME CRONJOB\n"
fi

答案 1 :(得分:1)

您的问题出在:

[[ " ${array_time[@]} " == " ${ZONE} " ]]

永远不会成为现实,因为${array_time[@]}将扩展为:

[[ " Apr May Jun Jul Aug Sep Oct " == " ${ZONE} " ]]

并且$ZONE永远不会等于该字符串,使用以下代码将起作用:

[[ " ${array_time[@]} " == *" ${ZONE} "* ]]

另请注意,您可以使用date +'%b'代替date | cut ...