Создание переменной временной метки в bash-скрипте
Я пытаюсь создать переменную с текущей меткой времени в оболочке сценариев, чтобы упростить ведение журнала. Я хочу создать эту переменную в начале скрипта и выводить текущее время всякий раз, когда я вызываю команду echo $timestamp
. Это оказывается сложнее, чем я думал. Вот что я пробовал:
timestamp="(date +"%T")"
— командаecho
выводит(date +"%T")
.timestamp="$(date +"%T")"
— командаecho
выводит время, когда переменная была инициализирована.
Я пробовал и другие небольшие варианты, но они не сработали лучше. Кто-нибудь знает, как решить мою задачу?
5 ответ(ов)
Если вы хотите получить Unix timestamp, вам нужно использовать следующую команду:
timestamp=$(date +%s)
Формат %T
вернет только время, аналогично формату %H:%M:%S
(подробнее можно узнать по ссылке: http://www.cyberciti.biz/faq/linux-unix-formatting-dates-for-display/).
Для того чтобы получить текущую метку времени, а не время, когда была определена фиксированная переменная, можно воспользоваться функцией, а не переменной:
#!/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
Вы можете воспользоваться следующей таблицей для генерации временных меток в различных форматах:
Формат / результат | Команда | Вывод |
---|---|---|
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\)) |
Эта таблица может помочь вам находить нужный формат для вывода временных меток в ваших скриптах или командной строке.
Для получения текущей даты в формате 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"`
Таким образом, вы сможете получить текущую дату с миллисекундами.
Формат ISO 8601 (2018-12-23T12:34:56
) более читабелен по сравнению с UNIX-меткой времени. Однако в некоторых операционных системах символ :
не может использоваться в именах файлов. Поэтому я рекомендую использовать вместо этого такой формат:
2018-12-23_12-34-56
Вы можете использовать следующую команду, чтобы получить метку времени в этом формате:
TIMESTAMP=`date +%Y-%m-%d_%H-%M-%S`
Это тот формат, который я видел во многих приложениях. Еще одно преимущество этого подхода заключается в том, что если ваши имена файлов начинаются с этого формата, вы можете сортировать их по алфавиту, и они будут отсортированы по дате.
Как проверить, установленна ли переменная в Bash
Установить переменные окружения из файла с парами ключ/значение
Извлечение имени файла и расширения в Bash
Как работает "cat << EOF" в bash?
Передача параметров в функцию Bash