LINUX.ORG.RU

РЕШЕНО Не работает скрипт, сравнивающий значения

 , ,


1

0

Есть скрипт на bash, который должен сравнивать значения получаемые с сайта, вот собственно он сам:

example=$(cat ~/example) 
curl somesite.com > ~/match
match=$(cat ~/match)

if [[ "$example" == "$match" ]]
then 
echo match!
else
echo not match...
fi
В файле example лежит тоже самое значение что и в файле match. Почему-то сначала все работает, показывает что значения равны, но если запустить скрипт еще раз - не совподают. Сам проверил - все одинаково, ЧЯДНТ?

Решение: использовать diff -w



Последнее исправление: RedMaun (всего исправлений: 1)

Может лучше diff для этого использовать? Вдруг ты там курлом пару гиг тянешь

anonymous
()
Ответ на: комментарий от anonymous

Я проверил diff'ом, сначала опять же были идентичны, потом курлом обновил один файл - сказал что отличаются, потом опять скачал курлом и записал в тот же файл - опять идентичны, мистика.

RedMaun
() автор топика

Он мне показывает одни и те же строчки и говорит, что они отличаются

RedMaun
() автор топика
Ответ на: комментарий от shdown

Выхлоп от cmp: example match различаются: байт 43099, строка 976 равен 320 M-P 321 M-Q, возможно проблема в сайте?

RedMaun
() автор топика

Тебе под страхом смерти запретили разглашать адрес страницы, которую ты сравниваешь?

WitcherGeralt ★★
()

bash
==

И в треде никто не написал про это. ЛОР, куда ты катишься? Специально для вас, по многочисленным заявкам, тыц.

Подсказка для автора, посмотри что в переменных.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)

Завязывайте с example=$(cat ~/example), до добра такой стиль не доведёт. если надо сравнивать файлы - используйте программу для сравнения файлов.

if cmp ~/example <(curl somesite.com);
then
  echo match!
else
  echo not match...
fi
legolegs ★★★★★
()

Зачем хранить все содержимое страницы? Можно же хранить хеш.

Сайт может динамически что-то менять. Сохрани результат в случае если они отличаются и посмотри diff глазами.

Tanger ★★★★★
()
Ответ на: комментарий от das_tier

А там точно строки? Может у него страничка цифры отдаёт.

peregrine ★★★★★
()
Ответ на: комментарий от legolegs

Завязывайте с example=$(cat ~/example), до добра такой стиль не доведёт. если надо сравнивать файлы - используйте программу для сравнения файлов.

Ну иногда таки надо сравнивать содержимое файла и сформированное значение в переменной, скажем чтобы вначале сравнить и только если изменилось, то изменить файл. У меня была такая задача. Но да, у example=$(cat ~/example) есть неприятная особенность — последний <CR> неопределен, есть ли, нет ли - в переменной его не будет. Так что для себя я сделал такую функцию:

read_file_into_var() {
        IFS= read -r -d '' $1 < "$2"
}
Удобство read тут ещё в том, что $1 превращает в косвенное имя, то есть функция вызывается с именем переменной и не надо извращаться с глобальными переменными или eval. И заметьте - никакого fork-а тут нет, в отличии от cmp/cat.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 3)

Возможно, разница в символах конца строки.

Попробуй так:

diff --strip-trailing-cr ... 

Если тебе не важно содержимое побайтово, а только сами значения (текст), то можно проверять вообще без пробельных символов:

diff -w ...

E ★★★
()
Последнее исправление: E (всего исправлений: 2)
Ответ на: комментарий от vodz

Ну иногда таки надо сравнивать содержимое файла и сформированное значение в переменной

Всякое бывает, да. Но тут человек целую веб-страницу в переменную засовывает, это как-то… некрасиво, имхо. Ну и я вот зная, что $() и ` ` как-то по-разному ведут себя с whitespace и мне лениво всё это помнить в подробностях и я, не стесняясь fork+exec, вызываю юниксовые утилиты. Иногда колеблюсь, когда получаются сотни запусков в секунду (как недавно было с find -exec sh -c "..." \; по потом думаю - да и чёрт с ним).

А иногда я тупо тяну файлы в скрипт как есть, используя bash как примитивный шаблонизатор:

cat <<heredoc
    <span class="price stroke">$(<price)</span>
    <span class="price discount">$(<discount)</span>
heredoc

read_file_into_var() {

Оно у вас не сможет обработать выхлоп того-же curl. Я бы перенаправление выкинул, но это я.

legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 1)
Ответ на: комментарий от legolegs

Всякое бывает, да. Но тут человек целую веб-страницу в переменную засовывает, это как-то… некрасиво, имхо.

Вот моё всякое оно самое и есть — целая страница. Для современности мегабайт туда, мегабайт сюда — фигня война.

как-то по-разному ведут себя с whitespace и мне лениво всё это помнить в подробностях

Для html это важно, например, <img src=1><img src=2> и тоже самое через пробел/enter — совсем разный результат. Потому пара моих шаблонов не содержат последнего CR.

Оно у вас не сможет обработать выхлоп того-же curl.

Оно делает ровно то, что написано :)

Я бы перенаправление выкинул

Чтобы везде в огромном неинтерактивном скрипте писать перенаправление при каждом вызове только для того, чтобы функция могла читать из stdin? Да ну нафиг. :)

vodz ★★★★★
()
Ответ на: комментарий от legolegs

Оно у вас не сможет обработать выхлоп того-же curl. Я бы перенаправление выкинул, но это я.

Оно в любом случае не сможет, т.к. пайп — это subshell и то, что read в нём прочитает, в родительском шелле видно не будет.

unterwulf
()
Ответ на: комментарий от unterwulf

Оно в любом случае не сможет, т.к. пайп — это subshell

Не обязательно, в баше ведь есть Process Substitution prog1 < <(prog2)

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

в баше ведь есть Process Substitution

Да, действительно. У меня просто /bin/sh головного мозга.

unterwulf
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.