web-dev-qa-db-ja.com

スクリプトで変数としてスペースを使用して日付出力をフォーマットするにはどうすればよいですか?

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つ取得しますか?

13
gilbertasm

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

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

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 05 を参照してください。

13
jordanm

機能が最善の方法であることに同意します。別の方法として、コマンド全体ではなく変数としてフォーマットを格納するだけです。

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

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

Nice_date="date +%Y-%m-%d\ %H:%M:%S"
1
user381580

最短の答えは

#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
Thanh Trung

の代わりに:

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"
0
user1333144

以下をお試しください:

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

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