Основная проблема заключается в разборе предоставленных строк. Дата команды принимает только некоторые форматы, а не все. Решение состоит в том, чтобы воспользоваться возможностью Busybox принимать даты (почти)в любом формате .
Создайте строку формата, которая печатает дату в том же формате, что и предоставленный:
$ date -u +'%d%b%y:%T'
07Jul17:15:18:48
Используйте эту строку, чтобы указать busybox date, как анализировать строку даты. Имейте в виду, что локальная TZ может изменить результат, используйте -u (UTC ), чтобы избежать ошибок, или убедитесь, что вы установили правильную TZ для анализируемой строки времени.
$ d1='24MAR17:00:14:09'
$ busybox date -u -D '%d%b%y:%T' -d "$d1"
Fri Mar 24 00:14:09 UTC 2017
Сделать дату busybox для печати значения в секундах (с начала эпохи):
$ busybox date -u -D '%d%b%y:%T' -d "$d1" +'%s'
1490314449
Вы можете повторить процедуру и для второй метки времени, но в этом случае строка понимается непосредственно по дате:
$ d2='2017-03-25 05:52:09.373941000'
$ date -u -d "$d2" +'%s'
1490421129
И дата busybox удаляет наносекунды(${d2%.*}
)(подробнее об этом позже):
$ busybox date -u -d "${d2%.*}" +'%s'
1490421129
Вы должны были зафиксировать приведенные выше результаты в двух переменных:
$ resd1="$(busybox date -u -D '%d%b%y:%T' -d "$d1" +'%s')"
$ resd2="$(date -u -d "$d2" +'%s')"
Затем вычислите разницу и сравните с нулем:
$ (( resd1-resd2 )) && echo "Dates are different" || echo "Dates are equal"
Dates are different
Или напрямую сравнивать строки (, а не значения):
$ [[ "$resd1" == "$resd2" ]] && echo "equal" || echo "different"
different
Есть три проблемы, если вам нужно сравнить также наносекунды.
Первое значение не содержит наносекунд. Во-первых, первая дата не имеет значения в наносекундах.
Вы можете добавить 9 нулей:
$ resd1="$(busybox date -u -D '%d%b%y:%T' -d "$d1" +'%s')"
$ resd1="$resd1""$(printf '%0*d' 9 0)"
$ echo "$resd1"echo "$resd2 - $resd1"
1490314449000000000
Или (лучше )повторно -обрабатывать значение с датой:
$ resd1="$(date -u -d "@$resd1" +'%s%N')"
$ echo "$resd1"
1490314449000000000
Вторая дата имеет наносекунды. В этом случае вторая дата имеет формат, который дата может обрабатывать напрямую, но если бы она имела формат, требующий предварительной -обработки по дате busybox, нам нужно будет добавить наносекунды позже. Например:
$ d2='2017-03-25 05:52:09.373941000'
$ resd2="$(busybox date -u -D '%Y-%m-%d %T' -d "$d2" +'%s')${d2##*.}"
$ echo "$resd2"
1490421129373941000
Кроме того, bash, который вы используете, должен иметь возможность обрабатывать 64-битные целые числа.
Если да, рассчитайте разницу:
$ echo "(( $resd2 - $resd1 ))"
(( 1490421129373941000 - 1490314449000000000 ))
$ echo "$(( $resd1 - $resd2 ))"
106680373941000
Что составляет чуть более 106 тысяч секунд (~29 часов):
$ echo "$(( ($resd2 - $resd1)/10**9 ))"
106680
«Строка» — это по определению строка текста, оканчивающаяся символом новой строки.
В расширении этого определения файл не является "текстовым файлом" , если он не заканчивается символом новой строки.
Так говорит POSIX. Этот стандарт, однако, не заботится о файле /etc/group
как таковом (база данных группы может храниться в базе данных любого типа, например, в текстовом файле или на сервере LDAP, если он содержит по крайней мере группу имя, числовой идентификатор группы и список пользователей, разрешенных в группе ). Если в документации к вашей системе сказано, что этот файл должен быть текстовым, то он должен иметь завершающий символ новой строки.