Ответ 1
$ date -v -1d
-d устанавливает флаг времени на летнее время.
Попробуйте ввести дату для получения дополнительной информации.
Я понимаю, что я мог бы взломать небольшую программу 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.
$ date -v -1d
-d устанавливает флаг времени на летнее время.
Попробуйте ввести дату для получения дополнительной информации.
Например, эта команда даты OS X добавит 14 дней к входной строке 20160826 (не в настоящее время):
date -j -f %Y%m%d -v+14d 20160826 +%Y%m%d
Поскольку MacOS основан на BSD, а не на Linux, команда на самом деле:
date -v-1d
Переключатель регулировки принимает формат -v[+ / -](number)[ymwdHMS]
.
Команда Matthew упоминает для меня работу с /bin/date на Leopard. Кроме того, как указывает Шверн, если вы уверены, что ваша оболочка script будет запущена в Mac OS X, почему бы вам не использовать Python или Ruby, которые оба входят в стандарт в /usr/bin? Это никоим образом не повлияет на переносимость вашего конкретного сценария.
Я понимаю, что я мог бы взломать небольшую программу C или Ruby, но я хочу, чтобы у моего script было как можно меньше зависимостей.
Выполнение на C или Ruby script приведет к меньшему количеству зависимостей и будет более кросс-платформенным. Bash -scripting просто вызывает различные другие скрипты/приложения, в основном утилиты GNU. Многие из команд недоступны или принимают разные аргументы на других платформах (особенно между OS X и Linux).
Ruby включен по умолчанию в OS X Leopard (и 10.4 и, возможно, в предыдущих версиях, если я правильно помню), и если вы используете встроенные библиотеки даты Rubys, он будет работать последовательно на любой платформе.
Всякий раз, когда вы пытаетесь сделать что-либо удаленно сложным, вы обычно лучше всего используете "правильный" язык сценариев!
Вот скрипт, который я использую для печати дат моего журнала в 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
Возможно, вы ищете это. 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
чтобы получить то же самое за кадром. Не знаю, почему они могут что-то изменить в последнее время.
date -v + ipconfig getoption en0 renewal_t1_time_value
S