Как сделать математику даты в bash script на OS X Leopard?

Я понимаю, что я мог бы взломать небольшую программу C или Ruby, но я хочу, чтобы у моего script было как можно меньше зависимостей.

Учитывая это оговорку, как делать математику даты в bash script на OS X? Я видел сообщение (на другом сайте), где кто-то сделал следующее:

date -d "-1 day"

Но это не работает на OS X.

Добавление:

Несколько человек прокомментировали и ответили, что Ruby, Python, Perl и т.д. стандартизируются с OS X. Я знаком со всеми тремя из этих языков и могу легко написать script, который делает то, что я хочу. По сути, у меня уже есть такой script, написанный на Ruby.

Поэтому, возможно, я должен уточнить, что я имею в виду под "внешней зависимостью". Я имею в виду, что я не хочу, чтобы мой bash script должен был вызвать любой другой script внешний для него. Другими словами, я хочу, чтобы он использовал некоторую утилиту, доступную в ванильной установке OS X и уже на пути.

Однако это не похоже, что это возможно, поэтому мне придется делать это с моей внешней зависимостью: Ruby script.

Ответ 1

$ date -v -1d

-d устанавливает флаг времени на летнее время.

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

Ответ 2

Например, эта команда даты OS X добавит 14 дней к входной строке 20160826 (не в настоящее время):

date -j -f %Y%m%d -v+14d 20160826 +%Y%m%d

Ответ 3

Поскольку MacOS основан на BSD, а не на Linux, команда на самом деле:

date -v-1d

Переключатель регулировки принимает формат -v[+ / -](number)[ymwdHMS].

Ответ 4

Команда Matthew упоминает для меня работу с /bin/date на Leopard. Кроме того, как указывает Шверн, если вы уверены, что ваша оболочка script будет запущена в Mac OS X, почему бы вам не использовать Python или Ruby, которые оба входят в стандарт в /usr/bin? Это никоим образом не повлияет на переносимость вашего конкретного сценария.

Ответ 5

Я понимаю, что я мог бы взломать небольшую программу C или Ruby, но я хочу, чтобы у моего script было как можно меньше зависимостей.

Выполнение на C или Ruby script приведет к меньшему количеству зависимостей и будет более кросс-платформенным. Bash -scripting просто вызывает различные другие скрипты/приложения, в основном утилиты GNU. Многие из команд недоступны или принимают разные аргументы на других платформах (особенно между OS X и Linux).

Ruby включен по умолчанию в OS X Leopard (и 10.4 и, возможно, в предыдущих версиях, если я правильно помню), и если вы используете встроенные библиотеки даты Rubys, он будет работать последовательно на любой платформе.

Всякий раз, когда вы пытаетесь сделать что-либо удаленно сложным, вы обычно лучше всего используете "правильный" язык сценариев!

Ответ 6

Вот скрипт, который я использую для печати дат моего журнала в Google Doc's:

    #!/bin/bash

    # ask user for variable details
    read -p 'Starting date in "mm-dd-yyyy" format: ' DATE

    # adjust the count by editing the "x" number in {0..x}
    # 91 days will give you about 3 months, currently set to 6 for testing
    # %a gives short day of the week, -m -d gives single digit months and days, capital Y gives 4 digit year

    for i in {0..6}
    do
         NEXT_DATE=$(date -j -f %m-%d-%Y -v+"$i"d $DATE +'%a %-m/%-d/%y')
         echo -e "$NEXT_DATE\n\n\n"
    done

Вот пример вывода (я использую 3 новые строки между каждой датой):

Вс 1/1/18

Пн 2/2/18

Вт 4/3/18

Ср 4/4/18

Чт 4/5/18

Пт 4/6/18

Сб 4/7/18

Ответ 7

Возможно, вы ищете это. gdate '+%s' -d '2 weeks ago' или gdate '+%s' -d '1 day ago'

Эти два примера возвращаются во времена эпохи. Я превращаю эти секунды во что-то, что мой язык может читать как обычное strptime(seconds, '%s'). Python Ruby и Javascript - это те немногие, которые мне известны. Я уверен, что Java и все остальные делают то же самое.

Кроме того, gdate - это дата (GNU coreutils), которая просто называется что-то другое на Mac. Странно то, что на моем другом Mac это позволяет мне использовать только data чтобы получить то же самое за кадром. Не знаю, почему они могут что-то изменить в последнее время.

Ответ 8

date -v + ipconfig getoption en0 renewal_t1_time_value S