我正面临着我正在编写的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部分。我不确定为什么会这样。有人知道为什么吗?或者也许有人有更好的想法如何解决这个问题?
感谢您的帮助
欢呼声
答案 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 ...