Shell脚本比较日期

时间:2011-10-03 21:46:34

标签: bash shell unix cygwin

我正在开发一个shell脚本,用于从网页上删除日期,然后检查它是否在当前日期的最后三天(在Cygwin中运行)。如果测试通过,它只是回应“通过”,如果它失败,它回应“失败”;

然而,当我运行我的脚本时,我得到以下内容:

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

3 个答案:

答案 0 :(得分:3)

回车可能在您的脚本本身。尝试在脚本上运行dos2unix

答案 1 :(得分:2)

试试这个:

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

这将消除每个数字末尾的回车,这可能会有所帮助。

答案 2 :(得分:0)

bash是根据上下文(在这种情况下是'\ r')的存在来确定这些是字符串而不是整数。 '-ge'二元运算符需要整数参数,因此它会引发错误。 Tom Zych的建议将起作用,以及使用字符串比较运算符,例如'&lt;'或'&gt;',如果由于某种原因字符串格式错误,可能会产生意外结果。我不确定是否有办法强制日期输出为整数或不...

参考文献:

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

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

相关问题