如何在脚本中使用空格作为变量格式化日期输出?

gil*_*asm 15 bash date

我想date用这样的格式制作命令:

$ date +"%Y-%m-%d %H:%M:%S"
2015-09-17 16:51:58
Run Code Online (Sandbox Code Playgroud)

但我想把它保存在变量中,所以我可以像这样从脚本调用: 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.
Run Code Online (Sandbox Code Playgroud)

这样做的正确方法是什么,以便 date 命令获得一个正确的参数?

jor*_*anm 14

您的示例失败的原因是 shell 的分词工作方式。当您运行时"$($nice_date)",shell 正在执行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"
Run Code Online (Sandbox Code Playgroud)

如果您真的想将命令存储在变量中,则可以使用数组:

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

有关将命令存储在变量中的复杂情况的更多详细信息,请参阅BashFAQ 050

  • 使用上述两种方法时,我收到“日期:额外操作数 ''” 错误 (2认同)

小智 10

一种简单的方法是使用 \ 来“转义”该空间。

nice_date="date +%Y-%m-%d\ %H:%M:%S"
Run Code Online (Sandbox Code Playgroud)

  • 这应该是最佳答案 - 漂亮又简单 (2认同)