我在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`"
我在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`"
的麻煩:
#!/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[@]}"
嘗試在賦值iteself處執行。
$ #!/bin/sh
$ STR=`date +"%y-%m-%d %H:%M:%S"`
$ echo $STR
14-09-26 11:40:06
可以執行的命令和通過將命令封裝在** backtics **中或通過使用'$(command)'語法將結果分配給變量。例如。 'STR = $(日期+「%y-%m-%d%H:%M:%S」)'。 **注意:**'quotes' **在**或$(「$ somevar_A」...中是正確的......「$ somevar_B」),並且不影響命令執行表達式以外的**引用**。 – 2014-09-26 05:41:38
請注意,評估分配給「STR」的日期意味着每次腳本執行'echo $ STR'時都會打印相同的值。如果意圖是在每次完成「echo」時產生不同的時間戳,那麼這不會有幫助。對於一次性時間戳,腳本將簡單地執行'date'而不捕獲輸出。這似乎是合理的,每次都應該執行命令,而不僅僅是一次(儘管我給你的問題不是這麼說的)。 – 2014-09-26 06:16:36
謝謝!順便說一下,我僅以%y爲例。 – luckyee 2014-09-26 06:29:55
我可以看到你使用'%y';我強烈建議你使用'%Y',因爲你正在重塑千年蟲問題,當它發生時這不是一件好事。然而,這是你的葬禮,不是我的。或者,也許,你認爲這將是追隨你之後的人的葬禮,而且你將會早已離開 - 我也會如此,但我更願意寫出具有持續時間比我長的機會的彈性軟件。 – 2014-09-26 06:30:53
再次感謝。 :) – luckyee 2014-09-26 06:34:06