Створіть змінну часових позначок у скрипті bash


375

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

timestamp="(date +"%T")" відлуння друкує (date +"%T")

timestamp="$(date +"%T")" echo друкує час, коли змінна була ініціалізована.

Інші речі, які я спробував, - це лише незначні зміни, які не спрацювали краще. Хтось знає, як досягти того, що я намагаюся зробити?

Відповіді:


309

Для отримання поточної позначки часу, а не часу, коли визначена фіксована змінна, хитрість полягає у використанні функції, а не змінної:

#!/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".
чепнер

5
Що стосується форматування, то ось нарізаний набір найчастіших форматів: zxq9.com/archives/795
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
Але ця змінна буде просто містити значення часу, коли змінна була ініційована, я прав?
lindhe

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

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
дякую, ось що я хотів: мітка часу як змінна для повторного використання в моєму сценарії! Синтаксис оболонки настільки заплутаний.
Путратор

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

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: Ось так працюють змінні. Використовуйте функцію, якщо потрібно динамічний вихід.
choroba

11

Можна використовувати

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

Це відображається у форматі 2014-02-01 15:12:35-05:00

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


1
Що стосується часу, який він отримує, це слід виконати безпосередньо перед включенням у вихідний екран або файл журналу, призначений для того, щоб вказати час виводу.
Білл

2
це менше, ніж ідеальний формат для часової позначки через простір у висновку. Не забудьте процитувати це "$ timestamp" у використанні, або ви отримаєте два парами для команди. наприклад, touch $timestampстворить два файли.
гарнітур

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.