【问题标题】:Bash script - How to take todays date and count back monthly for a yearBash 脚本 - 如何获取今天的日期并每月倒数一年
【发布时间】:2010-09-01 23:55:57
【问题描述】:

我制作了一个执行 PHP 文件的 bash 脚本:

#!/bin/bash
php upgrade_attendance.php refresh_daily_attendance 2010-10-01 2010-11-01 
php upgrade_attendance.php refresh_daily_attendance 2010-09-01 2010-10-01
php upgrade_attendance.php refresh_daily_attendance 2010-08-01 2010-09-01
php upgrade_attendance.php refresh_daily_attendance 2010-07-01 2010-08-01

等等...这些日期必须追溯到年底。现在我可以简单地在这个脚本中有大量的行,其中包含这些日期,或者从今天date 倒数到今年年底(或一整年)@

我只是不知道怎么做。

【问题讨论】:

  • “现在我可以简单地拥有大量的行”??你说的“吨”是指 12?
  • 是的,我的意思是 12 ......但也许我需要更多,因为我已经修复了这个脚本以在本月工作......但它很可能会被使用下个月……也许下个月也是,所以我得继续编辑它

标签: bash shell date count counter


【解决方案1】:

不需要复杂的逻辑和算术。不要在午夜或时间变化或当月的最后几天运行它。

#!/bin/bash
for m in {0..14}
do
    beg=$(date -d "now - $((m+1)) months" "+%Y-%m-%d")
    end=$(date -d "now - $m months" "+%Y-%m-%d")
    echo php upgrade_attendance.php refresh_daily_attendance "$beg" "$end"
done

删除echo 使其工作

例子:

php upgrade_attendance.php refresh_daily_attendance 2010-08-01 2010-09-01
php upgrade_attendance.php refresh_daily_attendance 2010-07-01 2010-08-01
php upgrade_attendance.php refresh_daily_attendance 2010-06-01 2010-07-01
php upgrade_attendance.php refresh_daily_attendance 2010-05-01 2010-06-01
php upgrade_attendance.php refresh_daily_attendance 2010-04-01 2010-05-01
php upgrade_attendance.php refresh_daily_attendance 2010-03-01 2010-04-01
php upgrade_attendance.php refresh_daily_attendance 2010-02-01 2010-03-01
php upgrade_attendance.php refresh_daily_attendance 2010-01-01 2010-02-01
php upgrade_attendance.php refresh_daily_attendance 2009-12-01 2010-01-01
php upgrade_attendance.php refresh_daily_attendance 2009-11-01 2009-12-01
php upgrade_attendance.php refresh_daily_attendance 2009-10-01 2009-11-01
php upgrade_attendance.php refresh_daily_attendance 2009-09-01 2009-10-01
php upgrade_attendance.php refresh_daily_attendance 2009-08-01 2009-09-01
php upgrade_attendance.php refresh_daily_attendance 2009-07-01 2009-08-01
php upgrade_attendance.php refresh_daily_attendance 2009-06-01 2009-07-01

【讨论】:

    【解决方案2】:

    这个脚本:

    #!/bin/bash
    let YEAR=$(date +%-Y)
    let MONTH=$(date +%-m)
    let DAY=$(date +%-d)
    
    for ((m = MONTH; m < 12; m++)); do
        php upgrade_attendance.php refresh_daily_attendance "$YEAR-$((m))-$DAY" "$YEAR-$((m+1))-$DAY"
    done
    

    执行这些命令:

    php upgrade_attendance.php refresh_daily_attendance 2010-9-1 2010-10-1
    php upgrade_attendance.php refresh_daily_attendance 2010-10-1 2010-11-1
    php upgrade_attendance.php refresh_daily_attendance 2010-11-1 2010-12-1
    

    我不确定这些日期的确切含义,因此可能存在一些错误。

    【讨论】:

    • 你不能有像%02d 这样的东西来在前面添加额外的零。我记得value too great for base 错误有类似的问题,但% 以某种方式修复了它。只是一个想法;我不怎么用 bash。
    • @vlad003:只需从日期规范中删除破折号即可获得前导零:+%m
    【解决方案3】:

    哇,感谢您的所有回复,我最终解决了这样的问题,已签入,有点粗糙,但可以满足我的需求。

    let YEAR=$(date +%-Y)
    let MONTH=$(date +%-m)
    let DAY=$(date +%-d)
    for ((m = MONTH; m < 12 && m > 0; m--)); do
        php /srv/www/htdocs/$SCHOOL/tools/upgrade_attendance.php refresh_daily_attendance "$YEAR-$((m))-$DAY" "$YEAR-$((m+1))-$DAY"
    done
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-10
      • 1970-01-01
      • 2023-01-31
      • 1970-01-01
      • 1970-01-01
      • 2018-04-14
      • 1970-01-01
      • 2016-03-28
      相关资源
      最近更新 更多