【问题标题】:How to check if today is a weekend in bash?如何检查今天是否是 bash 的周末?
【发布时间】:2011-03-30 05:39:31
【问题描述】:

如何使用 bash 甚至 perl 检查今天是否是周末?

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

【问题讨论】:

    标签: perl bash scripting


    【解决方案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 中。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-12
          • 1970-01-01
          • 2012-07-29
          • 1970-01-01
          相关资源
          最近更新 更多