linux
  • bash
  • date
  • 2014-12-06 113 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

    相關問題