我正面临一个我正在写的bash脚本的问题。我对bash脚本非常陌生,所以我很乐意得到一些帮助或输入。
我们正在运行一个Appliance。不幸的是,我不允许更改此服务器的时区。所以我需要和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条件的其他部分。我不知道为什么会这样。有人知道为什么吗?或者有人有更好的办法解决这个问题?
谢谢你的帮忙
干杯
发布于 2016-07-05 08:59:06
你的问题在于:
[[ " ${array_time[@]} " == " ${ZONE} " ]]由于${array_time[@]}将被展开为:
[[ " Apr May Jun Jul Aug Sep Oct " == " ${ZONE} " ]]而$ZONE永远不等于该字符串,使用以下方法可以工作:
[[ " ${array_time[@]} " == *" ${ZONE} "* ]]还请注意,您可以使用date +'%b'而不是date | cut ...
发布于 2016-07-05 08:42:53
根据您最初的目标,您可以局部地修改时区,例如:
TZ=EST date
Tue Jul 5 03:54:39 EST 2016TZ=EST date:在执行date命令时,它正在将TZ环境变量设置为EST。
可以使用正则表达式或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"
fihttps://stackoverflow.com/questions/38198600
复制相似问题