Bash 以Shell脚本获取11月的第四个星期四
我正在尝试添加一个脚本来检查文件到达,我想排除一些天(1月2日,12月26日,每个星期一,感恩节后的一天),除了感恩节,我已经得到了所有的检查,在IF条件下,每年11月4日星期四后的一天的检查有点棘手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 +
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日是星期五。请尝试
I stand corrected。为我辩护,我得说这里真的很早…:我会为我的朋友效劳我们不能用一个动态的年份吗,我实际上也想到了类似的东西,但是年份的变化必须自动地考虑。对不起,我不明白这个问题。您希望如何分配ncal 11 2019 | awk'/^Th/{print$5+1}'
?它可以自动、手动或任何方式完成。年份
是最让我沮丧的Unix实用程序中的前三个。每个操作系统都有一个完全不同的接口。date