スクリプトで変数としてスペースを使用して日付出力をフォーマットする方法は?


13

私はdateこのような素晴らしいフォーマットでコマンドを作りたいです:

$ date +"%Y-%m-%d %H:%M:%S"
2015-09-17 16:51:58

しかし、これを変数に保存したいので、次のようなスクリプトから呼び出すことができます。 echo "$(nice_date) [WARNING] etc etc"

しかし、それは動作しません

$ nice_date="date +%Y-%m-%d %H:%M:%S"
$ echo "$($nice_date)"
date: extra operand ‘%H:%M:%S
Try 'date --help' for more information.

$ nice_date="date +\"%Y-%m-%d %H:%M:%S\""
$ echo "$($nice_date)"
date: extra operand ‘%H:%M:%S"’
Try 'date --help' for more information.

$ nice_date='date +"%Y-%m-%d %H:%M:%S"'
$ echo "$($nice_date)"
date: extra operand ‘%H:%M:%S"
Try 'date --help' for more information.

これを行う正しい方法は何ですか?そのため、その日付コマンドは1つの正しい引数を取得しますか?


補足として、"%F %T"GNUを使用している場合は、日付形式文字列を短縮できますdate
ヨルダン

問題はスペースです。を使用するとnice_date="date +%Y-%m-%d-%H:%M:%S"、機能します。現在、2番目のシェルからそのスペースを保護する方法はわかりません。
MadHatter

回答:


13

あなたの例が失敗する理由は、シェルの単語分割の動作方法のためです。あなたが実行すると"$($nice_date)"、シェルが実行されているdate二つの引数を指定して、コマンドを、"+%Y-%m-%d""%H:%M:%S"。日付のフォーマット文字列は単一の引数でなければならないため、これは失敗します。

これを行う最善の方法は、コマンドを変数に保存する代わりに関数を使用することです。

format_date() {
  # echo is not needed
  date "+%Y-%m-%d %H:%M:%S" "$1"
}
format_date
format_date "2015-09-17 16:51:58"
echo "$(format_date) [WARNING] etc etc"

コマンドを変数に保存したい場合は、配列を使用できます。

nice_date=(date "+%Y-%m-%d %H:%M:%S")
# again echo not needed
"${nice_date[@]}" "2015-09-17 16:51:58"

コマンドを変数に格納する複雑なケースの詳細については、BashFAQ 050を参照してください。


ありがとうございますが、なぜ私のアプローチがうまくいかないのか興味があります。詳しく説明していただけますか?
ギルベルタズム

@gilbertasmの回答が更新されました
ヨルダン

1
date: extra operand ‘’上記の両方のアプローチでエラーが発生しています
ジェフパケット

3

関数が最善の方法であることに同意します。別の方法として、コマンド全体ではなく変数として形式を保存するだけです:

$ nice_date='+%Y-%m-%d %H:%M:%S'
$ echo "$(date "$nice_date") [WARNING] etc etc"

1
@Kusalananda:まったくその通りです。ありがとうございました!答えを更新しました
アダム

そして、ええと、申し訳ありませんがecho、コマンドの置換も不要です。
クサラナナンダ

1
はい、私が使用した簡略化された例では技術的に不必要でした(より読みやすいコードを生成すると主張できましたが、それは好みの問題です)。OPの例を使用するように更新しました。この場合、それらは必要です
Adam Adam

はい、その例はより理にかなっています。
クサラナナンダ

1

最短回答は

#if you want to store in a variable
now=$(date '+%F" "%T');
echo $now

#or direct output (single quote may not needed)
date '+%F" "%T'

1

1つの簡単な方法は、\でスペースを「エスケープ」することです。

nice_date="date +%Y-%m-%d\ %H:%M:%S"

0

以下を試してください:

キーボードのチルダキー上にある記号「 `」を追加する必要があります。記号は、最初にコマンドを実行してから変数に割り当てるようにシェルに指示します。

[root@RHEL01 ~]# My_Var=`date +"%Y-%m-%d %H:%M:%S"`
[root@RHEL01 ~]# echo $My_Var
2015-09-17 10:05:30
[root@RHEL01 ~]#

イアンの答えと同じ問題。
MadHatter

0

の代わりに:

nice_date="date +%Y-%m-%d %H:%M:%S"
echo "$($nice_date)"

試してください:

nice_date_format="+%Y-%m-%d %H:%M:%S"
echo $(date "$nice_date_format")

また、最後のコマンド置換は必要ありません。

date "$nice_date_format"

-1

同じ問題がありました。splunkで処理するためにawk印刷に日付を入れなければなりませんでした。私は使った

DATE1=`date +%Y-%m-%d`

DATE2=`date +%T`

それから

awk ' { print "['$DATE1' '$DATE2'] topic=" $1, etc

1
これが質問にどのように答えるかを正確に説明できますか?
G-Manが「Reinstate Monica」と言う
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.