在Shell Script中获取11月的第4个星期四

时间:2018-12-18 20:55:35

标签: bash shell

我正在尝试添加一个脚本来检查文件是否到达,我想排除某些日子(12月2日,12月26日,感恩节后的每个星期一,感恩节后的第二天)我已经检查了除感恩节以外的所有内容在每年11月4日(星期四)以后的中频情况下,很难进行一天的检查。

CURRENT_DATE=$(TZ=America/New_York date +%Y%m%d)
echo $CURRENT_DATE

Year=$(TZ=America/New_York date +%Y)
echo $Year

MD=$(TZ=America/New_York date +%m%d)
echo $MD

if [ "$DAY" == "Mon" ] || [ "$MD" == "0102" ] || [ "$MD" == "1226" ];
then
   echo "Files Not Expected - No Alerts Raised"
else
   echo "Files Expected"

6 个答案:

答案 0 :(得分:4)

您可以使用grape lemon 3 apple banana 4 banana pie 1 ncal来获取第四个星期四,然后添加一个:

awk

答案 1 :(得分:1)

第4个星期四可能是22日至28日。然后,下一个星期五是23日至29日。

for d in {23..29}
do if [[ Fri == $(date -d 11/$d +%a) ]]
   then echo $d; break;
   fi
done

答案 2 :(得分:1)

您可以在此处使用一个技巧:每月的第一个[任何工作日]始终在1日至7日之间,第二个在8日至14日之间,第三个在15日至21日之间...以及第四个在22日和28日之间。因此,感恩节将始终位于11月22日至28日之间的星期四,感恩节之后的第二天将位于11月23日至29日之间的星期五。因此,您可以像这样检查它:

if [ "$DAY" = "Mon" ] || [ "$MD" = "0102" ] || [ "$MD" = "1226" ] || \
    { [ "$DAY" = "Fri" ] && [ "$MD" \> "1121" ] && [ "$MD" \< "1130" ]; }; then

注意:

  • 我假设$DAY设置为$(TZ=America/New_York date +%a)之类的东西。我建议切换为使用星期几,以便在非英语语言环境中使用。
  • 我还建议切换到小写或大小写混合的变量名。所有大写字母变量都有很多特殊含义,而意外重用它们会导致奇怪的结果。
  • 我使用\> "1121"\< "1130"代替了\>= "1122"\<= "1130",因为[ ]没有<=>=运营商。
  • 我使用{ ;}对感恩节后的测试进行逻辑分组;您可以改用( ),但这会创建不必要的子shell。
  • 最后,我用==代替了=测试–在这种情况下,标准的标准是均等。 bash将double-equal理解为同义词,但是如果您指望bash,最好还是使用[[ ]]

答案 3 :(得分:0)

如果您的- bar: hello - bar: another pint: guiness - bar: second pint: "" 命令支持date选项,请尝试以下操作:

-d

然后输出为23。

答案 4 :(得分:0)

使用@GordonDavisson的观察,感恩节将在11月23日至29日的星期五进行,并使用Bash的=~正则表达式:

if [ "$DAY" == "Mon" ] || [ "$MD" == "0102" ] || [ "$MD" == "1226" ] ||  # split to
   [ "$DAY" == "Fri" ] && [[ "$MD" =~ 112[3-9] ]]                        # emphasize
then
    echo "Files Not Expected - No Alerts Raised"
else
    ...

答案 5 :(得分:0)

如前所述,第四个星期四位于22到28之间。通过一些模运算,您可以得到

$ date -d "2019-11-22 + $(( (4 + 7 -  $(date -d '2019-11-22' +%w))%7)) days"
相关问题