Shell скрипт, сравнивающий даты - PullRequest
2 голосов
/ 04 октября 2011

Я работаю над сценарием оболочки, который удаляет дату с веб-страницы, а затем проверяет, находится ли она в последние три дня текущей даты (запустив ее в Cygwin).Если тест пройден, он просто повторяет «PASS», а если он не проходит, он повторяет «FAIL»;

Однако, когда я запускаю свой скрипт, я получаю следующее:

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 ]

3 голосов
/ 06 октября 2011

Возврат каретки может быть в вашем скрипте. Попробуйте запустить dos2unix в вашем скрипте.

2 голосов
/ 04 октября 2011

Попробуйте это:

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

Это избавит от возврата каретки в конце каждого номера, что может помочь.

0 голосов
/ 04 октября 2011

bash определяет из контекста (в данном случае наличие \ r), что это строки, а не целые числа. Двоичный оператор '-ge' ожидает целочисленные аргументы и выдает ошибку. Предложение Тома Зича будет работать, а также использовать операторы сравнения строк, такие как «<» или «>», которые могут дать неожиданные результаты, если строка по какой-то причине будет плохо отформатирована. Я не уверен, есть ли способ заставить дату выводить как целое число или нет ...

Ссылки:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...