スクリプトで空白を変数として日付出力形式を指定するには?

スクリプトで空白を変数として日付出力形式を指定するには?

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.

dateコマンドが正しいパラメータを取得するようにこれを行う正しい方法は何ですか?

ベストアンサー1

例が失敗した理由は、シェルの単語分離がどのように機能するかによるものです。を実行すると、"$($nice_date)"シェルはdate2つの引数"+%Y-%m-%d"を使用してコマンドを実行します"%H:%M:%S"。日付の書式文字列は単一引数である必要があるため失敗します。

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

format_date() {
  # echo is not needed
  date "+%Y-%m-%d %H:%M:%S" "$@"
}
format_date
format_date -d "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[@]}" -d "2015-09-17 16:51:58"

変数にコマンドを保存するプロセスの複雑さの詳細については、次を参照してください。バッシュFAQ 050

おすすめ記事