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

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

我想使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

您的示例失败的原因是 shell 的分词工作方式。当您运行 时"$($nice_date)",shell 正在执行date带有两个参数"+%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"

有关将命令存储在变量中的复杂情况的更多详细信息,请参阅Bash常见问题解答 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"

相关内容