每月第一天的星期一数

Number of Mondays Falls on the First of the month

我想要一个命令行可以显示给定年份每月第一天的星期一的数量,而无需使用sedawk 命令

我有这个命令显示当月的第一个日期

date -d "-0 month -$(($(date +%d)-1)) days"

使用 GNU date,您可以从文件(或标准输入)读取输入:

printf '%s\n' 2021-{01..12}-01 | date -f- +%u | grep -c 1

这会打印一年中每个月第一天的日期,然后将它们格式化为“工作日”(其中 1 是“星期一”),然后计算星期一的数量。

要参数化年份,请将 2021 替换为包含年份的变量;包装在函数中:

mondays() {
    local year=
    printf '%s\n' "$year"-{01..12}-01 | date -f- +%u | grep -c 1
}

使用 for 循环,可以按如下方式完成。

for mon in {01..12}; do date -d "2021-$mon-01" +%u; done | grep -c 1

细分

  • 我们遍历代表月份的数字 0112
  • 我们调用 date 传入自定义日期值,其中包含一年中每个月的第一个日期。我们使用 +%u 到 return 星期几,其中 1 代表星期一。
  • 最后我们使用 grep -cgrep --count
  • 计算 1 的数量

请注意,所需年份已硬编码为 2021。当前年份可以用作:

for mon in {01..12}; do date -d "$(date +%Y)-$mon-01" +%u; done | grep -c 1

这也可以全部放入一个函数中,并将所需的年份作为参数传入:

getMondays() {
  for mon in {01..12}; do date -d "-$mon-01" +%u; done | grep -c 1
}

我将其实现为:

for ((i=1,year=2021,mondays=0; i< 12; i++)) { 
    if [ $(date -d "$i/1/$year" +%u) -eq 1 ]
    then  
        let "mondays++" 
    fi 
} 
echo "There are $mondays Mondays in $year."

也就是说,我喜欢 Mushfiq 的回答。挺优雅的。