Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 在Mac OS X shell脚本中从开始日期循环到结束日期_Macos_Bash_Shell_Date - Fatal编程技术网

Macos 在Mac OS X shell脚本中从开始日期循环到结束日期

Macos 在Mac OS X shell脚本中从开始日期循环到结束日期,macos,bash,shell,date,Macos,Bash,Shell,Date,OS X(Snow Leopard)上的date函数没有GNU版本那样的--date选项,我无法弄清楚如何在OS X上获得以下等价项: startdate=2010-01-01 enddate=2010-01-31 foldate="$startdate" until [ "$foldate" == "$enddate" ] do # do something with the date here - like pass it as a parameter to a command

OS X(Snow Leopard)上的date函数没有GNU版本那样的--date选项,我无法弄清楚如何在OS X上获得以下等价项:

startdate=2010-01-01
enddate=2010-01-31
foldate="$startdate"

until [ "$foldate" == "$enddate" ]
do
    # do something with the date here - like pass it as a parameter to a command
    foldate=`/bin/date --date "$foldate 1 day" +%Y-%m-%d`
done
用SiegeX的答案解决:

startdate=2010-01-01
enddate=2010-01-31

sDateTs=`date -j -f "%Y-%m-%d" $startdate "+%s"`
eDateTs=`date -j -f "%Y-%m-%d" $enddate "+%s"`
dateTs=$sDateTs
offset=86400

while [ "$dateTs" -le "$eDateTs" ]
do
  date=`date -j -f "%s" $dateTs "+%Y-%m-%d"`
  printf '%s\n' $date
  dateTs=$(($dateTs+$offset))
done

通过运行
man-date
阅读日期手册页,并查看
-v
选项。以下是摘录:

-v调整(即采取 当前日期并显示结果 调整;未实际设置 日期)第二天、分钟、小时、月日、星期日, 根据val.If的月份或年份 val前面有加号或减号,日期为 向前或向后调整 相符合的 到剩余字符串,否则为 日期已定。日期可以是 根据需要使用这些标志进行多次调整。旗帜是 按照给定的顺序处理


SiegeX,我这样做了,但我不知道如何使用该选项更改日期输出以外的任何内容。换句话说,我可以用日期-j-v+1d向“现在”添加一天,但如何向任意的一天添加一天?使用-v的问题是“使用当前日期…”(从主页和上面)。我不想修改当前日期,我需要修改任意日期-我指定的日期。@hGlaterGotz看起来您唯一能做的就是将当前日期保存到一个变量中,然后将日期设置为$foldate,并使用
-v
获取该日期的偏移量。最后将日期设置回原来的日期value@hglattergotz实际上,另一个选项是将偏移值转换为秒,然后通过
-j-f“%Y-%m-%d”$foldate“+%s”
将$foldate转换为历元。将该历元值以秒为单位添加到偏移量中,并通过
-j-f“%s”$epoch\u plus\u seconds“+%Y-%m-%d”
@SeigeX将其转换回日期,谢谢最后的提示。现在开始工作了。我将把这个例子作为单独的答案发布,因为我似乎无法在评论中正确地格式化它。很高兴看到这对你们有用。我不确定OSX有什么版本的
bash
OSX(如果它甚至有bash),但是如果有,你应该用
$()
来包装你的命令,而不是像
sDateTs=$(date-j-f…
这样的反勾号,并且使用双括号
[
而不是一个
[
,这样你就可以在[[“$dateTS”<“$eDateTs]”时执行
]
偏移的目的是什么?为什么需要它?请注意,在
[
中使用
=
比使用
=
更安全,因为使用
=
是一个扩展,并非所有基线POSIX shell都支持,而
=
是由定义的。