2012-03-06 118 views
4

這是我第一次出遠門到的Unix腳本的境界,我不知道如何去了解這一點。我會查詢一個數據庫並提取一個時間戳。我需要做的是採取時間戳(以真棒格式YYYYMMDDHHMMSS),如果它超過10分鐘,返回1返回0.的Unix腳本來比較時間戳與當前時間

同樣,我基本上沒有這種類型的腳本的經驗(背景是在C + +和C#)所以如果你們不介意多一點解釋我會很感激 - 我想了解它是如何工作的。

謝謝!

+1

perl,python,ruby ..任何偏好? – 2012-03-06 18:02:02

+0

使用'date'實用程序的格式將當前時間加上10 * 60 s格式化爲與DB相同的格式,然後進行簡單的字符串比較。瑣碎在Bash,但我與Karoly一起喜歡什麼? ... :) – 0xC0000022L 2012-03-06 18:05:39

+0

他問unix .. – Teja 2012-03-06 18:06:02

回答

2

假設$ dbtimestamp具有從數據庫返回的時間戳,但是我在這裏對它進行了硬編碼。

dbtimestamp=20120306142400 

secondsDiff=$((`date '+%Y%m%d%H%M%S'` - $dbtimestamp)) 
if [ $secondsDiff -gt 600 ] 
then 
    exit 1 
else 
    exit 0 
fi 
+0

謝謝你,這工作完美! – Hershizer33 2012-03-06 20:47:33

+0

這是治療YmdHMS字符串,因爲它們是十進制數字。 $((20120306150000 - 20120306145959))返回4041,而不是1 – djjeck 2012-11-26 21:20:57

+0

是的,這就是爲什麼下一行比較秒數與600(10分鐘)之間的差異,然後返回0或1. – 2012-11-28 14:15:58

5

你的工具的工作依賴於Unix的使用香精的方式。以下應在Linux下的FreeBSD,NetBSD的,OSX等

#!/bin/sh 

sample="${1:-20120306131701}" 

if ! expr "$sample" : '[0-9]\{14\}$' >/dev/null; then 
    echo "ERROR: unknown date format" >&2 
    exit 65 
fi 

case $(uname -s) in 
    *BSD|Darwin) 
    # The BSD date command allows you to specify an input format. 
    epoch=$(date -jf '%Y%m%d%H%M%S' "$sample" '+%s') 
    ;; 
    Linux) 
    # No input format in Linux, so rewrite date to something '-d' will parse 
    tmpdate="$(echo "$sample" | sed -r 's/(.{8})(..)(..)(..)/\1 \2:\3:\4/')" 
    epoch=$(date -d "$tmpdate" '+%s') 
    ;; 
    *) 
    echo "ERROR: I don't know how to do this in $(uname -s)." >&2 
    exit 69 
    ;; 
esac 

now=$(date '+%s') 

# And with the provided datetime and current time as integers, it's MATH time. 
if [ $((now - epoch)) -gt 600 ]; then 
    exit 1 
fi 

exit 0 

注意,這是一個/bin/sh腳本,便攜性的緣故工作,所以也沒有充分利用的bash-ISMS你可能會習慣於在Linux中使用,特別是[[ ... ]]和heretext來讀取變量。

哦,我假設你說的「退出價值」,當你說「返回值」。返回值是一個函數的結果,但我上面寫的是一個獨立的腳本。

請注意,這可能不會理解將來的時間戳,也不需要考慮時區。如果這對你很重要,你應該,呃,考慮一下。 :-)並在您的環境中進行測試。