bash中,我想编写一个带有macOS的小脚本(或任何其他程序),该脚本以dates格式列出给定年份每个星期六的日期列表,并将其保存到变量中。
例如,如果我想要一个1850年所有周六的日期列表,它应该是这样的:

var = [ 18500105, 18500112, 18500119, …, 18501228 ]

使用以下代码:
list=()
for month in `seq -w 1 12`; do
    for day in `seq -w 1 31`; do
    list=( $(gdate -d "1850$month$day" '+%A %Y%m%d' | grep 'Saturday' | egrep -o '[[:digit:]]{4}[[:digit:]]{2}[[:digit:]]{2}' | tee /dev/tty) )
    done
done

但是,上面的命令不会在数组中写入任何内容,尽管它为我提供了正确的yyyymmdd输出。
如何解决这些问题?

最佳答案

稍微修改Dennis Williamson's answer以满足您的需求并将结果添加到数组中。适用于GNUdate而不是FreeBSD版本。

#!/usr/bin/env bash
y=1850

for d in {0..6}
do
    # Identify the first day of the year that is a Saturday and break out of
    # the loop
    if (( $(date -d "$y-1-1 + $d day" '+%u') == 6))
    then
        break
    fi
done

array=()
# Loop until the last day of the year, increment 7 days at a
# time and append the results to the array
for ((w = d; w <= $(date -d "$y-12-31" '+%j'); w += 7))
do
    array+=( $(date -d "$y-1-1 + $w day" '+%Y%m%d') )
done

现在你可以把结果打印成
printf '%s\n' "${array[@]}"

要在MacOS上设置GNUdate,您需要执行brew install coreutils,并以gdate的形式访问该命令,以将其与提供的本机版本区分开来。

09-25 15:47