2011-10-03 427 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'字符吗?我似乎无法解决这个问题... –