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

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

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

答え2

簡単な方法は\を使ってスペースを「脱出」することです。

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

答え3

私は機能が最良の方法であることに同意します。代わりに、コマンド全体ではなく型を変数として保存します。

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

答え4

変える:

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"

関連情報