2014-09-26 1108 views
0

我在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`" 

回答

1

的麻煩:

#!/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[@]}" 
+0

謝謝!順便說一下,我僅以%y爲例。 – luckyee 2014-09-26 06:29:55

+0

我可以看到你使用'%y';我強烈建議你使用'%Y',因爲你正在重塑千年蟲問題,當它發生時這不是一件好事。然而,這是你的葬禮,不是我的。或者,也許,你認爲這將是追隨你之後的人的葬禮,而且你將會早已離開 - 我也會如此,但我更願意寫出具有持續時間比我長的機會的彈性軟件。 – 2014-09-26 06:30:53

+0

再次感謝。 :) – luckyee 2014-09-26 06:34:06

0

嘗試在賦值iteself處執行。

$ #!/bin/sh 

    $ STR=`date +"%y-%m-%d %H:%M:%S"` 

    $ echo $STR 
    14-09-26 11:40:06 
+0

可以執行的命令和通過將命令封裝在** backtics **中或通過使用'$(command)'語法將結果分配給變量。例如。 'STR = $(日期+「%y-%m-%d%H:%M:%S」)'。 **注意:**'quotes' **在**或$(「$ somevar_A」...中是正確的......「$ somevar_B」),並且不影響命令執行表達式以外的**引用**。 – 2014-09-26 05:41:38

+0

請注意,評估分配給「STR」的日期意味着每次腳本執行'echo $ STR'時都會打印相同的值。如果意圖是在每次完成「echo」時產生不同的時間戳,那麼這不會有幫助。對於一次性時間戳,腳本將簡單地執行'date'而不捕獲輸出。這似乎是合理的,每次都應該執行命令,而不僅僅是一次(儘管我給你的問題不是這麼說的)。 – 2014-09-26 06:16:36