Получить дату следующей субботы с определенной даты

Я хочу дату предстоящей субботы после определенной даты. Например, для $date1="30-AUG-2015" я хочу получить результат 05-SEP-2015.

Я пробовал все команды ниже без успеха:

 samba@samba:~$ date1="30-AUG-2015" samba@samba:~$ date2=$(date --date='"$date1" +next Saturday') date: invalid date '"$date1" +next Saturday' samba@samba:~$ date1="30-AUG-2015" samba@samba:~$ date2=$(date --date1='next Saturday') date: unrecognized option '--date1=next Saturday' Try 'date --help' for more information. samba@samba:~$ date1="30-AUG-2015" samba@samba:~$ date -d "$date1 next saturday" Sun Aug 30 00:00:00 IST 2015 samba@samba:~$ $date1 -d "next saturday" 30-AUG-2015: command not found 

3 Solutions collect form web for “Получить дату следующей субботы с определенной даты”

Я очень рекомендую dateutils для таких вещей. ( yum install dateutils на Fedora 21+ или CentOS / RHEL 7 с EPEL.) Затем просто выполните:

 dateround today sunday 

Вы можете использовать «сегодня» или заменить фактическую дату:

 $ dateround 2015-08-30 saturday 2015-09-05 

Если вам нужна дата ввода в определенном формате, например 30-AUG-2015, вы можете использовать -i или --input-format , например:

 $ dateround -i '%d-%b-%Y'30-AUG-2015 saturday 2015-09-05 

С ksh93 :

 $ LC_ALL=C ksh93 -c 'printf "%(%c)T\n" "30-Aug-2015 Saturday"' Sat Sep 5 00:00:00 2015 

Обратите внимание, что если дата – суббота, то она вернется в тот же день, если вы захотите в следующую субботу, сделайте это:

 LC_ALL=C printf "%(%c)T\n" "30-Aug-2015 tomorrow Saturday" 

Замените %c параметром strftime вы хотите:

 $ LC_ALL=C printf "%(%d-%b-%Y)T\n" "03-Jan-2015 tomorrow saturday" 10-Jan-2015 

date GNU:

 $ d=03-JAN-2015 $ LC_ALL=C date -d "$d +1 week -$(date -d "$d +1 day" +%w) day" '+%d-%^b-%Y' 10-JAN-2015 

Я исхожу из того, что вы пробовали, чтобы вам нужна одна команда. Я не мог найти его, но я адаптировал этот ответ, чтобы сделать то, что вы хотите:

 # Assume that date1 is already set to "30-AUG-2015" try_date="$date1" while [ "$(date --date="$try_date" +"%A")" != Saturday ] do try_date=$(date --date="$try_date + 1 day" +"%d-%b-%Y") done date2="$try_date" echo "$date2" 

Вывод:

 05-Sep-2015 

Вы можете изменить линию while на

  • while [ "$(date --date="$try_date" +"%a")" != Sat ]
    или
  • while [ "$(date --date="$try_date" +"%5")" != 6 ]
    (используйте 1 для понедельника … 7 для воскресенья)

Если $date1 – «29 августа-2015» (это суббота), тогда $date2 будет «29 августа-2015» (т.е. в тот же день). Если вы все еще хотите получить 05-сентябрь-2015 для этого ввода (т. $date1 следующую субботу после $date1 ), измените первую строку на try_date=$(date --date="$date1 + 1 day" +"%d-%b-%Y") .

Если вы действительно хотите месяц во всех столицах (например, «SEP»), используйте tr .

  • запросить ошибку, если нет аргумента argv ожидать сценарий
  • Ожидайте сценарий для копирования файла
  • Как подключить вывод netcat? Проблемы с xargs и кавычками
  • добавьте «проверить, запущен ли fetchmail» в этот скрипт
  • Как вы делаете деловые заявления с диапазонами
  • Как конвертировать дату с «Oct 01 20:00» в формат «1 октября 20:00» (пробел)?
  • воспроизводить mp3-файл сразу после его загрузки
  • Нужен сценарий Linux для планирования работы без использования Cron или
  • apt-get - Как жаловаться на неудачное обновление?
  • переход на systemd сценарий запуска-выключения, который работает с tmpfs и bindmounts
  • отображение даты после определенного числа дней путем чтения номера
  • Linux и Unix - лучшая ОС в мире.