如何在bash中检查今天是否是周末?

50

如何使用Bash或Perl检查今天是否是周末?

我希望在周末阻止某些程序运行。

7个回答

109

你可以使用类似以下的代码:

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

1
如何检查是否为工作日?反过来,这个代码会起作用吗?如果 [ ![ $(date +%u) -gt 5 ]] ; then fi - vehomzzz
@Andrei,看到更新了吗:我只会使用“-lt 6”而不是“-gt 5”。 - paxdiablo
2
噫,我的意思是——如果[[ $(date +% u) -lt 6 ] - vehomzzz
周日不是0,周六不是6吗? - lonewarrior556
2
@lonewarrior556,不是的,一周的日子从星期一1到星期日7。我猜你可能在想C/C++中的time/ctime里的tm_wday。试着执行“date; date +%u”命令,你就会明白我的意思。 - paxdiablo

15
case "$(date +%a)" in 
  Sat|Sun) echo "weekend";;
esac

4
请注意,“Sat”/“Sun”会因地区而异。 - Benjamin W.

9

这其实是一个非常棘手的问题,因为谁能说“周末”指的是周六和周日……“周末”具体包括哪些日期实际上可能在不同文化中有所不同(例如在以色列,人们在周日工作,周五放假)。虽然你可以使用date命令获取日期,但如果要实现适用于所有用户的功能,你需要存储一些额外的数据来指示每个地区的周末时间。如果你只针对一个国家进行操作,那么其他答案中提出的解决方案将可行……但是请始终记住这里所做的假设。


1
好的观点。还有要考虑到“长周末”,例如英国的银行假日星期一。这就是为什么人们提出问题时给出一些背景信息很有帮助,这样回答问题的人就知道什么是相关的,什么不是相关的... - plusplus
一个很好的观点——在我个人的情况下,我指的是周六和周日。 - vehomzzz

5
使用 Perl 的 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 ? "工作日" : "周末"'
周末

2

printf也可以输出日期

printf -v day '%(%a)T'
case $day in 
    Sat|Sun) echo "Hooray!";;
esac

https://ideone.com/wU7C0c - 演示


1

我喜欢在工作日运行程序的方式:

[[ $(date +%u) -lt 6 ]] && weekday-program

这是一个有点棘手的结构,但紧凑且易于添加。


1
Cron有自己的语法来在工作日运行命令:* * * * 1-5 user echo ok - Ivan
你是对的。在大多数情况下,本地cron方式是首选的。然而,我建议的技巧在cron中仍然适用。例如,如果您安排一个脚本,其中包含一组按照定义顺序逐个执行的操作,但某些操作在某些条件下应该被跳过。 - Eugene Ionichev
1
如果遇到一些复杂的逻辑,我宁愿将其放在脚本中而不是 crontab 中。 - Ivan

0

我不确定这是否适用于此问题,但我想分享一下以帮助其他人,而这是最接近我所寻找的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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接