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"
chepner 2013年

5
フォーマットについては、最も頻繁に使用されるフォーマットのカットアンドドライセットを以下に示します。zxq9.com
archives

175
私にとって、私は欲しかった date +"%Y-%m-%d_%H-%M-%S"
キンボールロビンソン

3
何らかの理由で、これはタイムスタンプを与えませんでしたが、「:」を間に挟んだ現在の時刻。
erikbwork

7
私のようにUNIXタイムスタンプを生成する方法を探している多くの人々がこの質問に到達し、dchakarovの回答がより有用であると思いますが、この回答は質問者の質問により適切に対処します。
広大なスーパーマン2017年

565

UNIXタイムスタンプを取得したい場合は、以下を使用する必要があります。

timestamp=$(date +%s)

%T時間だけを与えます。%H:%M:%Shttp://www.cyberciti.biz/faq/linux-unix-formatting-dates-for-display/を介して)と同じ


5
しかし、この変数は、変数が開始されたときの値を保持するだけですよね?
lindhe 2014

9
質問のタイトルに答えるため、これは多くの賛成票を獲得していると思いますが、質問の本文には答えていません。DOPは毎回異なるタイムスタンプを取得したかったのですが、これはスクリプト全体に1つを格納します。
fedorqui 'SO stop harming'

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で同じことをする方法。ありがとう
kosgeinsky

43

ISO 8601形式(2018-12-23T12:34:56)は、UNIXタイムスタンプよりも読みやすくなっています。ただし、一部のOSでは:、ファイル名に含めることはできません。したがって、代わりに次のようなものを使用することをお勧めします。

2018-12-23_12-34-56

次のコマンドを使用して、この形式でタイムスタンプを取得できます。

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

これは、多くのアプリケーションで使用されている形式です。これのもう1つの良い点は、ファイル名がこれで始まる場合、アルファベット順に並べ替えることができ、日付順に並べ替えられることです。


1
ありがとう、これは私のバージョン管理スクリプトに最適です
Andy

1
TZ=UTC date +...はUTCタイムスタンプを使用することでこれをよりポータブルにすることができます
MichaelChirico

17

私はubuntu 14.04を使用しています。

私のシステムの正しい方法はdate +%sです。

の出力date +%Tは次のようになり12:25:25ます。


15

コマンド置換を使用します。

timestamp=$( date +%T )

3
これは私がすでに試したものであり、変数が初期化された時間のみを出力します。
ダン・

10
@ dan08:変数はこのように機能します。動的な出力が必要な場合は、関数を使用します。
チョロバ2013年

11

使用できます

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

これはフォーマットで提供します 2014-02-01 15:12:35-05:00

バックティック(`)文字は、それらの間の何が評価され、結果が行に含まれるようにします。 date --help他のオプションがあります。


1
何時になるかは、画面出力や出力時刻を記載したログファイルに含める直前に実行してください。
ビル、

2
これは、出力にスペースが含まれるため、タイムスタンプの理想的な形式ではありません。使用法では必ず「$ timestamp」を引用してください。引用符を付けないと、コマンドに2つのパラメータが渡されます。たとえばtouch $timestamp、2つのファイルが作成されます。
harschware 2017

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.