Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 以Shell脚本获取11月的第四个星期四_Bash_Shell - Fatal编程技术网

Bash 以Shell脚本获取11月的第四个星期四

Bash 以Shell脚本获取11月的第四个星期四,bash,shell,Bash,Shell,我正在尝试添加一个脚本来检查文件到达,我想排除一些天(1月2日,12月26日,每个星期一,感恩节后的一天),除了感恩节,我已经得到了所有的检查,在IF条件下,每年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 +

我正在尝试添加一个脚本来检查文件到达,我想排除一些天(1月2日,12月26日,每个星期一,感恩节后的一天),除了感恩节,我已经得到了所有的检查,在IF条件下,每年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"

您可以使用
ncal
awk
获取第四个星期四,然后添加一个:

$ ncal -m 11  
    November 2018     
Mo     5 12 19 26   
Tu     6 13 20 27   
We     7 14 21 28   
Th  1  8 15 22 29   
Fr  2  9 16 23 30   
Sa  3 10 17 24      
Su  4 11 18 25      
$ ncal -m 11  | awk '/^Th/{print $5+1}'
23

第四个星期四可能是22日至28日。接下来的星期五是23日至29日

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

你可以在这里使用一个技巧:一个月的第一个(任何工作日)总是在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
if[“$DAY”=“Mon”]| |[“$MD”=“0102”]| |[“$MD”=“1226”]| |\
{[“$DAY”=“Fri”]&&&[“$MD”\>“1121”]&&[“$MD”\<“1130”];};然后
注:

  • 我假设
    $DAY
    设置为类似
    $(TZ=America/New_York date+%a)
    。我建议改用数字天数,这样在非英语地区就可以了
  • 我还建议切换到小写或混合大小写变量名。有许多具有特殊含义的所有caps变量,意外地重用它们可能会导致奇怪的结果

  • 我使用了
    \>“1121”
    \<“1130”
    而不是
    \>=“1122”
    \如果您的
    日期
    命令支持
    -d
    选项,请尝试以下操作:

    #!/bin/bash
    
    # caclulate the day after the 4th Thursday of the given year
    
    export LC_TIME=C
    month=11
    year=$(date +%Y)    # assign to the year as "2018"
    firstdayofweek=$(date -d "${year}-${month}-1" +%w)
    # calculates the day of week of the 1st day between 0 and 6
    # where 0=Sun, 1=Mon, ...
    
    thu1=$(( (11 - $firstdayofweek) % 7 + 1 ))
    # calculates the day of month of the 1st Thursday
    
    thu4=$(( $thu1 + 21 ))
    # the day of the 4th Thursday
    
    dayAfterThanksGiving=$(( $thu4 + 1 ))
    echo "$dayAfterThanksGiving"
    

    然后输出为23。

    使用@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
        ...
    

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

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

    第四个星期四我们该怎么办?添加一个只会给你找到的任何星期四的下一个星期五(并且只给你11月的有效日期,因为11月30日不是第四个星期四。)@JamesBrown:如果11月1日是星期五,这不会失败吗?别这么想。2019年11月1日是星期五。请尝试
    ncal 11 2019 | awk'/^Th/{print$5+1}'
    I stand corrected。为我辩护,我得说这里真的很早…:我会为我的朋友效劳我们不能用一个动态的年份吗,我实际上也想到了类似的东西,但是年份的变化必须自动地考虑。对不起,我不明白这个问题。您希望如何分配
    年份
    ?它可以自动、手动或任何方式完成。
    date
    是最让我沮丧的Unix实用程序中的前三个。每个操作系统都有一个完全不同的接口。