Bash - 日期命令和空间

时间:2014-12-06 23:29:12

标签: linux bash date

我正在尝试创建一个在bash中使用date命令的脚本。我熟悉date命令的基本语法。 这是一个简单的脚本:

#!/bin/bash 
set -x 
DATE_COMMAND="date "+%y-%m-%d %H:%M:%S"" 
echo "$($DATE_COMMAND)" 
set +x

问题是上面的代码不起作用。 这是输出:

+ DATE_COMMAND='date +%y-%m-%d'
+ %H:%M:%S
onlyDate: line 3: fg: no job control
+ echo ''

+ set +x

好的,问题是bash由于空间而拆分命令。我能理解,但我不知道如何避免这种情况。我试图避开\的空格,以避开空格和"。单引号似乎也不起作用。

请注意,我知道这个脚本可以这样写:

#!/bin/bash
set -x
DATE_COMMAND=$(date "+%y-%m-%d %H:%M:%S")

echo "$DATE_COMMAND"
set +x

我已尝试过,但我无法使用此方法,因为我想在我的脚本中多次运行该命令。

任何帮助都将非常感谢!

4 个答案:

答案 0 :(得分:10)

正确的方法是在Bash脚本中定义自己的函数。

function my_date {
  date "+%y-%m-%d %H:%M:%S"
}

现在您可以使用my_date,就像它是外部程序一样。

例如:

echo "It is now $(my_date)."

或者简单地说:

my_date

为什么您的方法不起作用?

第一个问题是你的作业被打破了。

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

将其解析为字符串date +%y-%m-%d到变量DATE_COMMAND的赋值。在空白之后,shell开始以您不想要的方式解释剩余的符号。

这可以通过更改报价来部分修复。

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

然而,这并没有真正解决问题,因为如果我们现在使用

echo $($DATE_COMMAND)

它不会正确扩展参数。 date程序将看到参数'+%y-%m-%d%H:%M:%S'(带引号)而不是单个字符串。这可以通过使用

中的eval来解决
DATE_COMMAND="date '+%y-%m-%d %H:%M:%S'"
echo $(eval $DATE_COMMAND)

首先将变量DATE_COMMAND扩展为字符串date '+%y-%m-%d %H:%M:%S',然后eval,就好像它是这样编写的,从而正确地调用date

请注意,我只是为了解释这个问题而展示了这个。 eval在这里不是一个好的解决方案。改为使用函数。

PS最好避免使用全大写标识符字符串,因为它们通常与环境变量冲突,甚至对shell具有神奇的意义。

答案 1 :(得分:5)

逃离空间对我有用。

echo `date +%d.%m.%Y\ %R.%S.%3N` 

答案 2 :(得分:1)

最短的答案是

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

#or direct output
date '+%F" "%T'

答案 3 :(得分:1)

用于长脚本

声明变量部分:

dateformat="%Y-%m-%d %H:%M:%S"

任何地方获取日期:

datestr=`date +"${dateformat}"`

任何地方回显日期:

echo ${datestr}

对于简短的简单脚本,DaniëlGu的答案是最好的:

echo `date +%d.%m.%Y\ %R.%S.%3N`