Как я делаю свидание с математикой в ​​сценарии bash на OS X Leopard? - PullRequest
17 голосов
/ 31 января 2009

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

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

date -d "-1 day"

Но, похоже, это не работает на OS X.

Добавление:

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

Так что, возможно, мне следует уточнить, что я имею в виду под «внешней зависимостью». Я имею в виду, что я не хочу, чтобы мой сценарий bash вызывал любой другой сценарий, внешний по отношению к нему. Другими словами, я хочу, чтобы он использовал какую-то утилиту, доступную в стандартной установке OS X и уже находящуюся на пути.

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

Ответы [ 7 ]

26 голосов
/ 31 января 2009
$ date -v -1d

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

Для получения дополнительной информации попробуйте man date.

13 голосов
/ 19 сентября 2015

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

date -j -f %Y%m%d -v+14d 20160826 +%Y%m%d
12 голосов
/ 08 апреля 2011

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

date -v-1d

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

1 голос
/ 31 января 2009

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

0 голосов
/ 13 декабря 2018

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

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

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

0 голосов
/ 03 апреля 2018

Вот скрипт, который я использую для печати дат моего журнала в 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 новые строки между каждой датой):

вс 4/1/18

Пн 4/2/18

Вт 4/3/18

ср. 4/4/18

Чт 4/5/18

Пт 4/6/18

Сб 4/7/18

0 голосов
/ 31 января 2009

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

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

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

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

...