问题:我需要检查今天是否是星期四,并根据这种情况的结果执行不同的操作。我尝试了两种不同的方法:
获取日期名称:
DAYOFWEEK=$(date +"%a")
echo DAYOFWEEK: $DAYOFWEEK
if ["$DAYOFWEEK" == "Thu"];
then
echo YES
else
echo NO
fi
获取天数:
DAYOFWEEK=$(date +"%u")
echo DAYOFWEEK: $DAYOFWEEK
if ["$DAYOFWEEK" == 4];
then
echo YES
else
echo NO
fi
在这两种情况下,输出都是“否”,尽管它应该是“是”。怎么了?
答案1
问题是缺少空白。
以下代码将在其[
内置命令接受==
作为别名的shell 中运行=
:
if [ "$DAYOFWEEK" == 4 ]; then echo YES; else echo NO; fi
但请记住(参见help test
)bash
:
==
没有正式提到,你应该用于=
字符串比较-eq
用于十进制算术测试(这里不会产生任何影响,但例如在比较数字上相同但词汇上不同的情况时date +%u
会产生影响)。date +%d
04
4
我会比较喜欢:
if [ "${DAYOFWEEK}" -eq 4 ]; then echo YES; else echo NO; fi
一般来说,您应该更喜欢这一天数字方法,因为它对当前的依赖较少语言环境。在我的系统上,输出date +"%a"
是 Today Do
。
答案2
不要忽视case
哪种方法通常是做此类事情的更好方法:
另请注意, 的输出date +%a
取决于区域设置,因此,如果您期望英文名称,则您的脚本在被法语或韩语用户调用时将停止工作。
case $(LC_ALL=C date +%a) in
(Mon) echo first day of the week;;
(Thu) do-something;;
(Sat|Sun) echo week-end;;
(*) echo any other day;; # last ;; not necessary but doesn't harm
esac
$(...)
请注意,上面是不需要引用的罕见情况之一 (尽管引号不会造成损害。与 中相同var="$(...)"
)。
答案3
同样的想法,我使用下面的代码在选定的时间之前“禁用” cron
当然,我宁愿修改 crontab 本身...如果我被授予必要的权限:)
这是一个简单的测试,除非我们在晚上,否则它会中止 bash 脚本。
# Delay or restrict execution.
# Here, we quit unless hour is greater than (gt) 2 and (-a) lower than (lt) 7
# i.e. execution happens only at 3,4,5&6 o'clock.
if /usr/bin/test `date '+%H'` -gt 2 -a `date '+%H'` -lt 7; then
echo LETS_START_PROCESSING;
else
exit;
fi
#Put job here
答案4
首先,您应该引用赋值 DAYOFWEEK="$(date +%u)"
并且 [ 和 ] 括号两边都需要有空格。
行尾的分号是多余的。