如何使用Bash或Perl检查今天是否是周末?
我希望在周末阻止某些程序运行。
你可以使用类似以下的代码:
if [[ $(date +%u) -gt 5 ]]; then echo weekend; fi
date +%u
命令可以给出星期几,从星期一(1)到星期日(7)。如果返回结果大于5(星期六是6,星期天是7),那么就是周末。
你可以在脚本开头加上类似这样的内容:
if [[ $(date +%u) -gt 5 ]]; then
echo 'Sorry, you cannot run this program on the weekend.'
exit
fi
或者更简洁的写法:[[ $(date +%u) -gt 5 ]] && { echo "Weekend, not running"; exit; }
要检查它是否是一个 工作日,使用相反的逻辑(< 6
而不是 > 5
):
$(date +%u) -lt 6
case "$(date +%a)" in
Sat|Sun) echo "weekend";;
esac
这其实是一个非常棘手的问题,因为谁能说“周末”指的是周六和周日……“周末”具体包括哪些日期实际上可能在不同文化中有所不同(例如在以色列,人们在周日工作,周五放假)。虽然你可以使用date
命令获取日期,但如果要实现适用于所有用户的功能,你需要存储一些额外的数据来指示每个地区的周末时间。如果你只针对一个国家进行操作,那么其他答案中提出的解决方案将可行……但是请始终记住这里所做的假设。
localtime
运算符。
例如:localtime
Converts a time as returned by the time function to a 9-element list with the time analyzed for the local time zone. Typically used as follows:
# 0 1 2 3 4 5 6 7 8 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
…
$wday
is the day of the week, with 0 indicating Sunday and 3 indicating Wednesday.
$ date 周日 8月 15日 20:27:29 CDT 2010 $ perl -le 'my $wday = (localtime)[6]; print $wday >= 1 && $wday <= 5 ? "工作日" : "周末"' 周末
printf也可以输出日期
printf -v day '%(%a)T'
case $day in
Sat|Sun) echo "Hooray!";;
esac
我喜欢在工作日运行程序的方式:
[[ $(date +%u) -lt 6 ]] && weekday-program
这是一个有点棘手的结构,但紧凑且易于添加。
* * * * 1-5 user echo ok
。 - Ivan我不确定这是否适用于此问题,但我想分享一下以帮助其他人,而这是最接近我所寻找的Stack问题。
这是一个shell脚本,我用它来启动应用程序,当我开机时,该应用程序无法在周末连接到其服务器(因为服务不在周末运行(外汇交易应用程序)进行维护)。
关于此脚本的信息,d为1至7(星期一至星期日),h为24小时制。您可以根据自己的设置进行调整,也许您有中周维护或任何其他原因。这是我第一次编写的shell脚本,所以我相信有更好的方法,如果有人想要编辑,请随意,我会审核并接受(或其他人可能会接受)。
#!/bin/bash
d=$(date +%u)
h=$(date +%H)
case $d in
'5')
# Friday after 10pm
if (($h >= 22)) ; then
exit
fi
;;
'6')
# all day saturday
exit
;;
'7')
#sunday before 10pm
if (($h < 22)) ; then
exit
fi
;;
*)
# any other time run the program
;;
esac