我正在开发一个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
答案 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;',如果由于某种原因字符串格式错误,可能会产生意外结果。我不确定是否有办法强制日期输出为整数或不...
参考文献: