我在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`"
我在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`"
的麻烦:
#!/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[@]}"
尝试在赋值iteself处执行。
$ #!/bin/sh
$ STR=`date +"%y-%m-%d %H:%M:%S"`
$ echo $STR
14-09-26 11:40:06
可以执行的命令和通过将命令封装在** backtics **中或通过使用'$(command)'语法将结果分配给变量。例如。 'STR = $(日期+“%y-%m-%d%H:%M:%S”)'。 **注意:**'quotes' **在**或$(“$ somevar_A”...中是正确的......“$ somevar_B”),并且不影响命令执行表达式以外的**引用**。 – 2014-09-26 05:41:38
请注意,评估分配给“STR”的日期意味着每次脚本执行'echo $ STR'时都会打印相同的值。如果意图是在每次完成“echo”时产生不同的时间戳,那么这不会有帮助。对于一次性时间戳,脚本将简单地执行'date'而不捕获输出。这似乎是合理的,每次都应该执行命令,而不仅仅是一次(尽管我给你的问题不是这么说的)。 – 2014-09-26 06:16:36
谢谢!顺便说一下,我仅以%y为例。 – luckyee 2014-09-26 06:29:55
我可以看到你使用'%y';我强烈建议你使用'%Y',因为你正在重塑千年虫问题,当它发生时这不是一件好事。然而,这是你的葬礼,不是我的。或者,也许,你认为这将是追随你之后的人的葬礼,而且你将会早已离开 - 我也会如此,但我更愿意写出具有持续时间比我长的机会的弹性软件。 – 2014-09-26 06:30:53
再次感谢。 :) – luckyee 2014-09-26 06:34:06