在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上设置GNU
date
,您需要执行brew install coreutils
,并以gdate
的形式访问该命令,以将其与提供的本机版本区分开来。