Bash – date命令和空间

我正在尝试创build一个在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 

我已经尝试过,但我不能使用这种方法,因为我想在脚本中多次运行该命令。

任何帮助将非常感激!

正确的方法是在你的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有神奇的含义。

逃离的空间为我工作。

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