【发布时间】:2014-01-27 14:11:51
【问题描述】:
如果我将月份和年份作为输入,则输出应该是该月的星期一和星期四的日期。
例如:如果输入是 年份 = 2013 月 = 02 输出应该是
2013-02-04
2013-02-07
2013-02-11
2013-02-14
2013-02-18
2013-02-21
2013-02-25
2013-02-28
如何在 shell 脚本中使用 date 函数?
【问题讨论】:
如果我将月份和年份作为输入,则输出应该是该月的星期一和星期四的日期。
例如:如果输入是 年份 = 2013 月 = 02 输出应该是
2013-02-04
2013-02-07
2013-02-11
2013-02-14
2013-02-18
2013-02-21
2013-02-25
2013-02-28
如何在 shell 脚本中使用 date 函数?
【问题讨论】:
这个方法只需要2次调用date,其余的只是算术
year=2013
month=2
last=$(date -d "$year-$month-1 + 1 month - 1 day" +%d)
wday=$(date -d "$year-$month-1" +%w)
for (( day=1; day<=$last; day++ )); do
if (( wday == 1 || wday == 4 )); then
printf "%4d-%02d-%02d\n" $year $month $day
fi
(( wday = (wday + 1) % 7 ))
done
2013-02-04
2013-02-07
2013-02-11
2013-02-14
2013-02-18
2013-02-21
2013-02-25
2013-02-28
【讨论】:
year=2013
month=02
#Monday=1,Sunday=7
display_days="1 4"
for day in $(seq 1 31)
do
dow=$(date -d "$year-$month-$day" +%u 2>/dev/null)
for d in $display_days
do
if [ -z $dow ]; then continue; fi
if [ "$dow" -eq "$d" ]
then
date -d "$year-$month-$day" +%y-%m-%d
fi
done
done
【讨论】:
或者只是听从ncal。
LC_ALL=C ncal "$@" | sed -n 's/\(Mo\|Th\)//p'
工作日需要本地化,所以我添加了一个 C 语言环境以防万一。
【讨论】:
另一种方式:
year=2013 month=02
cal $month $year |
sed '1,2d; s/^.. \(..\) .. .. \(..\).*/\1\n\2/' |
sed "/^ *$/d; s/^ /0/; s/^/$year-$month-/"
【讨论】: