如何检查今天是不是是 bash 的周末?
Posted
技术标签:
【中文标题】如何检查今天是不是是 bash 的周末?【英文标题】:How to check if today is a weekend in bash?如何检查今天是否是 bash 的周末? 【发布时间】:2011-03-30 05:39:31 【问题描述】:如何使用 bash 甚至 perl 检查今天是否是周末?
我想阻止某些程序在周末运行。
【问题讨论】:
【参考方案1】:你可以使用类似的东西:
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
【讨论】:
如何检查是否是工作日?相反 - 如果 [ ![ $(date +%u) -gt 5 ]] ,这将起作用;然后fi @Andrei,查看更新:我只使用-lt 6
而不是-gt 5
。
啊我的意思是 - -if [[ $(date +%u) -lt 6 ]
不是星期天 0,星期六 6 吗??
@lonewarrior556,不,肯定是星期一 1 到星期日 7。我怀疑你是在考虑 C/C++ 中的 tm_wday
time/ctime
东西。尝试执行date ; date +%u
,你就会明白我的意思了。【参考方案2】:
case "$(date +%a)" in
Sat|Sun) echo "weekend";;
esac
【讨论】:
请注意,Sat
/Sun
取决于区域设置。【参考方案3】:
这实际上是一个令人惊讶的难题,因为谁能说“周末”是指周六和周日……“周末”的构成实际上可能因文化而异(例如,在以色列,人们在周日工作,周五离开)。虽然您可以使用date
命令获取日期,但如果您要以适用于所有用户的方式实现此功能,则需要存储一些额外的数据来指示每个区域设置的周末构成。如果您只针对一个国家/地区,那么其他答案中提出的解决方案将有效......但记住这里所做的假设总是好的。
【讨论】:
好点。还需要考虑“长周末”,例如英国的银行假日星期一。这就是为什么人们为他们的问题提供一些背景信息是有帮助的,这样回答的人就知道什么是相关的,什么是不相关的...... 很好——在我的例子中,我指的是周六和周日。【参考方案4】:使用 Perl 的 localtime
运算符。
当地时间
将 time 函数返回的时间转换为 9 元素列表,其中包含针对本地时区分析的时间。通常如下使用:
# 0 1 2 3 4 5 6 7 8 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
…
$wday
是星期几,0 表示星期日,3 表示星期三。
例如:
$ 日期 2010 年 8 月 15 日星期日 20:27:29 CDT $ perl -le '我的 $wday = (本地时间)[6]; 打印 $wday >= 1 && $wday
【讨论】:
【参考方案5】:printf 也有日期
printf -v day '%(%a)T'
case $day in
Sat|Sun) echo "Hooray!";;
esac
https://ideone.com/wU7C0c - 演示
【讨论】:
【参考方案6】:我不确定这是否适合这个问题,但我想分享它以帮助其他人,这是最接近我正在寻找的 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
【讨论】:
【参考方案7】:我喜欢这种平日运行程序的方式:
[[ $(date +%u) -lt 6 ]] && weekday-program
结构有点复杂,但结构紧凑且易于添加。
【讨论】:
Cron 有自己的语法在工作日运行命令* * * * 1-5 user echo ok
你是对的。在大多数情况下,首选本机 cron 方式。但是,我建议的技巧仍然适用于 cron。例如,如果您计划一个包含一组操作的脚本,这些操作应按定义的顺序一个一个地执行,但在某些情况下应跳过某些操作。
如果有一些复杂的逻辑,我宁愿把它放在脚本中而不是在 crontab 中。以上是关于如何检查今天是不是是 bash 的周末?的主要内容,如果未能解决你的问题,请参考以下文章