6

Создание переменной временной метки в bash-скрипте

9

Я пытаюсь создать переменную с текущей меткой времени в оболочке сценариев, чтобы упростить ведение журнала. Я хочу создать эту переменную в начале скрипта и выводить текущее время всякий раз, когда я вызываю команду echo $timestamp. Это оказывается сложнее, чем я думал. Вот что я пробовал:

  1. timestamp="(date +"%T")" — команда echo выводит (date +"%T").
  2. timestamp="$(date +"%T")" — команда echo выводит время, когда переменная была инициализирована.

Я пробовал и другие небольшие варианты, но они не сработали лучше. Кто-нибудь знает, как решить мою задачу?

5 ответ(ов)

8

Если вы хотите получить Unix timestamp, вам нужно использовать следующую команду:

timestamp=$(date +%s)

Формат %T вернет только время, аналогично формату %H:%M:%S (подробнее можно узнать по ссылке: http://www.cyberciti.biz/faq/linux-unix-formatting-dates-for-display/).

4

Для того чтобы получить текущую метку времени, а не время, когда была определена фиксированная переменная, можно воспользоваться функцией, а не переменной:

#!/bin/bash

# Определяем функцию для получения метки времени
timestamp() {
  date +"%T" # текущее время
}

# что-то делаем...
timestamp # выводим метку времени
# делаем что-то еще...
timestamp # выводим другую метку времени
# продолжаем...

Если вам не нравится формат, заданный спецификатором %T, вы можете комбинировать другие спецификаторы преобразования времени, поддерживаемые командой date. Для GNU date вы можете ознакомиться с полным списком этих спецификаторов в официальной документации по следующей ссылке: https://www.gnu.org/software/coreutils/manual/html_node/Time-conversion-specifiers.html#Time-conversion-specifiers

2

Вы можете воспользоваться следующей таблицей для генерации временных меток в различных форматах:

Формат / результат Команда Вывод
YYYY-MM-DD date -I $(date -I)
YYYY-MM-DD_hh:mm:ss date +%F_%T $(date +%F_%T)
YYYYMMDD_hhmmss date +%Y%m%d_%H%M%S $(date +%Y%m%d_%H%M%S)
YYYYMMDD_hhmmss (UTC версия) date --utc +%Y%m%d_%H%M%SZ $(date --utc +%Y%m%d_%H%M%SZ)
YYYYMMDD_hhmmss (с учетом локальной TZ) date +%Y%m%d_%H%M%S%Z $(date +%Y%m%d_%H%M%S%Z)
YYYYMMSShhmmss date +%Y%m%d%H%M%S $(date +%Y%m%d%H%M%S)
YYYYMMSShhmmssnnnnnnnnn date +%Y%m%d%H%M%S%N $(date +%Y%m%d%H%M%S%N)
YYMMDD_hhmmss date +%y%m%d_%H%M%S $(date +%y%m%d_%H%M%S)
Секунды с начала эпохи UNIX date +%s $(date +%s)
Только наносекунды date +%N $(date +%N)
Наносекунды с начала эпохи UNIX date +%s%N $(date +%s%N)
ISO8601 UTC временная метка date --utc +%FT%TZ $(date --utc +%FT%TZ)
ISO8601 UTC временная метка + мс date --utc +%FT%T.%3NZ $(date --utc +%FT%T.%3NZ)
ISO8601 временная метка с учетом локальной TZ date +%FT%T%Z $(date +%FT%T%Z)
YYYY-MM-DD (краткий день) date +%F\(%a\) $(date +%F\(%a\))
YYYY-MM-DD (длинный день) date +%F\(%A\) $(date +%F\(%A\))

Эта таблица может помочь вам находить нужный формат для вывода временных меток в ваших скриптах или командной строке.

1

Для получения текущей даты в формате YYYYMMDD в Bash можно использовать следующую команду:

DATE=`date "+%Y%m%d"`

Если вам также нужна текущая дата и время в формате YYYYMMDD-HHMMSS, можно воспользоваться следующей командой:

DATE_WITH_TIME=`date "+%Y%m%d-%H%M%S"` # добавьте %3N, если нужно получить значение в миллисекундах

Обратите внимание, что для получения миллисекунд нужно добавить %3N в формат строки, например:

DATE_WITH_TIME=`date "+%Y%m%d-%H%M%S.%3N"`

Таким образом, вы сможете получить текущую дату с миллисекундами.

0

Формат ISO 8601 (2018-12-23T12:34:56) более читабелен по сравнению с UNIX-меткой времени. Однако в некоторых операционных системах символ : не может использоваться в именах файлов. Поэтому я рекомендую использовать вместо этого такой формат:

2018-12-23_12-34-56

Вы можете использовать следующую команду, чтобы получить метку времени в этом формате:

TIMESTAMP=`date +%Y-%m-%d_%H-%M-%S`

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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь