我的脚本中需要获取当月的第一个星期六的日期。我可以从下面的命令获取上周六的日期
date -d 'last Saturday' +%y%m%d
但无法获得第一个星期六的约会。即使尝试过 date -d 'First Saturday' +%y%m%d
但没有得到预期的结果。
例如,我的要求是 - 当月(七月) - 第一个星期六日期(200704)
谁能帮我获取当月第一个星期六的日期
答案1
和ksh93
:
$ ksh93 -c 'printf "%(%y%m%d)T\n" "first saturday"'
200704
答案2
巴什
缩进命令只是为了更好地理解。
$ target_day_id=6 # return value of date +%w; Sunday is 0
$ year_month="$(date +%Y-%m)"
$ echo $year_month
2020-07
$ day_id="$(date --date="${year_month}-01" +%w)"
$ echo $day_id
3
$ # July, 1st 2020 was a Wednesday
$ sat1_date="${year_month}-0$(( ( (7+target_day_id-day_id) % 7 ) + 1 ))"
$ echo $sat1_date
2020-07-04
$ # only formatting from now on
$ sat1_date_short="${sat1_date:2}"
$ echo $sat1_date_short
20-07-04
$ sat1_date_short_digits_only="${sat1_date_short//-/}"
$ echo $sat1_date_short_digits_only
200704
答案3
使用 GNU 日期和 shell 循环:
day=1
until [ $(date +%A -d $(date +%Y-%m-$(printf '%02d' "$day"))) = "Saturday" ]
do
((day++))
done
date +%y%m$(printf '%02d' "$day")
这会将“day”变量初始化为 1 以指示该月的第一天,然后逐日向前循环,直到该天的名称为星期六。为了使用该-d
标志来使用不同于“现在”的时间戳,需要 GNU 日期。循环测试分解如下:
[ $(date +%A ...) = "Saturday" ]
-- 将日期的输出(询问当前语言环境的完整工作日名称)与“星期六”进行比较date ... -d $(date +%Y-%m-$(printf '%02d' "$day"))
-- 为该日期命令指定要显示的日期(不要使用当前时间)-d
;该日期是从第二个内部日期命令生成的。该内部日期命令打印当前时间采用 %Y-%m-(day) 格式,其中 %Y 是当前年份,%m 是当前月份,我们传入循环变量“day”。最里面的 printf 语句只是确保日期字段用零填充为两个字符。
最后,它使用计算出的星期六以您所需的格式打印出当前年份和月份。