2014-01-22 3 views
0

У меня есть следующий скрипт bash, чтобы увеличить назначенную дату: DATE.Приращение дат с помощью скрипта оболочки

#!/usr/local/bin/bash 

DATE=20130625 

for i in {1..10} 
do 
    NEXT_DATE=$(date +%Y%m%d -d "$DATE + $i day") 
    echo $i $NEXT_DATE 
done 

Однако, это лишь несколько раз печатает сегодняшнюю дату следующим образом.

1 20140122 
2 20140122 
3 20140122 
4 20140122 
5 20140122 
6 20140122 
7 20140122 
8 20140122 

Любая помощь приветствуется. Кстати, ОС - Solaris 11. Спасибо.

+1

Вы проверили «дату» на своей Solaris, если это дата Gnu? и если он поддерживает выражение '-d '+ x day''? – Kent

+0

Я нахожусь на ubuntu и не могу воспроизвести эту ошибку, так что да, это может быть проблема с 'date' на Solaris 11? Кроме того, не уверен, что это тип, но должно быть ясно, что что-то происходит, поскольку он даже не повторяет $ DATE, с которого вы начали, а скорее сегодняшняя дата. – dwanderson

+0

Обычно это не так, поэтому это должно быть причиной. – fedorqui

ответ

1

Возможно, ваша версия date не поддерживает такую ​​арифметику даты. Тем не менее, он должен поддерживать преобразование в и временные метки Unix (подробности см. В документации).

DATE=$(date +%s "$DATE") # Adjust as necessary 
for i in {1..10} 
do 
    seconds=$(($i * 86400)) 
    NEXT_DATE=$(($DATE + $seconds)) 
    echo $i $(date +%Y%m%d -d @$NEXT_DATE) # Adjust as necessary 
done 
+0

Не имея доступа к Solaris, вполне возможно, что этот ответ бесполезен из-за его предположений о реализации «даты». – chepner

+0

Получение ошибок:. ./Date.sh: строка 15:% s + 86400: синтаксическая ошибка: ожидается операнд (токен ошибки «% s + 86400») ». Я прокомментировал линии цикла и установил отладку для эха $ DATE (перед циклом), и это echos «% s». –

+0

Проверьте документацию на версию «date», чтобы узнать, есть ли способ получить заданную дату как количество секунд с эпохи UNIX. Если нет, вы можете проигнорировать этот ответ. – chepner

2

Солярис date команды (по крайней мере, в Solaris 8. Я не мог найти Solaris 11 справочную страницу) не поддерживает синтаксис и не имеет возможности делать вычисления в команде date.

У вас есть два варианта:

  • Забудьте используя date команду и BASH. Вместо этого используйте язык сценариев, такой как Perl, Python или Ruby, который может обрабатывать даты.
  • Загрузить GNU Coreutils с сайта Sunfreeware. GNU Coreutils - это та же команда Date, которая появляется на большинстве Linux-систем. Я считаю, что он поместит команду date в /usr/local/bin, и вам придется либо положить ее в свой $PATH, либо включить весь путь к каталогу в GNU-дату в вашей команде.
+0

Да, я изучил это и нашел дату в GNU Coreutils, установленную под/usr/local/bin/date, и это сработало нормально. Спасибо всем. –

Смежные вопросы