Создать переменную отметки времени в скрипте bash


375

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

timestamp="(date +"%T")" эхо распечатывает (date +"%T")

timestamp="$(date +"%T")" echo печатает время инициализации переменной.

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

Ответы:


310

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

#!/bin/bash

# Define a timestamp function
timestamp() {
  date +"%T"
}

# do something...
timestamp # print timestamp
# do something else...
timestamp # print another timestamp
# continue...

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


26
В зависимости от того, как вы собираетесь использовать это, вы все равно должны использовать подстановки команды: echo "$(timestamp): something happened".
chepner

5
Что касается форматирования, то здесь представлен полный
zxq9

175
Для меня я хотел date +"%Y-%m-%d_%H-%M-%S"
Кимбалл Робинсон

3
по какой-то причине это не дало мне метку времени, а текущее время с ":" между ними.
erikbwork

7
Я думаю, что многие приходят к этому вопросу в поисках способа создания метки времени Unix (как у меня) и считают, что ответ dchakarov более полезен, даже если этот ответ лучше отвечает на вопрос автора.
Чрезвычайно высший человек

565

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

timestamp=$(date +%s)

%Tдаст вам только время; так же, как %H:%M:%S(через http://www.cyberciti.biz/faq/linux-unix-formatting-dates-for-display/ )


5
Но эта переменная будет просто содержать значение времени, когда переменная была инициирована, я прав?
Линд

9
Я предполагаю, что это вызывает много голосов, потому что оно отвечает на заголовок вопроса, но не отвечает на тело вопроса: D OP хотел получать разную метку времени каждый раз, тогда как она будет хранить ее для всего сценария.
Федорки 'ТАК прекрати вредить'

1
Я пришел сюда в поисках именно этого. Т.е. правильная строка формата для получения метки времени Unix date. Однако я также проголосовал за «правильный» ответ. Я не искал этого, но это лучший ответ на первоначальный вопрос, и это также очень полезно для меня.
Чрезвычайно высший человек

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

DATE_WITH_TIME=`date "+%Y%m%d-%H%M%S"` #add %3N as we want millisecond too

1
спасибо, это то, что я хотел: отметка времени в качестве переменной для повторного использования в моем сценарии! Синтаксис оболочки настолько сбивает с толку.
Poutrathor

2
+1 для добавления миллисекундной части. Это, echo $(date +"%Y-%m-%dT%T.%3N%z") однако, я не могу заставить его работать в терминале Mac. Как сделать то же самое в Mac. Спасибо
Косгеинский

43

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

2018-12-23_12-34-56

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

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

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


1
Спасибо, это здорово для моего скрипта контроля версий
Энди

1
TZ=UTC date +...может сделать это более компактно , используя UTC метку времени
MichaelChirico

17

Я использую Ubuntu 14.04.

Правильный путь в моей системе должен быть date +%s.

Вывод date +%Tкак 12:25:25.


15

Используйте подстановку команд:

timestamp=$( date +%T )

3
Это то, что я уже пробовал, и он только печатает время, когда переменная была инициализирована.
Дан

10
@ dan08: так работают переменные. Используйте функцию, если вы хотите динамический вывод.
Чороба

11

Ты можешь использовать

timestamp=`date --rfc-3339=seconds`

Это доставляет в формате 2014-02-01 15:12:35-05:00

`Символы back-tick ( ) будут вызывать оценку того, что находится между ними, и включать результат в строку. date --helpесть другие варианты.


1
Что касается времени, которое это получает, это должно быть выполнено непосредственно перед включением в вывод на экран или в файл журнала, предназначенный для того, чтобы указывать время вывода.
Билл

2
это менее чем идеальный формат для отметки времени из-за пробела в выводе. Обязательно указывайте его в кавычке "$ timestamp", иначе вы получите два параметра команды. Например, touch $timestampсоздаст два файла.
harschware

8

Последние версии bashне требуют вызова внешней программы date:

printf -v timestamp '%(%T)T'

%(...)Tиспользует соответствующий аргумент в качестве метки времени UNIX и форматирует его в соответствии с strftimeформатом -style в скобках. Аргумент -1соответствует текущему времени, и когда двусмысленность не возникнет, можно опустить.


5

И для моих соотечественников, попробуйте использовать это:

timestamp=$(date +%d-%m-%Y_%H-%M-%S)

предоставит формат формата: "15-02-2020_19-21-58"

Вы вызываете переменную и получаете строковое представление, как это

$timestamp

1
Пожалуйста, рассмотрите возможность использования кодовой нотации для вашего кода.
сао

4
timestamp=$(awk 'BEGIN {srand(); print srand()}')

srand без значения использует текущую временную метку с большинством реализаций Awk.


Мне нравится этот, очень креативный!
TobiV
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.