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