linux
  • bash
  • date
  • 2014-12-06 86 views 4 likes 
    4

    我想创建一个在bash中使用date命令的脚本。我熟悉date命令的基本语法。 下面是一个简单的脚本:Bash - 日期命令和空间

    #!/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 
    

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

    任何帮助将非常感激!

    +3

    定义一个Bash函数。 – 5gon12eder 2014-12-06 23:32:47

    +0

    这真的是一个很好的appoach!但是,因为它让我发疯,所以我真的很想知道为什么上述不起作用! – VGe0rge 2014-12-06 23:34:30

    回答

    8

    正确的方法是在你的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 uated仿佛它被写入像这样从而正确地调用date来解决。

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

    PS最好避免使用全大写的标识符字符串,因为这些字符串通常与环境变量冲突,甚至对shell有魔法含义。

    +0

    非常感谢你向我解释这个:) – VGe0rge 2014-12-06 23:58:00

    4

    逃离空间适合我。

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

    适用于我 - DATE_FORMAT = \'date +%Y-%m-%d \%H:%M:%S \' – 2017-09-25 08:12:00

    相关问题