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


13

我想使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命令获得一个正确的参数?


附带说明一下,"%F %T"如果您使用的是GNU ,则日期格式字符串可以缩短为date
jordanm 2015年

问题是空间。如果使用nice_date="date +%Y-%m-%d-%H:%M:%S",它会起作用。我目前无法看到如何从第二个外壳保护该空间。
MadHatter

Answers:


13

您的示例失败的原因是因为shell的单词拆分方式。当您运行"$($nice_date)",外壳执行date命令有两个参数,"+%Y-%m-%d""%H:%M:%S"。之所以失败,是因为date的格式字符串必须是单个参数。

最好的方法是使用函数而不是将命令存储在变量中:

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"

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

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

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


谢谢,但是我很好奇为什么我的方法行不通,您能详细说明一下吗?
gilbertasm 2015年

@gilbertasm答案更新
jordanm

1
我在date: extra operand ‘’上述两种方法上都遇到了错误
Jeff Puckett

3

我同意功能是最好的选择。作为替代方案,只需将格式存储为变量而不是整个命令即可:

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

1
@Kusalananda:完全正确。谢谢!已更新答案
亚当

而且,嗯,很抱歉,但是echo和命令的替换也是多余的。
Kusalananda

1
是的,在我使用的简化示例中,它们在技术上是多余的(我可以说它们产生的代码更具可读性,但这是一个品味问题)。已更新为使用来自OP,在这种情况下,他们需要的例子
亚当

是的,这个例子更有意义。
Kusalananda

1

最短的答案是

#if you want to store in a variable
now=$(date '+%F" "%T');
echo $now

#or direct output (single quote may not needed)
date '+%F" "%T'

1

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

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

0

请尝试以下方法:

您需要在键盘上的波浪号上添加符号“`”。该符号表示外壳程序先执行命令,然后再分配给变量。

[root@RHEL01 ~]# My_Var=`date +"%Y-%m-%d %H:%M:%S"`
[root@RHEL01 ~]# echo $My_Var
2015-09-17 10:05:30
[root@RHEL01 ~]#

与伊恩的答案同样的问题。
MadHatter

0

代替:

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"

-1

有同样的问题;必须将日期放入awk打印文件中,以供splunk处理。我用了

DATE1=`date +%Y-%m-%d`

DATE2=`date +%T`

然后

awk ' { print "['$DATE1' '$DATE2'] topic=" $1, etc

1
您能确切说明这如何回答问题吗?
G-Man说'Resstate Monica''19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.