2011-10-03 232 views
2

我正在研究一個shell腳本,該腳本從網頁中刪除日期,然後檢查它是否在當前日期的最後三天(在Cygwin中運行它)。如果測試通過,它只是回聲「通過」,如果失敗,它會迴應「失敗」;Shell腳本比較日期

然而,當我運行我的腳本,我得到以下幾點:

integer expression expected: 1317618000 
FAIL 

下面是腳本:

updateStr=$(curl "http://www.mywebsite.com" | grep "Last Update") 
dateStr=(`echo $updateStr | sed -e 's/.*Last Update: \([^<]*\)<.*/\1/'`) 
update=$(date -d "$dateStr" +%s) 
epoch=$(date -d "-3 days ago" +%s) 
test "$update" -ge "$epoch" && echo "PASS" || echo "FAIL" 

在這個問題上是什麼任何想法?

編輯

這裏是關於腳本運行bash -x結果:

$ bash -x check_date.sh 
++ curl http://www.mywebsite.com 
++ grep 'Last Update' 
    % Total % Received % Xferd Average Speed Time Time  Time Current 
          Dload Upload Total Spent Left Speed 
100 6542 100 6542 0  0 789  0 0:00:08 0:00:08 --:--:-- 1544 
+ updateStr='    <span style="float:right">Last Update: 10/3/2011 2: 
'8:45 AM</span></p> 
++ echo '<span' 'style="float:right">Last' Update: 10/3/2011 2:58:45 'AM</span>< 
'p> 
++ sed -e 's/.*Last Update: \([^<]*\)<.*/\1/' 
' dateStr='(10/3/2011 2:58:45 AM) 
' +%ste -d '(10/3/2011 2:58:45 AM) 
+ update=$'1317618000\r' 
++ date -d '-3 days ago' +%s 
+ epoch=$'1317938194\r' 
+ test $'1317618000\r' -ge $'1317938194\r' 
: integer expression expected1317618000 
+ echo FAIL 
FAIL 

更新

我試圖消除出現在日期輸出回車,但它仍然沒有工作。以下是更新後的腳本:

updateStr=$(curl "http://mywebsite.com" | grep "Last Update") 
dateStr=$(echo $updateStr | sed -e 's/.*Last Update: \([^<]*\)<.*/\1/') 
update=$(date -d "$dateStr" +%s | tr -d '\r') 
epoch=$(date -d "3 days ago" +%s | tr -d '\r') 
echo "Last Update: $update" 
echo "Epoch Date: $epoch" 
test "$update" -ge "$epoch" && echo "PASS" || echo "FAIL" 

,這裏是結果:

$ bash -x ./check_date.sh 
++ curl http://mywebsite.com 
++ grep 'Last Update' 
    % Total % Received % Xferd Average Speed Time Time  Time Current 
           Dload Upload Total Spent Left Speed 
100 6542 100 6542 0  0 17398  0 --:--:-- --:--:-- --:--:-- 19704 
+ updateStr='    <span style="float:right">Last Update: 10/6/2011 2: 
'0:02 AM</span></p> 
++ echo '<span' 'style="float:right">Last' Update: 10/6/2011 2:40:02 'AM</span>< 
'p> 
++ sed -e 's/.*Last Update: \([^<]*\)<.*/\1/' 
' dateStr='10/6/2011 2:40:02 AM 
' +%ste -d '10/6/2011 2:40:02 AM 
++ tr -d '\r' 
+ update=$'1317886802\r' 
++ date -d '-3 days ago' +%s 
++ tr -d '\r' 
+ epoch=$'1318184767\r' 
' echo 'Last Update: 1317886802 
Last Update: 1317886802 
' echo 'Epoch Date: 1318184767 
Epoch Date: 1318184767 
+ test $'1317886802\r' -ge $'1318184767\r' 
: integer expression expected: 1317886802 
+ echo FAIL 
FAIL 
+1

你可以顯示'echo $ dateStr'中的內容嗎? –

+0

你可以在你的#!/ bin/bash中添加-x,以便在每個命令運行時打印出來嗎? – frankc

+0

@frankc:查看更新的問題。 –

回答

3

回車可能是你的腳本本身。嘗試在腳本上運行dos2unix

+0

這個伎倆!我會盡力獎賞賞金。 –

+0

我如何在腳本中運行dos2unix?我正在使用這個腳本http://www.fmwconcepts.com/imagemagick/textcleaner/並得到這個錯誤。 –

+0

我在cygwin終端dos2unix文件名上運行該命令,但仍顯示其預期消息的整數表達式 –

2

試試這個:

update=$(date -d "$dateStr" +%s | tr -d '\r') 
epoch=$(date -d "-3 days ago" +%s | tr -d '\r') 

將在每個號碼的最後擺脫回車的,這可能會有所幫助。

+0

嗯......由於某種原因,似乎沒有剝離回車的數字,所以我仍然得到相同的錯誤。 –

+0

它是Gnu'tr'嗎?這似乎在我的系統上工作。檢查你的手冊,我猜。你也可以嘗試輸入C-v C-m來在你的命令行中放置一個實際的回車字符,但是如果在腳本內部這樣做會很麻煩。 –

+0

我猜它與使用Cygwin有關。 –

0

bash從上下文(在這種情況下'\ r'的存在)確定這些是字符串而不是整數。 '-ge'二元運算符期望整數參數,所以它會拋出一個錯誤。 Tom Zych的建議將起作用,以及使用字符串比較運算符,如'<'或'>',如果字符串出於某種原因格式不正確,可能會產生意想不到的結果。我不知道是否有辦法迫使日期輸出爲整數或不...

參考文獻:

http://tldp.org/LDP/abs/html/untyped.html

http://tldp.org/LDP/abs/html/comparison-ops.html

+0

你知道湯姆的解決方案爲什麼不去除'\ r'字符嗎?我似乎無法解決這個問題... –