2014-09-26 68 views
0

我在linux shell中输入:date +“%y-%m-%d%H:%M:%S”我得到正确的结果,例如:14-09- 26 10:47:28。关于在linux shell脚本中打印正式日期时间

但是,当我想在shell脚本中得到结果时,出现错误:“date:illegal time format”,为什么?

#!/bin/sh 

STR='date +"%y-%m-%d %H:%M:%S"' 

echo "`$STR`" 

回答

1

的麻烦:

#!/bin/sh 

STR='date +"%y-%m-%d %H:%M:%S"' 

echo "`$STR`" 

是,当字符串中的echo指令被执行,则date命令可以看到三个参数:

date 
+%y-%m-%d 
%H:%M:%S 

它试图解释%H:%M:%S作为日期/时间格式:

[[[mm]dd]HH]MM[[cc]yy][.ss]] 

或:

mmddhhmm[[cc]yy] 

或:

[MMDDhhmm[[CC]YY][.ss]] 

(从Mac OS X date,第二从POSIX,从GNU date第三第一)。在这些中,这些字母对代表将被设置为时间的日期的组成部分。由于%H:%M:%S字符串不包含数字,因此它是无效的日期格式。

你怎么能解决这个问题?

它部分取决于/bin/sh是Bash,Korn shell,Dash,Bourne shell还是其他一些shell。

最简单的解决方案应该在所有,但最古老的Bourne外壳的工作,那就是创建一个函数:

dt() { date +'%Y-%m-%d %H:%M:%S'; } 

然后,您可以使用:使用偏好$(…)符号

echo "$(dt)" 

以备用。

请注意,我拒绝使用%y;我记得千年虫问题,即使你太年轻了,也没有参与整治工作。

一种替换的技术需要用于阵列的支持(击,光辉壳,但不破折号或Bourne):

STR=(date +"%Y-%m-%d %H:%M:%S") 

echo "$("${STR[@]}")" 

,或者更简单地:

在外壳内
"${STR[@]}" 
+0

谢谢!顺便说一下,我仅以%y为例。 – luckyee 2014-09-26 06:29:55

+0

我可以看到你使用'%y';我强烈建议你使用'%Y',因为你正在重塑千年虫问题,当它发生时这不是一件好事。然而,这是你的葬礼,不是我的。或者,也许,你认为这将是追随你之后的人的葬礼,而且你将会早已离开 - 我也会如此,但我更愿意写出具有持续时间比我长的机会的弹性软件。 – 2014-09-26 06:30:53

+0

再次感谢。 :) – luckyee 2014-09-26 06:34:06

0

尝试在赋值iteself处执行。

$ #!/bin/sh 

    $ STR=`date +"%y-%m-%d %H:%M:%S"` 

    $ echo $STR 
    14-09-26 11:40:06 
+0

可以执行的命令和通过将命令封装在** backtics **中或通过使用'$(command)'语法将结果分配给变量。例如。 'STR = $(日期+“%y-%m-%d%H:%M:%S”)'。 **注意:**'quotes' **在**或$(“$ somevar_A”...中是正确的......“$ somevar_B”),并且不影响命令执行表达式以外的**引用**。 – 2014-09-26 05:41:38

+0

请注意,评估分配给“STR”的日期意味着每次脚本执行'echo $ STR'时都会打印相同的值。如果意图是在每次完成“echo”时产生不同的时间戳,那么这不会有帮助。对于一次性时间戳,脚本将简单地执行'date'而不捕获输出。这似乎是合理的,每次都应该执行命令,而不仅仅是一次(尽管我给你的问题不是这么说的)。 – 2014-09-26 06:16:36