Получить дату последнего дня последнего месяца в сценарии оболочки

Как получить дату окончания предыдущего месяца на основе даты обработки?

Примеры:

  • Дата обработки = 15jan2015
  • Ожидаемая дата = 31dec2014,

  • Дата обработки = 10feb2015
  • Ожидаемая дата = 31jan2015

  • не может определить ошибку в сценарии оболочки неожиданный оператор
  • Нажмите любую клавишу для приостановки сценария оболочки, нажмите еще раз, чтобы возобновить
  • ip изменяется от динамического к статическому и обратно
  • shell Script: сортировка файлов в каталогах и подкаталогах
  • Скопируйте созданный файл в UNIX
  • find внутри backticks не распознается внутри сценария оболочки
  • Как выбрать опцию из меню выбора из сценария?
  • Почему комментирование этой строки в сценарии оболочки (с использованием pdftk) вызывает проблемы?
  • 4 Solutions collect form web for “Получить дату последнего дня последнего месяца в сценарии оболочки”

    date GNU:

     $ date +%d%b%Y 16Aug2015 $ date -d "$(date +%Y-%m-01) -1 day" +%d%b%Y 31Jul2015 

    Некоторые оболочки имеют встроенную поддержку для обработки даты:

    С ksh93 :

     $ printf "%(%d%b%Y)T\n" "1st day, yesterday" 31Jul2015 

    С zsh :

     $ zmodload zsh/datetime $ strftime -sd %Y-%m-01-12 $EPOCHSECONDS $ strftime -rs d %Y-%m-%d-%H $d $ strftime %d%b%Y $((d-86400)) 31Jul2015 

    Есть много способов сделать это; вот самый простой, который я нашел (здесь предполагается date GNU):

     $ date -d "-$(date +%d) days" Fri Jul 31 16:07:23 EDT 2015 

    Вот версия, которая работает на Mac OS, которая использует утилиту date BSD:

    date -v1d -v-1d +%d%b%Y

    Аргументы применяются по порядку. Вы можете себе представить, что дата передается от одного аргумента к другому. Например:

    • Начать с текущей даты ( date ) -> 2017-03-06
    • Установите эту дату на 1-й день своего месяца ( -v1d ) -> 2017-03-01
    • Вычтите один день из этого ( -v-1d) -> 2017-02-28
    • Отформатируйте дату ( +%d%b%Y ) -> 28Feb2017

    Вы можете достичь любого количества месяцев вперед или назад, используя date -v-1m -v1d -v-1d , заменив -1m на количество месяцев назад или вперед ( +1m ), которое вы хотите.

    Это общий ответ. Этот вопрос конкретно задает даты относительно даты начала. Утилита даты Mac OS / BSD не позволяет вам указывать дату начала, но вы можете установить каждый элемент даты отдельно:

    date -v2015y -v1m -v15d -v1d -v-1d +%d%b%Y -> 31Dec2014

    Попробуйте использовать этот код

     date -d "-$(date +%d) days month" +%Y-%m-%d 
    Linux и Unix - лучшая ОС в мире.